$ 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:
/!\ 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
$ 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
$ vim /etc/docker/daemon.json
{
"insecure-registries" : ["10.0.3.221:5000"]
}
$ sudo service docker restart
/!\ 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
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
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 ...
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.
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
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
Tous les objets non utilisés, sans confirmations:
$ docker system prune -af --volumes
Ou:
$ docker image prune
$ docker volume prune
$ docker container prune
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
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
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
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"
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