Docker

Sommaire

  • Docker, c'est quoi?
  • Créer un container (disons pour ROS)
  • Utiliser un container

Docker, c'est quoi?

Une machine virtuelle?

VM

Docker

En pratique

VirtualBox Docker
Démarrage  ~ 1 min ~ 0.3 sec
Mémoire ~ 256 Mo ~ 1 Mo
Espace disque ~ 1 Go ~ 100 Ko

Docker:

VM:

Léger

Rapide

Possibilité de faire du réseau

Sécurité

Environment atypique

Un processus qui ment?

Non, c'est un container

set -eux
wget bit.ly/fish-container -O fish.tar

mkdir container-root
cd container-root
tar -xf ../fish.tar
uuid="cgroup_$(shuf -i 1000-2000 -n 1)"
cgcreate -g "cpu,cpuacct,memory:$uuid"
cgset -r cpu.shares=512 "$uuid"
cgset -r memory.limit_in_bytes=1000000000 "$uuid"
cgexec -g "cpu,cpuacct,memory:$uuid" \
    unshare -fmuipn --mount-proc \
    chroot "$PWD" \
    /bin/sh -c "/bin/mount -t proc proc /proc && hostname container-fun-times && /usr/bin/fish"

Container

Un Processus isolé donc sans visions sur les autres applications ou fichiers

Simple à installer

Élimine les problèmes d'environnement

Migration plus faciles

Pourquoi?

Un moyen facile d'utiliser des containers

Docker Git
Image état sauvegardé Commit
Container execution locale Checkout
Repository collection de commits Repository
Docker Hub server populaire GitHub

L'histoire de Docker

  • dotCloud projet révélé à la PyCon 2013 
  • Depuis:
    • 100 million Docker Engine téléchargées
    • 45,000 applications "Dockerizés" dans Docker Hub
    • 720+  contributeurs
    • 18,000+ étoiles sur GitHub
  • dotCloud change de nom pour  Docker

1.0 deployée en Juin 2014

Installer Docker

  • Installer le package:
    • sudo apt install docker.io
  • Ajouter son utilisateur au groupe docker:
    • sudo groupadd docker
    • sudo usermod -aG docker $USER
  • Redémarrer sa session

Créer une image (disons pour ROS)

Dockerfile

Comment créer un dockerfile?

Créer un fichier nommé Dockerfile

Le fichier qui contient les instructions de création d'une image

Le quoi???

Dockerfile

FROM:

FROM {base}:{version}

Permet de choisir une base pour l'image

FROM dungpb/dira_ros:ros

Dockerfile

Où trouver les bases?

Docker hub

Dockerfile

RUN:

RUN {commande}

Permet de lancer une commande dans l'image lors de sa création

RUN apt-get update && apt-get -y install ros-melodic-husky-simulator

Dockerfile

COPY:

COPY {origine} {destination}

Permet de copier des dossiers de la machine hote vers l'image

COPY ./catkin_ws /catkin_ws

Dockerfile

ADD:

ADD {origine} {destination}

Permet de copier un fichier de la machine hote vers l'image

ADD ./startup.sh /catkin_ws/startup.sh

Dockerfile

VOLUME:

VOLUME {dossier}

Permet de partager un dossier entre l'hote et  l'image

VOLUME /myvol

Dockerfile

ADD, COPY, VOLUME, quelle difference?

ADD

COPY

VOLUME

Ajoute la copie d'un fichier

Ajoute la copie  d'un dossier

Partage le dossier

Une modification du fichier ne modifiera pas le fichier d'image

Une modification du fichier change le fichier de l'image

Dockerfile

WORKDIR:

WORKDIR {dossier}

Permet de changer le répertoire courant de l'image

WORKDIR /catkin_ws/

Dockerfile

CMD:

CMD {commande}

Permet de lancer une commande au démarrage de l'image

CMD ./startup.sh

Dockerfile

EXPOSE:

EXPOSE {port}

Permet de lier un port du conteneur avec la machine hote

EXPOSE 3000

Dockerfile

Créer un Dockerfile pour ROS

  1. Trouver une base
  2. Copier notre dossier catkin_ws
  3. Installer ros-${ROS_DISTRO}-image-transport-plugins
  4. Ajouter les configuratons dans le fichier ~/.bashrc
  5. Make le projet
  6. Lancer ROS

Dockerfile

Trouver une base

FROM dungpb/dira_ros:latest

Dockerfile

Copier notre dossier catkin_ws

COPY ./catkin_ws /catkin_ws

Dockerfile

Installer ros-${ROS_DISTRO}-image-transport-plugins

RUN apt-get update && apt-get -y install ros-${ROS_DISTRO}-image-transport-plugins

Dockerfile

Ajouter les configuratons dans le fichier ~/.bashrc

RUN echo "export ROS_HOSTNAME=localhost" >> $HOME/.bashrc
RUN echo "export ROS_MASTER_URI=http://localhost:11311" >> $HOME/.bashrc

Dockerfile

Make le projet

WORKDIR /catkin_ws/
RUN /bin/bash -c '. /opt/ros/melodic/setup.bash; catkin_make'

Dockerfile

Lancer ROS

ADD ./startup.sh /catkin_ws/startup.sh
CMD ./startup.sh

Utiliser une image

BUILD:

BUILD {dossier}

Permet de contruire une image

docker build .

Donner un nom à une image

BUILD {dossier} -t {nom}

EXEC:

EXEC {container} {commande}

Lance une commande dans un container actif

docker exec -it ros bash

RUN:

RUN {image} {commande}

Lance une commande dans un container

docker run -it ros bash

Autres manières d'utiliser la commande docker run

Commande Description
docker run -it affiche des informations sur les processus (Full)
docker run -v hote:container partage un volume avec le container
docker run -network=host partage tous les ports entre le container et l'hote
docker --rm stop le container a la fin de la commande

Autres manières d'utiliser la commande docker run

Commande Description
docker run -d lance le container en mode détaché
docker run -p port_hote:port_container partage un port avec le container
docker run {container} Lance le container avec la commande par défault

PS:

PS

Affiche les containers en cours d'execution

docker ps

RM:

RM {hash|image}

Permet de supprimer une image

docker rm 4efaabe7379a

Supprimer tous ses containers

  • docker stop $(docker ps -a -q)
    docker rm $(docker ps -a -q)

LOGS:

LOGS {container}

Permet de voir les logs d'un container

docker logs ros

STOP:

STOP {container}

Stop un container

docker stop ros

Merci pour votre attention

Docker

By Cyrille Coquard

Docker

  • 161