Skip to content

Latest commit

 

History

History
311 lines (168 loc) · 6.85 KB

note_2016-02-11_12-57-29_memo-docker.md

File metadata and controls

311 lines (168 loc) · 6.85 KB

Memo sur le fonctionnement de docker

Better docker ps

$ cd /tmp && wget https://github.com/moncho/dry/releases/download/v0.9-beta.3/dry-linux-amd64
$ sudo mv dry-linux-amd64 /usr/local/bin/dry
$ chmod +x /usr/local/bin/dry

Installation

Installation:

/!\ Procédure changeante, voir sur le site de docker-ce

$ curl -fsSL get.docker.com | sh

...

# s'ajouter au groupe docker pour se passer de sudo
$ usermod -aG docker remipassmoilesel
$ docker run hello-world

En cas d'erreur de démarrage du daemon:

$ cat /var/log/syslog

....
[dockerd] ...  level=error msg="[graphdriver] prior storage driver aufs failed: driver not supported"

$ sudo rm -rf /var/lib/docker/aufs
$ sudo systemctl start docker

Essayer plusieurs démarrages si nécéssaire.

Installer Docker Compose:

$ sudo pip install docker-compose 

# ou

# Vérifier la version  nécessaire sur: https://github.com/docker/compose/releases

$ export dockerComposeVersion=2.1
$ curl -L https://github.com/docker/compose/releases/download/$dockerComposeVersion/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

Pousser une image vers un repository

$ docker build -t image-name:1.0.0 . 

# associer une image avec un repo
$ docker tag image-name:tag repository.com:5000/image-name:1.0.0
  
$ docker push repository.com:5000/image-name:1.0.0 

Utiliser un repository avec certificat autosigné

$ vim /etc/docker/daemon.json

{
  "insecure-registries" : ["10.0.3.221:5000"]
}	

$ sudo service docker restart

Commandes générales

/!\ Les arguments sont (souvent) ordonnés !

Inspecter un volume:

$ docker volume inspect volume-media 

Afficher des stats en temps réel:

$ docker stats

Lancer un conteneur et obtenir un terminal

$ docker run -ti ubuntu

Relancer un conteneur arrêté:

$ docker exec -ti container_name bash

Lister les images disponibles

$ docker images 

Stopper un conteneur

$ docker stop id

Supprimer un conteneur

$ docker rmi id_image

Commit et export

Lister les modifications d'une image

$ docker diff $id

Enregistrer les modifications d'un conteneur (! id: conteneur, pas image)

$ docker commit $id image_ubuntu_modifie

Exporter une image

$ docker save image_ubuntu_modifie > /path/to/archive.tar

Réseau

Lancer un conteneur daemon et lier un port (hote: 8080 / ctr: 80)

$ docker run -d -p 127.0.0.1:8080:80 -p 443:443 image_ubuntu_modifie
# En cas d'erreur d'ecoute, préciser l'adresse

Lancer un conteneur et lier un dossier (host:ctr)

$ docker -v /var/www:/var/www

Récupérer l'adresse IP d'un conteneur:

$ docker inspect --format '{{ .NetworkSettings.IPAddress  }}' containerid

Partager la stack réseau de l'hôte:

$ docker run --net host ...

Connexion sur l'hôte perdue au démarrage d'un conteneur

Si le conteneur se connecte au bridge par défaut (sans network spécifique) et que la connexion vers l'hôte est perdue, c'est peut-être que docker travaille sur un CIDR qui entre en conflit avec le réseau de l'hôte.

Pour changer le CIDR de Docker:

$ sudo vim /etc/docker/daemon.json

{
    	"fixed-cidr": "172.16.0.0/16"
}

$ sudo systemctl restart docker

Cette configuration ne concerne que le bridge par défaut de Docker. Avec Docker Compose, il faut spécifier une configuration réseau ou utiliser explicitement le bridge par défaut:

service_name:
	network_mode: bridge

Nécéssite de supprimer tous les anciens conteneurs ainsi que tous les anciens réseaux.

