--- 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 Les procédures d'installation suivantes sont destinées à Debian 8 (Jessie) ### Manuelle ``` # 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.*