Skip to content
Snippets Groups Projects
practicalSession-2.md 5.2 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` at the root of the repository.



```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: 

`docker build -t tp-qlog .` 

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


# Lancer une instance docker de votre image

`docker run -it --name qlog-instance tp-qlog`

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/`

Aller ensuite dans le dossier qui contient le makefile et le lancer.
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.

# Modifications de l'image docker

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

`exit`

pour former votre instance Docker.

`docker rm qlog-instance`

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 alpine:3.16.2

COPY main /usr/src/qlog

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

`alpine` est un très petit Linux. Nous copions l'exécutable `main` dans le dossier `/usr/src/qlog` de l'image docker.

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: registry.gitlab.inria.fr/diverse/docker/docker-image/insa-docker:18.06
  stage: deploy
  variables:
    DOCKER_DRIVER: overlay2
    DOCKER_TLS_CERTDIR: ""
    GIT_SSL_NO_VERIFY: "1"
  rules:
    - changes:
      - "*.md"
      - "*/test/*"
      when: never
    - changes:
      - "*src/*"
      - ".gitlab-ci.yml"
      when: always
  dependencies: 
    - build-tp-docker
  services:
    - registry.gitlab.inria.fr/diverse/docker/docker-image/insa-docker:18.06-dind
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY

  script:
    - cd hello/
    - docker pull $CI_REGISTRY_IMAGE/hello:latest || true
    - docker build --cache-from $CI_REGISTRY_IMAGE/hello:latest --tag $CI_REGISTRY_IMAGE/hello:$CI_COMMIT_SHA --tag $CI_REGISTRY_IMAGE/hello:latest .
    - docker push $CI_REGISTRY_IMAGE/hello:$CI_COMMIT_SHA
    - docker push $CI_REGISTRY_IMAGE/hello:latest
```