====== Docker ======
===== Doc =====
* [[https://docs.docker.com/engine/getstarted/|Officielle]]
===== Driver de stockage =====
* [[https://docs.docker.com/engine/userguide/storagedriver/selectadriver/|Choisir son driver]]
* [[https://docs.docker.com/engine/userguide/storagedriver/aufs-driver/|Aufs]]
* [[https://docs.docker.com/engine/userguide/storagedriver/btrfs-driver/|BTRFS]]
* [[https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/|Device mapper]]
* [[https://docs.docker.com/engine/userguide/storagedriver/overlayfs-driver/|OverlayFS]]
===== Dockerfile =====
* [[https://docs.docker.com/engine/reference/builder/|Syntaxe d'un fichier Dockerfile]]
* [[https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/|Best Practices]]
===== docker-compose =====
* [[https://docs.docker.com/compose/compose-file/|Syntaxe d'un fichier Docker compose]]
* [[https://docs.docker.com/compose/|Info + exemples]]
* [[https://docs.docker.com/compose/completion/|Completion]]
* [[https://docs.docker.com/compose/startup-order/|Ordre de démarage]]
===== Systemd =====
* [[https://docs.docker.com/engine/admin/host_integration/#/systemd|Automatiquement lancer ses conteneur au démarrage de l'OS]]
* [[https://docs.docker.com/engine/admin/systemd/|Options dockerd]]
===== Sécurité =====
* [[https://docs.docker.com/engine/security/security/|Sécurité]]
* [[https://docs.docker.com/engine/reference/run/#/security-configuration|Paramétre de sécurité dans docker run]]
* [[https://docs.docker.com/engine/security/https/|Chiffrement]]
* [[https://docs.docker.com/engine/security/apparmor/|AppArmor]]
Activation namespace user pour remappinf des uid entre le conteneur et la machine hôte avec : **userns-remap** :
* https://resinfo.org/IMG/pdf/secu-docker.pdf
* https://resourcepool.io/fr/2016/09/09/francais-le-user-namespace-dans-docker/
===== Plugins =====
* [[https://docs.docker.com/engine/extend/legacy_plugins/|Plugins pour les volumes ou le réseau]]
===== API =====
* [[https://docs.docker.com/engine/reference/api/docker_remote_api/|Remote API]]
===== Autres =====
* [[https://docs.docker.com/engine/admin/using_supervisord/|Lancer plusieurs process docker dans un même conteneur avec Supervisor]]
* [[https://docs.docker.com/engine/admin/live-restore/|Garder ses conteneurs en vie si dockerd tombe]]
* [[https://docs.docker.com/engine/admin/formatting/|Format d'affichage]]
* [[https://docs.docker.com/engine/admin/logging/overview/|Options de logging]]
* [[https://docs.docker.com/engine/reference/run/#/exit-status|Exit status code]]
* [[https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/|Link]]
===== Commandes docker =====
[[https://docs.docker.com/engine/reference/commandline/|Toutes les commandes]]
==== docker run ====
[[https://docs.docker.com/engine/reference/commandline/run/|Crée et démarre un conteneur à partir d'une image]] :
Utilisation avancée de [[https://docs.docker.com/engine/reference/run/|docker run]].
Options intéressantes :
* **--name** : donne un nom au conteneur
* **--rm** : efface le contener quand il se termine
* **-it** : mode intéractif (-i) avec pseudo TTY --t)
* **-d** / **--detach** : Lance le conteneur en backgroud
* **--read-only** : monte le contener en RO
* **-v** / **--volume** : Map un volume
* **-p** / **--publish** : Map un port
* **-P** / **--publish-all** : Map l’ensemble des ports de façon aléatoire
* **--expose** : Expose le port d'un conteneur (pour un link par exemple)
**__Exemples :__**
$ docker run --rm -v /home/gigix:/foo:ro -w /foo -i -p 127.0.0.1:80:8080 -t ubuntu bash
$ docker run -itd --network=my-net --ip=10.10.9.75 busybox
$ docker run --device=/dev/sdc:/dev/xvdc --device=/dev/sdd --device=/dev/zero:/dev/nulo -i -t ubuntu ls -l /dev/{xvdc,sdd,nulo}
$ docker run --restart=always redis
Copie la configuration des volumes d'un conteneur à l'autre :
$ docker create -v /dbdata --name dbstore training/postgres /bin/true
$ docker run -d --volumes-from dbstore --name db1 training/postgres
$ docker run -d --volumes-from dbstore --name db2 training/postgres
Link ce conteneur avec db (''--link id[:alias]'') :
$ docker run -t -i --rm --link db:db training/webapp /bin/bash
==== docker create ====
[[https://docs.docker.com/engine/reference/commandline/create/|Crée un nouveau conteneur à partir d'une image sans le démarrer]] :
Similaire à docker [[#run]] sauf qu'il ne démarre pas le conteneur.
$ docker create -t -i fedora bash
==== docker attach ====
[[https://docs.docker.com/engine/reference/commandline/attach/|Interagit avec le processus du conteneur]] :
Pratique si un prompt se présente afin d'y répondre.
Pour se détacher => ''CTRL-p CTRL-q'' (on peut le changer avec l'option ''--detach-keys'').
$ docker attach 2d5e8999b138
==== docker images ====
[[https://docs.docker.com/engine/reference/commandline/images/|Liste les images]] :
$ docker images --no-trunc
docker rmi $(docker images -f "dangling=true" -q)
$ docker images --digests
==== docker diff ====
[[https://docs.docker.com/engine/reference/commandline/diff/|Affiche les différences entre le conteneur et son image]] :
$ docker diff 2d5e8999b138
* **A** : Add
* **D** : Delete
* **C** : Change
==== docker history ====
[[https://docs.docker.com/engine/reference/commandline/history/|Affiche l'historique d'une image]] :
$ docker history gigi206/test:v1
==== docker tag ====
[[https://docs.docker.com/engine/reference/commandline/tag/|Tag une image]] :
$ docker tag 0e5574283393 fedora/httpd:version1.0
$ docker tag httpd fedora/httpd:version1.0
==== docker rename ====
[[https://docs.docker.com/engine/reference/commandline/rename/|Renomme un conteneur]] :
$ docker rename 2d5e8999b138 myconteneur_V1
==== docker exec ====
[[https://docs.docker.com/engine/reference/commandline/exec/|Lance une commande dans un conteneur]] :
$ docker exec -it bf283346cee9 bash
==== docker cp ====
[[https://docs.docker.com/engine/reference/commandline/cp/|Copie un fichier dans ou hors du conteneur]] :
docker cp foo.txt mycontainer:/foo.txt
docker cp mycontainer:/foo.txt foo.txt
Une autre méthode pour décompresser un tar dans le ''/tmp'' du conteneur :
$ cat Docker.tgz | docker exec -i 2d5e8999b138 tar xzf - -C /tmp
==== docker events ====
[[https://docs.docker.com/engine/reference/commandline/events/|Affiche le journal d'évenement de docker]] :
$ docker events --since '2016-10-22' --filter 'container=b6a2bd1f6ea8' --filter 'event=stop'
==== docker login ====
[[https://docs.docker.com/engine/reference/commandline/login/|Se connecter au docker hub]] :
$ docker login
$ docker login localhost:8080
Cela crée le fichier ''$HOME/.docker/config.json''.
==== docker logout ====
[[https://docs.docker.com/engine/reference/commandline/logout/|Se déconnecter du docker hub]] :
$ docker logout localhost:8080
==== docker pull ====
[[https://docs.docker.com/engine/reference/commandline/pull/|Télécharge une image docker]] :
$ docker pull debian:jessie
$ docker pull ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2
docker pull myregistry.local:5000/testing/test-image
docker pull --all-tags fedora
==== docker push ====
[[https://docs.docker.com/engine/reference/commandline/push/|Envoye une image sur le hub]] :
$ docker push gigi206/test:v1
==== docker search ====
[[https://docs.docker.com/engine/reference/commandline/search/|Recherche une image]] :
$ docker search --filter "stars=3" --filter "is-automated=true" --no-trunc --limit 5 debian
$ docker search --filter "is-official=true" debian
==== docker rmi ====
[[https://docs.docker.com/engine/reference/commandline/rmi/|Supprime une image]] :
$ docker rmi localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0
$ docker rmi -f fd484f19954f
$ docker rmi test
==== docker rm ====
[[https://docs.docker.com/engine/reference/commandline/rm/|Supprime un conteneur]] :
Supprime tous les conteneurs stoppés :
$ docker rm $(docker ps -a -q)
Supprime le lien entre webapp et redis :
$ docker rm --link /webapp/redis
Supprime le conteneur redis et ses volumes associés:
$ docker rm -v redis
==== docker ps ====
[[https://docs.docker.com/engine/reference/commandline/ps/|Liste les conteneurs]] :
* **-f**, **--filter value** : Filter output based on conditions provided (default [])
* **exited=** an exit code of
* **label=** or label==
* **status=**(created|restarting|running|paused|exited)
* **name=** a container's name
* **id=** a container's ID
* **before=**(|)
* **since=**(|)
* **ancestor=**([:tag]||)
containers created from an image or a descendant.
* **--format** : Pretty-print containers using a Go template
* **.ID** : Container ID
* **.Image** : Image ID
* **.Command** : Quoted command
* **.CreatedAt** : Time when the container was created.
* **.RunningFor** : Elapsed time since the container was started.
* **.Ports** : Exposed ports.
* **.Status** : Container status.
* **.Size** : Container disk size.
* **.Names** : Container names.
* **.Labels** : All labels assigned to the container.
* **.Label** : Value of a specific label for this container. For example '{{.Label "com.docker.swarm.cpu"}}'
* **.Mounts** : Names of the volumes mounted in this container.
$ docker ps -a --filter 'exited=137'
$ docker ps --format "table {{.ID}}\t{{.Labels}}"
==== docker logs ====
[[https://docs.docker.com/engine/reference/commandline/logs/|Affiche la sortie du conteneur]] :
$ docker logs -f d135c332e896
==== docker start ====
[[https://docs.docker.com/engine/reference/commandline/start/|Démarre un conteneur]] :
$ docker start -i d135c332e896
==== docker stop ====
[[https://docs.docker.com/engine/reference/commandline/stop/|Arrête un conteneur]] :
$ docker stop -t 30 d135c332e896
==== docker restart ====
[[https://docs.docker.com/engine/reference/commandline/restart/|Redémarre un conteneur]] :
$ docker restart -t 30 d135c332e896
==== docker kill ====
[[https://docs.docker.com/engine/reference/commandline/kill/|Envoie un signal au conteneur (Kill par défaut)]] :
$ docker kill -s TERM d135c332e896
==== docker wait ====
[[https://docs.docker.com/engine/reference/commandline/wait/|Attend jusqu'à ce que le conteneur s'arrête]] :
$ docker wait 2d5e8999b138
==== docker pause ====
[[https://docs.docker.com/engine/reference/commandline/pause/|Met en pause le conteneur]] :
$ docker pause d135c332e896
==== docker unpause ====
[[https://docs.docker.com/engine/reference/commandline/unpause/|Supprime la pause du conteneur]] :
$ docker unpause d135c332e896
==== docker version ====
[[https://docs.docker.com/engine/reference/commandline/version/|Affiche la version de docker]] :
$ docker version --format '{{.Server.Version}}'
$ docker version --format '{{json .}}'
==== docker info ====
[[https://docs.docker.com/engine/reference/commandline/info/|Affiche des informations sur docker]] :
$ docker info
==== docker top ====
[[https://docs.docker.com/engine/reference/commandline/top/|Affiche le pid d'un conteneur]] :
$ docker top mon_conteneur
==== docker inspect ====
[[https://docs.docker.com/engine/reference/commandline/inspect/|Affiche les informations d'un conteneur, image ou tâche]] :
$ docker inspect mon_conteneur
==== docker commit ====
[[https://docs.docker.com/engine/reference/commandline/commit/|Crée une nouvelle image à partir d'un conteneur]] :
$ docker commit -m "Added json gem" -a "GigiX" b6a2bd1f6ea8 gigi206/test:v1
$ docker inspect -f "{{ .Config.Env }}" gigi206/test:v1
[HOME=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]
$ docker commit --change "ENV DEBUG true" b6a2bd1f6ea8 gigi206/test:v1
$ docker commit --change='CMD ["apachectl", "-DFOREGROUND"]' -c "EXPOSE 80" c3f279d17e0a svendowideit/testimage:version4
==== docker update ====
[[https://docs.docker.com/engine/reference/commandline/update/|Met à jour la configuration d'un conteneur]] :
$ docker update --cpu-shares 512 abebf7571666
==== docker build ====
[[https://docs.docker.com/engine/reference/commandline/build/|Crée une nouvelle image à partir d'un Dockerfile]] :
On créer un fichier [[#dockerfile|Dockerfile]] dans le répertoire courant et on lance la construction de l'image :
$ docker build -t gigi206/apache2_php5:v1 .
$ docker tag gigi206/apache2_php5:v1 gigi206/apache2_php5:latest
$ docker push gigi206/apache2_php5:lates
==== docker save ====
[[https://docs.docker.com/engine/reference/commandline/save/|Exporte une image au format tar]] :
$ docker save localhost:5000/suse/sles12sp2 -o sles12sp2.tar
==== docker load ====
[[https://docs.docker.com/engine/reference/commandline/load/|Importe une image au format tar]] :
$ cat exampleimage.tgz | docker import - exampleimagelocal:new
==== docker export ====
[[https://docs.docker.com/engine/reference/commandline/export/|Exporte un conteneur au format tar]] :
$ docker export $ID | gzip -c > image.tgz
$ docker export red_panda > latest.tar
$ docker export --output="latest.tar" red_panda
==== docker import ====
[[https://docs.docker.com/engine/reference/commandline/import/|Importe une image à partir d'un fichier archive (.tar, .tar.gz, .tgz, .bzip, .tar.xz, ou .txz)]] :
$ gzip -dc image.tgz | docker import - flat-image-name
Importe le répertoire courant en tant qu'image docker :
$ sudo tar -c . | docker import - exampleimagedir
==== docker port ====
[[https://docs.docker.com/engine/reference/commandline/port/|Affiche le mapping de port d'un conteneur]] :
$ docker port test
7890/tcp -> 0.0.0.0:4321
9876/tcp -> 0.0.0.0:1234
$ docker port test 7890/tcp
0.0.0.0:4321
==== docker stats ====
[[https://docs.docker.com/engine/reference/commandline/stats/|Affiche les statistiques d'un conteneur]] :
$ docker stats 2d5e8999b138
==== docker network ====
=== docker network driver ===
Network supporte l'option ''driver'' afin de spécifier un driver. Celui par défaut est ''bridge''.
* [[https://docs.docker.com/engine/userguide/networking/get-started-macvlan/|Driver macvlan]]
* [[https://docs.docker.com/engine/userguide/networking/get-started-overlay/|Driver Overlay]]
=== docker network ls ===
[[https://docs.docker.com/engine/reference/commandline/network_ls/|Affiche les réseaux disponibles]] :
$ docker network ls --no-trunc --filter driver=bridge
=== docker network inspect ===
[[https://docs.docker.com/engine/reference/commandline/network_inspect/|Affiche les caractéristiques d'un réseau]] :
$ docker network inspect bridge
=== docker network create ===
[[https://docs.docker.com/engine/reference/commandline/network_create/|Crée un nouveau réseau]] :
Créer un réseau qui n'a pas accès aux autres machines du parc :
$ docker network create -o com.docker.network.bridge.enable_icc=false -o com.docker.network.bridge.enable_ip_masquerade=false isolated
$ docker network inspect isolated
=== docker network rm ===
[[https://docs.docker.com/engine/reference/commandline/network_rm/|Supprime un réseau existant]] :
$ docker network rm gigix
=== docker network connect ===
[[https://docs.docker.com/engine/reference/commandline/network_connect/|Connecte un conteneur à un nouveau réseau]] (en plus des réseaux existants) :
$ docker network connect gigix bf283346cee9
=== docker network disconnect ===
[[https://docs.docker.com/engine/reference/commandline/network_disconnect/|Déconnecte un conteneur d'un réseau]] :
$ docker network disconnect gigix bf283346cee9
==== docker volume ====
=== docker volume ls ===
[[https://docs.docker.com/engine/reference/commandline/volume_ls/|Liste les volumes]] :
$ docker volume ls
=== docker volume create ===
[[https://docs.docker.com/engine/reference/commandline/volume_create/|Crée un nouveau volume]] :
Il existe des plugins additionnel pour drivers Netapp par exemple.
$ docker volume create --driver local --opt type=btrfs --opt device=/dev/sda2 --name foo
$ docker volume create --driver local --opt type=tmpfs --opt device=tmpfs --opt o=size=100m,uid=1000 --
$ docker volume create --driver local --opt type=nfs --opt o=addr=192.168.1.1,rw --opt device=:/path/to/dir --name foo
=== docker volume inspect ===
[[https://docs.docker.com/engine/reference/commandline/volume_inspect/|Affiche les informations d'un volume]] :
$ docker volume inspect gigix
=== docker volume rm ===
[[https://docs.docker.com/engine/reference/commandline/volume_rm/|Supprime un volume]] :
$ docker volume rm gigix
===== Commandes docker swarm =====
==== docker swarm ====
=== docker swarm init ===
[[https://docs.docker.com/engine/reference/commandline/swarm_init/|Initialise le cluster]] en créant un noeud de type ''manager'' :
$ docker swarm init
=== docker swarm join ===
[[https://docs.docker.com/engine/reference/commandline/swarm_join/|Rejoint le docker swarm]] :
Une fois que le [[#docker_swarm_init]] est lancé sur le noeud manager. Il faut recopier et coller la commande pour joindre le noeud manager en tant que worker.
=== docker swarm join-token ===
[[https://docs.docker.com/engine/reference/commandline/swarm_join-token/|Génère un nouveau ticket pour joindre swarm]] :
$ docker swarm join-token worker
$ docker swarm join-token manager
=== docker swarm leave ===
[[https://docs.docker.com/engine/reference/commandline/swarm_leave/|Quitte le docker swarm]] :
$ docker swarm leave
A lancer à partir du worker (seulement pour un worker) !
=== docker swarm update ===
[[https://docs.docker.com/engine/reference/commandline/swarm_update/|Met à jour swarm avec de nouveaux paramètres]] :
$ docker swarm update --cert-expiry 720h
==== docker node ====
Gestion des noeuds swarm.
=== docker node ls ===
[[https://docs.docker.com/engine/reference/commandline/node_ls/|Liste les noeuds swarm]] :
$ docker node ls
=== docker node inspect ===
[[https://docs.docker.com/engine/reference/commandline/node_inspect/|Affiche les caractéristiques d'un noeud]] :
$ docker node inspect node01
=== docker node inspect ===
[[https://docs.docker.com/engine/reference/commandline/node_inspect/|Affiche les caractéristiques d'un noeud]] :
$ docker node inspect node01
=== docker node ps ===
[[https://docs.docker.com/engine/reference/commandline/node_ps/|Liste les tâches qui s’exécutent sur un noeud]] :
$ docker node ps node01
=== docker node promote ===
[[https://docs.docker.com/engine/reference/commandline/node_promote/|Passe un worker en manager]] :
$ docker node promote node01
=== docker node demote ===
[[https://docs.docker.com/engine/reference/commandline/node_demote/|Passe un manager en worker]] :
$ docker node promote node01
=== docker node update ===
[[https://docs.docker.com/engine/reference/commandline/node_demote/|Met à jour la configuration d'un noeud]] :
$ docker node update --availability drain node01
==== docker service ====
Pour créer un service basé sur un fichier ''docker-compose.yml'', il faut se mettre dans ce même répertoire que ce fichier et taper :
$ docker-compose bundle
Cela va créer le fichier **.dsb (.dab)**. Il suffit ensuite de le déployer dans swarm :
$ docker deploy
=== docker service ls ===
[[https://docs.docker.com/engine/reference/commandline/service_ls/|Liste les services]] :
$ docker service ls
=== docker service create ===
[[https://docs.docker.com/engine/reference/commandline/service_create/|Crée un service]] :
$ docker service create --name redis --replicas=2 redis:3.0.6
=== docker service inspect ===
[[https://docs.docker.com/engine/reference/commandline/service_inspect/|Affiche la configuration du service]] :
$ docker service inspect redis --pretty
=== docker service ps ===
[[https://docs.docker.com/engine/reference/commandline/service_ps/|Affiche les tâches d'un service]] :
$ docker service ps redis
=== docker service scale ===
[[https://docs.docker.com/engine/reference/commandline/service_scale/|Scaling pour un service]] :
$ docker service scale backend=3 frontend=5
=== docker service rm ===
[[https://docs.docker.com/engine/reference/commandline/service_rm/|Supprime un service]] :
$ docker service rm redis
=== docker service update ===
[[https://docs.docker.com/engine/reference/commandline/service_update/|Met à jour un service]] :
$ docker service update --limit-cpu 2 redis
===== Dockerfile =====
* [[https://docs.docker.com/engine/reference/builder/#/dockerignore-file|Fichier .dockerignore]]
==== FROM ====
[[https://docs.docker.com/engine/reference/builder/#/from|Auteur du fichier Dockerfile]] :
MAINTAINER
==== MAINTAINER ====
[[https://docs.docker.com/engine/reference/builder/#/maintainer|Image utilisée pour fabriquer la nouvelle image]] :
FROM
FROM :
FROM @FROM @
==== RUN ====
[[https://docs.docker.com/engine/reference/builder/#/run|Exécute des commandes pour la création de l’image]] :
RUN
RUN ["executable", "param1", "param2"]
==== CMD ====
[[https://docs.docker.com/engine/reference/builder/#/cmd|Commande lancée au démarrage du conteneur]] :
CMD
CMD ["executable", "param1", "param2"]
Si un [[#ENTRYPOINT]] est définit :
CMD ["param1","param2"]
==== LABEL ====
[[https://docs.docker.com/engine/reference/builder/#/label|Ajoute des méta-data à une image]] :
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
LABEL multi.label1="value1" multi.label2="value2" other="value3"
LABEL multi.label1="value1" \
multi.label2="value2" \
other="value3"
==== EXPOSE ====
[[https://docs.docker.com/engine/reference/builder/#/expose|Expose un port]] :
EXPOSE [...]
==== ENV ====
[[https://docs.docker.com/engine/reference/builder/#/env|Définit des varaibles d'environnement]] :
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat fluffy
ENV myName="John Doe" myDog=Rex\ The\ Dog \
myCat=fluffy
==== ADD ====
[[https://docs.docker.com/engine/reference/builder/#/add|Ajoute des fichiers]] :
ADD ...
ADD ["",... ""]
ADD hom* /mydir/
''ADD'' peut pour la source prendre des URLS (http/https) et des archives qu'il décompressera dans la destination. Voir aussi [[#COPY]]
==== COPY ====
[[https://docs.docker.com/engine/reference/builder/#/copy|Ajoute des fichiers]] :
COPY ...
COPY ["",... ""]
A la différence de [[#ADD]], ''COPY'' ne supporte pas les URLS en source et ne décompressera pas les archives.
==== ENTRYPOINT ====
[[https://docs.docker.com/engine/reference/builder/#/entrypoint|Permet d’exécuter la commande principale du conteneur. On peut également lui passer un script]] :
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
Si l'on définit également [[#CMD]] alors qu'un ''ENTRYPOINT'' est définit alors ce qui est déclaré dans ''CMD'' sera passé en argument à ''ENTRYPOINT''.
==== VOLUME ====
[[https://docs.docker.com/engine/reference/builder/#/volume|Ajoute un volume]] :
VOLUME
VOLUME [""]
==== USER ====
[[https://docs.docker.com/engine/reference/builder/#/user|Indique avec quel utilisateur doit être lancé CMD, RUN et ENTRYPOINT]] :
USER daemon
==== WORKDIR ====
[[https://docs.docker.com/engine/reference/builder/#/workdir|Indique le CWD pour CMD, RUN, ENTRYPOINT, COPY et ADD]] :
WORKDIR /path/to/workdir
==== ARG ====
[[https://docs.docker.com/engine/reference/builder/#/arg|Définit des variables pour les réutiliser dans le Dockerfile]] :
FROM busybox
USER ${user:-some_user}
ARG user
USER $user
Variables prédéfinies :
* HTTP_PROXY
* http_proxy
* HTTPS_PROXY
* https_proxy
* FTP_PROXY
* ftp_proxy
* NO_PROXY
* no_proxy
==== ONBUILD ====
[[https://docs.docker.com/engine/reference/builder/#/onbuild|Indique un trigger à l'image qui sera lancé par un autre BUILD sur cette image]] :
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
Pratique pour lancer une commande sur notre image si elle a été forkée...
==== STOPSIGNAL ====
[[https://docs.docker.com/engine/reference/builder/#/stopsignal|Indique le signal à envoyer au conteneur pour son arrêt]] :
STOPSIGNAL signal
==== HEALTHCHECK ====
[[https://docs.docker.com/engine/reference/builder/#/healthcheck|Vérifie la santé en lançant une commande dans le conteneur]] :
HEALTHCHECK [OPTIONS] CMD command
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
OPTIONS :
* --interval=DURATION (default: 30s)
* --timeout=DURATION (default: 30s)
* --retries=N (default: 3)
''CMD'' peut être un script qui peut renvoyer le code de sortie ci-dessous :
* 0: success - the container is healthy and ready for use
* 1: unhealthy - the container is not working correctly
* 2: reserved - do not use this exit code
==== SHELL ====
[[https://docs.docker.com/engine/reference/builder/#/shell|Indique quel shell utiliser]] :
SHELL ["executable", "parameters"]
SHELL ["/bin/sh", "-c"]
===== docker-compose =====
==== Commandes docker-compose ====
L'outil [[https://docs.docker.com/compose/reference/overview/|docker-compose]] fait intervenir la notion de service qui représente l'ensemble des conteneurs construits à partir d'un fichier ''docker-compose.yml''.
=== docker-compose build ===
[[https://docs.docker.com/compose/reference/build/|Construit ou reconstruit les images du service à partir du fichier]] ''docker-compose.yml''.
=== docker-compose pull ===
[[https://docs.docker.com/compose/reference/pull/|Vérifie les images du service.]]
=== docker-compose up ===
[[https://docs.docker.com/compose/reference/up/|Crée et démarre le(s) conteneur(s) du service.]]
Options :
* **-d** : mode démon (détaché)
* **--build** : rebuild les images avant de lancer les conteneurs
[root@docker test]# docker-compose up -d
Starting test_redis_1
Starting test_web_1
=== docker-compose ps ===
[[https://docs.docker.com/compose/reference/up/|Liste les conteneurs.]]
=== docker-compose run ===
[[https://docs.docker.com/compose/reference/run/|Crée un conteneur avec la commande et le démarre.]]
=== docker-compose exec ===
[[https://docs.docker.com/compose/reference/exec/|Lance la commande si le conteneur est démarré.]]
=== docker-compose stop ===
[[https://docs.docker.com/compose/reference/stop/|Arrête l'ensemble des conteneurs du service]] :
$ docker-compose stop
$ docker-compose stop web -t 30
=== docker-compose start ===
[[https://docs.docker.com/compose/reference/start/|Démarre l'ensemble des conteneurs du service]] :
$ docker-compose start
$ docker-compose start web
=== docker-compose restart ===
[[https://docs.docker.com/compose/reference/restart/|Redémarre le service.]]
=== docker-compose down ===
[[https://docs.docker.com/compose/reference/down/|Arrête et supprime les conteneurs, volumes et réseau.]]
=== docker-compose config ===
[[https://docs.docker.com/compose/reference/config/|Affiche l’équivalent du fichier ''docker-compose.yml''.]]
=== docker-compose events ===
[[https://docs.docker.com/compose/reference/events/|Affiche en temps réel les événements du service.]]
=== docker-compose kill ===
[[https://docs.docker.com/compose/reference/kill/|Envoie un signal pour l'ensemble des conteneurs du service.]]
=== docker-compose pause ===
[[https://docs.docker.com/compose/reference/pause/|Met en pause le service.]]
=== docker-compose unpause ===
[[https://docs.docker.com/compose/reference/unpause/|Sort de la pause le service.]]
=== docker-compose logs ===
[[https://docs.docker.com/compose/reference/logs/|Affiche les logs du service.]]
=== docker-compose rm ===
[[https://docs.docker.com/compose/reference/rm/|Supprime les conteneur arrêtés]] :
$ docker-compose rm --all
=== docker-compose scale ===
[[https://docs.docker.com/compose/reference/scale/|Multiplie le nombre de conteneur pour un service]] :
$ docker-compose scale web=2
=== docker-compose version ===
[[https://docs.docker.com/compose/reference/version/|Affiche la version de ''docker-compose''.]]
==== Syntaxe docker-compose.yml ====
=== build ===
[[https://docs.docker.com/compose/compose-file/#/build|Construit l'image à partir d'une image existante ou d'un Dockerfile]] :
2 moyens :
* A partir de Dockerfile
* ou d'un dossier
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
build: ./dir
image: webapp:tag
''image'' et ''dockerfile'' sont exclusifs.
=== args ===
[[https://docs.docker.com/compose/compose-file/#/args|Permet de donner des arguments au Dockerfile]] :
build:
context: .
args:
buildno: 1
password: secret
Et dans notre ''Dockerfile'' :
ARG buildno
ARG password
RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"
=== capadd-capdrop ===
[[https://docs.docker.com/compose/compose-file/#/capadd-capdrop|Permet de donner des capabilities au conteneur]] :
cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN
=== command ===
[[https://docs.docker.com/compose/compose-file/#/command|Ecrase la commande par défaut du conteneur]].
2 formats :
command: bundle exec thin -p 3000
command: [bundle, exec, thin, -p, 3000]
=== cgroup_parent ===
[[https://docs.docker.com/compose/compose-file/#/cgroupparent|Définit un cgroup parent pour le conteneur]] :
cgroup_parent: m-executor-abcd
=== container_name ===
[[https://docs.docker.com/compose/compose-file/#/containername|Définit un nom pour le conteneur]] :
container_name: my-web-container
=== devices ===
[[https://docs.docker.com/compose/compose-file/#/devices|Mapping des devices]] :
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
=== depends_on ===
[[https://docs.docker.com/compose/compose-file/#/dependson|Dépendences sur l'ordre des services]] :
devices:
version: '2'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
''depends_on'' n'attendra pas dans l'exemple ci-dessus que ''db'' et ''redis'' soient démarrés. Pour attendre [[https://docs.docker.com/compose/startup-order/|cf cette page]].
=== dns ===
[[https://docs.docker.com/compose/compose-file/#/dns|Déclare le serveur dns]] :
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
=== dns_search ===
[[https://docs.docker.com/compose/compose-file/#/dnssearch|Déclare la search list DNS]] :
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
=== tmpfs ===
[[https://docs.docker.com/compose/compose-file/#/tmpfs|Déclare un système de fichier tmpfs]] :
tmpfs: /run
tmpfs:
- /run
- /tmp
=== entrypoint ===
[[https://docs.docker.com/compose/compose-file/#/entrypoint|Ecrase l'entrypoint par défaut]] :
entrypoint: /code/entrypoint.sh
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit
=== env_file ===
[[https://docs.docker.com/compose/compose-file/#/envfile|Déclare des variables d'environnement dans un fichier]] :
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
# Set Rails/Rack environment
RACK_ENV=development
Si vous spécifier l'option [[#build]], les variables définies dans votre fichier d'environnement ne seront pas prises en compte. Dans ce cas, utilisez l'option [[#args]] à la place dans les sous-options de [[#build]].
=== environment ===
[[https://docs.docker.com/compose/compose-file/#/environment|Déclare des variables d'environnement]] :
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRE
Si vous spécifier l'option [[#build]], les variables d'environnement définies ne seront pas prises en compte. Dans ce cas, utilisez l'option [[#args]] à la place dans les sous-options de [[#build]].
=== expose ===
[[https://docs.docker.com/compose/compose-file/#/expose|Expose un port vers l’extérieur]] :
expose:
- "3000"
- "8000"
Voir également [[#ports]].
=== extends ===
[[https://docs.docker.com/compose/compose-file/#/extends|Permet de faire appel à un autre fichier yml pour déclarer un service]] :
extends:
file: common.yml
service: webapp
''file'' peut être défini par un chemin relatif ou absolu.
=== external_links ===
[[https://docs.docker.com/compose/compose-file/#/externallinks|Lie au niveau réseau 2 conteneurs qui n'ont pas été déclarés dans le même fichier docker-compose.yml]] :
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
Voir aussi [[#links]]
=== extra_hosts ===
[[https://docs.docker.com/compose/compose-file/#/extrahosts|Ajoute une entrée dans le fichier /etc/hosts]] :
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
=== image ===
[[https://docs.docker.com/compose/compose-file/#/image|Spécifie l'image du conteneur]] :
image: ubuntu:14.04
=== labels ===
[[https://docs.docker.com/compose/compose-file/#/labels|Ajoute un label dans les metadata]] :
labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
=== links ===
[[https://docs.docker.com/compose/compose-file/#/links|Lie au niveau réseau 2 conteneurs qui sont déclarés dans le même fichier docker-compose.yml]] :
web:
links:
- db
- db:database
- redis
Voir aussi [[#external_links]]. Les conteneurs liés doivent posséder au moins un réseau en commun pour communiquer.
=== logging ===
[[https://docs.docker.com/compose/compose-file/#/logging|Définit de quelle façon le conteneur doit envoyer ses logs]] :
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
[[https://docs.docker.com/engine/admin/logging/overview/|Liste des drivers disponibles]].
=== network_mode ===
[[https://docs.docker.com/compose/compose-file/#/networkmode|Définit le mode pour le réseau réseau]] :
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
=== networks ===
[[https://docs.docker.com/compose/compose-file/#/networks|Définit les réseaux]] :
services:
some-service:
networks:
- some-network
- other-network
=== aliases ===
[[https://docs.docker.com/compose/compose-file/#/aliases|Définit les alias]] :
services:
some-service:
networks:
- some-network
- other-network
=== ipv4_address, ipv6_address ===
[[https://docs.docker.com/compose/compose-file/#/ipv4address-ipv6address|Spécifie une adresse ipv4 et/ou ipv6 pour un conteneur]] :
services:
app:
image: busybox
command: ifconfig
networks:
app_net:
ipv4_address: 172.16.238.10
ipv6_address: 2001:3984:3989::10
=== pid ===
[[https://docs.docker.com/compose/compose-file/#/pid|Définit le pid mode]] :
pid: "host"
[[https://docs.docker.com/engine/reference/run/#pid-settings---pid|Voir les pid mode]].
=== ports ===
[[https://docs.docker.com/compose/compose-file/#/ports|Définit les ports du conteneur]] :
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
Voir également [[#expose]].
=== security_opt ===
[[https://docs.docker.com/compose/compose-file/#/securityopt|Sécurité SeLinux]] :
security_opt:
- label:user:USER
- label:role:ROLE
=== stop_signal ===
[[https://docs.docker.com/compose/compose-file/#/stopsignal|Signal envoyé au conteneur pour son arrêt]] :
stop_signal: SIGUSR1
=== ulimits ===
[[https://docs.docker.com/compose/compose-file/#/ulimits|Paramètres ulimits]] :
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
=== volumes, volume_driver ===
[[https://docs.docker.com/compose/compose-file/#/volumes-volumedriver|Mapping des volulmes]] :
volumes:
# Just specify a path and let the Engine create a volume
- /var/lib/mysql
# Specify an absolute path mapping
- /opt/data:/var/lib/mysql
# Path on the host, relative to the Compose file
- ./cache:/tmp/cache
# User-relative path
- ~/configs:/etc/configs/:ro
# Named volume
- datavolume:/var/lib/mysql
=== volumes_from ===
[[https://docs.docker.com/compose/compose-file/#/volumesfrom|Monte les volumes définit dans un autre conteneur]] :
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
=== cpu_shares, cpu_quota, cpuset, domainname, hostname, ipc, mac_address, mem_limit, memswap_limit, privileged, read_only, restart, shm_size, stdin_open, tty, user, working_dir ===
[[https://docs.docker.com/compose/compose-file/#/cpushares-cpuquota-cpuset-domainname-hostname-ipc-macaddress-memlimit-memswaplimit-privileged-readonly-restart-shmsize-stdinopen-tty-user-workingdir|Définit différent paramètres]] :
cpu_shares: 73
cpu_quota: 50000
cpuset: 0,1
user: postgresql
working_dir: /code
domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43
mem_limit: 1000000000
memswap_limit: 2000000000
privileged: true
restart: always
read_only: true
shm_size: 64M
stdin_open: true
tty: true