Table des matières
Docker
Doc
Driver de stockage
Dockerfile
docker-compose
Systemd
Sécurité
Activation namespace user pour remappinf des uid entre le conteneur et la machine hôte avec : userns-remap :
Plugins
API
Autres
Commandes docker
docker run
Crée et démarre un conteneur à partir d'une image :
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
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
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
$ docker images --no-trunc
docker rmi $(docker images -f "dangling=true" -q)
$ docker images --digests
docker diff
Affiche les différences entre le conteneur et son image :
$ docker diff 2d5e8999b138
- A : Add
- D : Delete
- C : Change
docker history
docker tag
$ docker tag 0e5574283393 fedora/httpd:version1.0
$ docker tag httpd fedora/httpd:version1.0
docker rename
$ docker rename 2d5e8999b138 myconteneur_V1
docker exec
Lance une commande dans un conteneur :
$ docker exec -it bf283346cee9 bash
docker 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
Affiche le journal d'évenement de docker :
$ docker events --since '2016-10-22' --filter 'container=b6a2bd1f6ea8' --filter 'event=stop'
docker login
$ docker login
$ docker login localhost:8080
Cela crée le fichier $HOME/.docker/config.json.
docker logout
Se déconnecter du docker hub :
$ docker logout localhost:8080
docker pull
$ docker pull debian:jessie
$ docker pull ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2
docker pull myregistry.local:5000/testing/test-image
docker pull --all-tags fedora
docker push
docker search
$ docker search --filter "stars=3" --filter "is-automated=true" --no-trunc --limit 5 debian
$ docker search --filter "is-official=true" debian
docker rmi
$ docker rmi localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0
$ docker rmi -f fd484f19954f
$ docker rmi test
docker rm
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
- -f, –filter value : Filter output based on conditions provided (default [])
- exited=<int> an exit code of <int>
- label=<key> or label=<key>=<value>
- status=(created|restarting|running|paused|exited)
- name=<string> a container's name
- id=<ID> a container's ID
- before=(<container-name>|<container-id>)
- since=(<container-name>|<container-id>)
- ancestor=(<image-name>[:tag]|<image-id>|<image@digest>)
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
docker start
docker stop
docker restart
docker kill
docker wait
docker pause
docker unpause
docker version
Affiche la version de docker :
$ docker version --format '{{.Server.Version}}'
$ docker version --format '{{json .}}'
docker info
docker top
docker inspect
docker 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
docker build
Crée une nouvelle image à partir d'un Dockerfile :
On créer un fichier 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
Exporte une image au format tar :
$ docker save localhost:5000/suse/sles12sp2 -o sles12sp2.tar
docker load
Importe une image au format tar :
$ cat exampleimage.tgz | docker import - exampleimagelocal:new
docker 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
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
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
docker network
docker network driver
Network supporte l'option driver afin de spécifier un driver. Celui par défaut est bridge.
docker network ls
docker network inspect
Affiche les caractéristiques d'un réseau :
$ docker network inspect bridge
docker 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
$ docker network rm gigix
docker network connect
Connecte un conteneur à un nouveau réseau (en plus des réseaux existants) :
$ docker network connect gigix bf283346cee9
docker network disconnect
Déconnecte un conteneur d'un réseau :
$ docker network disconnect gigix bf283346cee9
docker volume
docker volume ls
docker volume create
$ 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
docker volume rm
Commandes docker swarm
docker swarm
docker swarm init
Initialise le cluster en créant un noeud de type manager :
$ docker swarm init
docker 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
Génère un nouveau ticket pour joindre swarm :
$ docker swarm join-token worker
$ docker swarm join-token manager
docker swarm leave
$ docker swarm leave
A lancer à partir du worker (seulement pour un worker) !
docker 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
$ docker node ls
docker node inspect
Affiche les caractéristiques d'un noeud :
$ docker node inspect node01
docker node inspect
Affiche les caractéristiques d'un noeud :
$ docker node inspect node01
docker node ps
Liste les tâches qui s’exécutent sur un noeud :
$ docker node ps node01
docker node promote
$ docker node promote node01
docker node demote
$ docker node promote node01
docker node update
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 <DABFilename>
docker service ls
$ docker service ls
docker service create
$ docker service create --name redis --replicas=2 redis:3.0.6
docker service inspect
Affiche la configuration du service :
$ docker service inspect redis --pretty
docker service ps
Affiche les tâches d'un service :
$ docker service ps redis
docker service scale
$ docker service scale backend=3 frontend=5
docker service rm
$ docker service rm redis
docker service update
$ docker service update --limit-cpu 2 redis
Dockerfile
FROM
Auteur du fichier Dockerfile :
MAINTAINER <name>
MAINTAINER
Image utilisée pour fabriquer la nouvelle image :
FROM <image> FROM <image>:<tag> FROM <image>@<digest>FROM <image>@<digest>
RUN
Exécute des commandes pour la création de l’image :
RUN <command> RUN ["executable", "param1", "param2"]
CMD
Commande lancée au démarrage du conteneur :
CMD <command> CMD ["executable", "param1", "param2"]
Si un ENTRYPOINT est définit :
CMD ["param1","param2"]
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
EXPOSE <port> [<port>...]
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
ADD <src>... <dest> ADD ["<src>",... "<dest>"]
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
COPY <src>... <dest> COPY ["<src>",... "<dest>"]
COPY ne supporte pas les URLS en source et ne décompressera pas les archives.
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
ENTRYPOINT est définit alors ce qui est déclaré dans CMD sera passé en argument à ENTRYPOINT.
VOLUME
VOLUME <volume> VOLUME ["<volume>"]
USER
WORKDIR
Indique le CWD pour CMD, RUN, ENTRYPOINT, COPY et ADD :
WORKDIR /path/to/workdir
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
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
STOPSIGNAL
Indique le signal à envoyer au conteneur pour son arrêt :
STOPSIGNAL signal
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
SHELL ["executable", "parameters"] SHELL ["/bin/sh", "-c"]
docker-compose
Commandes docker-compose
L'outil 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
Construit ou reconstruit les images du service à partir du fichier docker-compose.yml.
docker-compose pull
docker-compose 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
docker-compose run
docker-compose exec
docker-compose stop
docker-compose start
docker-compose restart
docker-compose down
docker-compose config
docker-compose events
docker-compose kill
docker-compose pause
docker-compose unpause
docker-compose logs
docker-compose rm
Supprime les conteneur arrêtés :
$ docker-compose rm --all
docker-compose scale
Multiplie le nombre de conteneur pour un service :
$ docker-compose scale web=2
docker-compose version
Syntaxe docker-compose.yml
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
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
Permet de donner des capabilities au conteneur :
cap_add: - ALL cap_drop: - NET_ADMIN - SYS_ADMIN
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
Définit un cgroup parent pour le conteneur :
cgroup_parent: m-executor-abcd
container_name
Définit un nom pour le conteneur :
container_name: my-web-container
devices
devices: - "/dev/ttyUSB0:/dev/ttyUSB0"
depends_on
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 cf cette page.
dns
dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9
dns_search
dns_search: example.com dns_search: - dc1.example.com - dc2.example.com
tmpfs
Déclare un système de fichier tmpfs :
tmpfs: /run tmpfs: - /run - /tmp
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
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
environment
Déclare des variables d'environnement :
environment: RACK_ENV: development SHOW: 'true' SESSION_SECRET: environment: - RACK_ENV=development - SHOW=true - SESSION_SECRE
expose
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
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
extra_hosts
Ajoute une entrée dans le fichier /etc/hosts :
extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229"
image
Spécifie l'image du conteneur :
image: ubuntu:14.04
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
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
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"
network_mode
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
services:
some-service:
networks:
- some-network
- other-network
aliases
services:
some-service:
networks:
- some-network
- other-network
ipv4_address, ipv6_address
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
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"
security_opt
security_opt: - label:user:USER - label:role:ROLE
stop_signal
Signal envoyé au conteneur pour son arrêt :
stop_signal: SIGUSR1
ulimits
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
volumes, volume_driver
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
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
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
