--- title: Howto Docker categories: docker --- Docker est une solution qui permet de créer, déployer et gérer en toute simplicité des conteneurs Linux. Elle combine plusieurs technologies pour rendre l'utilisation des conteneurs accessible à tous. # Docker Engine ## Installation ~~~ # apt install apt-transport-https # echo "deb http://download.docker.com/linux/debian stretch stable" > /etc/apt/sources.list.d/docker.list # curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - # apt update # apt install docker-ce ~~~ > *Note* : Pour Debian 8 : > > ~~~ > # echo "deb http://apt.dockerproject.org/repo debian-jessie main" > /etc/apt/sources.list.d/docker.list > # apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D > # apt update > # apt install docker-engine > # adduser docker > ~~~ ### Ansible Le rôle docker-host permet d'installer le docker-engine sur un hôte distant et de l'exposer à l'externe ou non. La documentation concernant l'utilisation du rôle est située dans son répertoire. #### TLS Lorsque le docker-engine est exposé, il est important de le sécuriser avec TLS. Au moment de l'installation, une version altérée de shellpki est copiée dans le répertoire docker/tls. Ensuite, les certificats et la clé sont créés pour le serveur. (`shellpki init`) Pour autoriser des hôtes à se connecter à l'engine, il faut leur créer une clé et un certificat. Pour ce faire, il suffit de lancer le script: ~~~ /home/docker/tls$ ./shellpki create ~~~ Les fichiers seront créés, par défaut, dans le répertoire `/home/docker/tls/files/$CN` ## Utilisation de base Une image Docker contient un OS avec un ou plusieurs services préconfigurés. Un conteneur quant à lui est une instance (créée à partir d'une image) en cours d'execution. ### Lister les conteneurs et les images: ~~~ $ docker ps [options] ~~~ Voici quelques options utiles pour la commande `ps` ~~~ -a : Lister tous les conteneurs -l : Lister les conteneurs récentralise -q : Lister uniquement les ID des conteneurs ~~~ ### Démarrer un conteneur ~~~ $ docker run [options] IMAGE [commande] ~~~ Options courantes: ~~~ --name="nom" : Donner un nom au conteneur -p port_hôte:port_conteneur : Rendre un port accessible depuis l'hôte -d : Lancer le conteneur en mode 'détaché' -it : Lancer le conteneur en mode intéractif avec tty ~~~ Pour plus d'options, consulter `$ man docker run` ### Éteindre ou tuer un conteneur ~~~ $ docker stop|kill [options] CONTENEUR ~~~ CONTENEUR correspond au nom ou à l'ID du conteneur. Lorsque le conteneur n'est plus en fonction, il existe toujours et peut être lister à l'aide de la commande `$ docker ps -a` ### Supprimer un conteneur ou une image ~~~ $ docker rm [options] CONTENEUR ou $ docker rmi [options] IMAGE ~~~ ### Exécuter des commandes au sein d'un conteneur en marche ~~~ $ docker exec [options] CONTENEUR COMMANDE ~~~ Options courante: ~~~ -it : Lancer la commande de manière intéractive dans un TTY. ~~~ ### Visionner les logs d'un conteneur ~~~ $ docker logs [options] CONTENEUR ~~~ Option: ~~~ -f : Suivre les logs en direct ~~~ ### Se connecter à un conteneur en marche S'il est nécessaire d'intéragir directement avec un process lancé dans un conteneur, il faut utiliser la commande `attach`. Dans le cas où l'on souhaite simplement visionner la sortie (logs) du conteneur, il faut utiliser `logs`. Pour lancer un terminal ou une commande supplémmentaire, utiliser `exec`. ~~~ docker attach [options] CONTENEUR ~~~ **ATTENTION!!!** Lorsque le conteneur est attaché, l'utilisation de *CTRL+C* termine le processus en cours. La commande *CTRL+P+Q* doit être utilisé ou l'on doit ajouter l'option `--sig-proxy=false` lors du lancement ou de l'attachement. ### Astuces Éteindre/Tuer/Supprimer tous les conteneurs: ~~~ $ docker stop|kill|rm $(docker ps -aq) ~~~ Supprimer toutes les images: ~~~ $ docker rmi $(docker images -q) ~~~ Lancer un terminal bash dans un conteneur en marche: ~~~ $ docker exec -it CONTENEUR bash ~~~ Démarrer un conteneur avec un terminal bash: ~~~ $ docker run -it IMAGE bash ~~~ ### Dépannage #### Problème de connectivité à l'intérieur des conteneurs Solution: Redémarrer le service docker #### Espace insuffisant lors d'un build Solutions: - Vérifier que le "build context" n'est pas trop grand. - Modifier la variable d'environnement DOCKER_TMPDIR . - Créer un fichier .dockerignore pour exclure des fichiers et répertoires du "build context" *Build context: Tout ce qui se trouve à la racine du Dockerfile.* ## Dockerfile Exemple : ~~~ FROM debian:stretch MAINTAINER John Doe ENV DEBIAN_FRONTEND noninteractive RUN (apt-get update && apt-get upgrade -y -q && apt-get dist-upgrade -y -q && apt-get -y -q autoclean && apt-get -y -q autoremove) RUN apt-get install -y -q mariadb-server EXPOSE 3306 CMD ["mysqld"] ~~~ ~~~ # ls Dockerfile # docker build -t mariadb . # docker images REPOSITORY TAG IMAGE ID CREATED SIZE mariadb latest 4bea99cda08c 8 minutes ago 470MB debian stretch 5b712ae16dd7 3 days ago 100MB ~~~