Skip to content
Snippets Groups Projects
practicalSession-2.md 5.53 KiB
Newer Older
arnobl's avatar
up
arnobl committed

# Docker

# Installation

**YOU NEED A LINUX**


Sous Linux (Ubuntu), installer docker (`sudo apt-get install docker`), les droits
root sont nécessaires pour installer et utiliser docker). 
Sous Fedora, c’est podman (pas besoin de droits root pour utiliser podman).


# Dockerfile

Create a file `Dockerfile` **in the folder `session-1`**.
arnobl's avatar
up
arnobl committed



```docker
FROM ubuntu:22.10
arnobl's avatar
up
arnobl committed

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update 
RUN apt install --no-install-recommends -y libgtest-dev libgmock-dev lcov

ADD . /media/tp-qlog
```


Le `FROM` indique quelle image Docker de base est à utiliser. Le `RUN` exécute une commande dans l'instance docker lors de sa création (ici on installe des paquets). `ADD` permet à aux instances docker de cette image d'accéder à votre dossier courant (par défaut votre instance docker n'accède à rien de la machine hôte). Le `ENV` permet de définir une variable d'environnement.

Lancer: 

`sudo docker build -t tp-qlog .` 
arnobl's avatar
up
arnobl committed

pour créer votre image docker *tp-qlog* (n'oubliez pas le `.` après `tp-qlog` !). La commande `sudo docker image ls` permet de voir les images stockées sur votre machine.
arnobl's avatar
up
arnobl committed


# Lancer une instance docker de votre image

`sudo docker run -it --name qlog-instance tp-qlog`
arnobl's avatar
up
arnobl committed

L'option `name` donne un nom à l'instance créée.
`tp-qlog` est l'image docker à instancier.
L'option `t` permet de lancer un terminal dans l'instance.
L'option `i` permet de rendre l'instance interactive (sinon c'est un processus lancé en tâche de fond).


# Utiliser l'instance docker

Une fois lancé, votre terminal est dans l'instance docker.

`cd /media/tp-qlog/`

Lancer le fichier `compilerun.sh`.
Vous devriez avoir un message d'erreur (il ne connait pas `g++`). C'est bien la preuve qu'il n'utilise pas les ressources de votre Linux mais celles de l'instance lancée.
arnobl's avatar
up
arnobl committed

# Modifications de l'image docker

Vous allez modifier l'image docker pour y ajouter g++.

`exit`

pour former votre instance Docker.

`sudo docker rm qlog-instance`


arnobl's avatar
up
arnobl committed

pour la supprimer (on ne peut pas avoir plusieurs instances docker du même nom).

Dans le *dockerfile*, ajoutez `g++` à la ligne du `apt install` et recréez l'image. Relancez une instance et retentez de compiler.

Pour information, il est possible de partager une image docker en la déposant sur certains sites (https://hub.docker.com/, ou sur des registres d'instances Gitlab : https://gitlab.inria.fr/diverse/docker/container_registry).


# Intégration continue (CI)

Mettre en place l'intégration continue avec le gitlab de l'INSA (https://gitlab.insa-rennes.fr). Aidez-vous du document https://moodleng.insa-rennes.fr/mod/resource/view.php?id=37258.

Votre projet contient déjà un fichier de configuration pour la CI : `.gitlab-ci.yaml`

Pour brancher votre projet au runner gitlab, envoyez-moi le token de votre projet car seuls les INFO peuvent accéder aux serveurs BOO.

# Dépôts image docker sur gitlab

Comme indiqué précédemment, vous pouvez fabriquer et déposer vos images docker sur votre projet gitlab.

## Configuration

Assurez-vous que des les *settings* du projet l'option `container registry` soit activée, ce qui doit permettre l'affichage d'un menu `Packages & Registries > Container registry` à gauche.

Voici un exemple de configuration à ajouter dans le `.gitlab-ci.yaml` pour la fabrication d'images docker.

## Création d'un programme

Créer et commiter un programme `Hello World` quelconque dans un nouveau dossier `hello`. Le binaire produit à la compilation devra s'appeller `main`.


## Compiler le *Hello World* avec la CI

Regardez le fichier `.gitlab-ci.yaml` pour y ajouter une nouvelle rubrique `build-tp-docker` en vous inspirant de celle `build-gtest`.

Cette nouvelle rubrique devra se terminer par :

```yaml
artifacts:
paths:
    - hello/main
expire_in: 1 hour
```

Cela permet à cette rubrique d'exporter le résultat de la compilation, à savoir l'exécutable `main`.


## Le dockerfile du *Hello World*

Créer un dockerfile dans le dossier *hello* avec le code suivant :

```dockerfile
FROM ubuntu:22.10
arnobl's avatar
up
arnobl committed

RUN mkdir -p /usr/src/qlog
arnobl's avatar
up
arnobl committed
COPY main /usr/src/qlog

CMD ["/usr/src/qlog/main"]
```

Nous copions l'exécutable `main` dans le dossier `/usr/src/qlog` de l'image docker.
arnobl's avatar
up
arnobl committed

Créer l'image docker en utilisant les commandes docker du début.




## Créer l'image docker de *Hello World* avec la CI


```yaml
docker-tp1-qlog:
  image:
    name: gcr.io/kaniko-project/executor:v1.5.1-debug
    entrypoint: [""]
arnobl's avatar
up
arnobl committed
  stage: deploy
  dependencies:
arnobl's avatar
up
arnobl committed
    - build-tp-docker
  script:
    - mkdir -p /kaniko/.docker
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
    - /kaniko/executor --context $CI_PROJECT_DIR/hello/ --dockerfile $CI_PROJECT_DIR/hello/Dockerfile --destination $CI_REGISTRY_IMAGE/hello:latest
arnobl's avatar
up
arnobl committed
```

## Utiliser l'image créée et stockée sur Gitlab

L'étape précédent construit et stocke l'image Docker.
Vous pouvez la télécharger à partir de n'importe quel PC:

`sudo docker pull gitlab.insa-rennes.fr:5050/votrelogin/qlog/hello`

Pour connaitre le chemin de l'image, allez sur votre projet gitlab. *Container Registry* devrait lister un élément : différentes versions de votre image `hello`. Utilisez le bouton *Copy Image Path*.

Vous pouvez alors instancier cette image :

`sudo docker run -it --name hello-instance hello`


**Quels sont les intérets de créer de telles images ?**


## Nettoyage

Les images créées prennent de la place sur le Gitlab de l'INSA : 

Allez dans *Container Registry* et cliquer sur la poubelle rouge à droite pour supprimer toutes les images.