$ docker network rm $(docker network ls -q)
$ docker rm $(docker ps -aq)

Peut nécéssiter un redémarrage de l'hôte.

Options de démarrage

Passer une variable d'environnement:

$ docker run -d \
    --name rabbitmq \
    -p 5672:5672 \
    -e RABBITMQ_USERNAME=myusername \
    -e RABBITMQ_PASSWORD=mypassword \
    frodenas/rabbitmq

Démarrer une image et lui passer toutes les variables du système:

$ docker run -p 80:80 --env-file <(sed -e 's/^/HOST_VAR_/' <(env)) node-sample

Surcharge de point d'entrée

$ docker run -ti --entrypoint /bin/bash docker-djoe

Avec paramètres (ls -l):

$ docker run --entrypoint ls alpine -l

Démarrage d'applications avec le système

Préferer l'utilisation d'une politique de redémarrage:

$ docker run --restart="always" <IMAGE>

Ou utiliser systemd:

# Nommer le conteneur pour pouvoir l'arrêter
# Penser à supprimer le conteneur avant de le relancer

$ vim /etc/systemd/system/docker-djoe.service

[Unit]
Description=Djoe Docker image

[Service]
ExecStartPre=-/usr/bin/docker rm heydjoe-container
ExecStart=/usr/bin/docker run -d -p 20443:443 -p 20080:80 -p 20022:22 -p 29001:9001 -p 27070:7070 -p 29090:9090 -p 23000:3000 --name heydjoe-container heydjoe
ExecStop=/usr/bin/docker stop -t 2 heydjoe-container


[Install]
WantedBy=default.target

Nettoyage

Tous les objets non utilisés, sans confirmations:

$ docker system prune -af --volumes

Ou:

$ docker image prune
$ docker volume prune
$ docker container prune

Dockerfiles

Changer de dossier de travail:

WORKDIR /app

Créer une clef GPG sans prompt:

RUN bash -c "echo -e 'Key-Type: 1\nKey-Length: 2048\nSubkey-Type: 1\nSubkey-Length: 4096\nName-Real: root-user\nExpire-Date: 0' > /tmp/gpg-gen-key-informations"
RUN gpg --gen-key --batch /tmp/gpg-gen-key-informations

Ajouter un hôte dans les known hosts:

RUN mkdir -p ~/.ssh/
RUN ssh-keyscan gitlab.bbuzcloud.com >> ~/.ssh/known_hosts
RUN chown -R user:user ~

Obtenir l'adresse IP de l'hôte à partir d'un conteneur:

$ /sbin/ip route|awk '/default/ { print $3 }'

Lancer un script à partir d'un Dockerfile. "sync" permet d'éviter des erreurs

$ RUN chmod +x script.sh && sync && ./script.sh

Utiliser Docker dans un conteneur

Lancer un conteneur avec un socket monté:

$ docker run -ti -v /var/run/docker.sock:/var/run/docker.sock ubuntu:bionic

Installer docker puis:

$ docker ps

Utiliser Docker avec le transport TCP (de manière temporaire)

Arrêter éventuellement le daemon courant et le relancer avec la commande:

$ sudo systemctl stop docker.service
$ sudo dockerd -H tcp://0.0.0.0 

Coté client, définir les variables appropriées:

$ export DOCKER_HOST=tcp://192.168.XX.XX:2375
$ docker ps

Build

Commande build standard:

$ docker build ./path -t image_name:tag

Build avec arguments:

$ docker build . -t image --build-arg arg_name="value"

Dockerfile:

ARG arg_name="defautl_value"

Forcer la zone temporelle (timezone) d'un conteneur Ubuntu

Par exemple pour des tests en CI:

RUN locale-gen fr_FR.UTF-8
ENV LANGUAGE="fr_FR.UTF-8"
ENV LC_ALL="fr_FR.UTF-8"
ENV LANG="fr_FR.UTF-8"

# Here we force timezone for tests
ENV TZ=Europe/Paris
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
    	&& echo $TZ > /etc/timezone \
    	&& echo "Europe/Paris" > /etc/timezone