Voici 10 commandes avancées Docker
Docker est un outil très polyvalent, qui dynamise le développement et accélère le déploiement. Dans cet article, je vais montrer 10 astuces pour les professionnels Docker.
Dépendance conditionnelle basée sur le healthcheck
Dans certains cas, il est nécessaire de définir l’ordre dans lequel des services spécifiques sont démarrés (par exemple, les applications doivent démarrer après le démarrage réussi de la base de données). Par conséquent, Docker a introduit des healthcheck pour les conteneurs, qui peuvent être utilisés pour limiter l’ordre de démarrage des services. Dans l’exemple ci-dessous le service, pgweb dépend d’un service de base de données. Malheureusement, cette fonctionnalité a été supprimée dans la version 3 de Docker Compose.
version: '2.1'
services:
db:
image: postgres:10
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: password
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 30s
timeout: 30s
retries: 3
pgweb:
image: sosedoff/pgweb
ports:
- "8081:8081"
environment:
- DATABASE_URL=postgres://admin:password@db:5432/postgres?sslmode=disable
depends_on:
db:
condition: service_healthy
Pour les versions supérieurs voici ce qu’il faudrait effectuer:
api-test:
restart: always
command: bash -c 'while [[ "$$(curl --connect-timeout 2 -s -o /dev/null -w ''%{http_code}'' uds-mock-server:4000/readiness)" != "200" ]]; do echo ..; sleep 5; done; echo backend is up;npm start'
depends_on:
- backend
...
Multi-stage builds
La création d’applications dans des Dockerfiles entraîne des images de grande taille (par exemple en raison des dépendances de construction) et doit être évitée à moins que des constructions en plusieurs étapes ne soient utilisées. Il est possible de construire des applications dans une étape dédiée, alors que seuls les artefacts de construction sont copiés dans l’image Docker finale. L’exemple ci-dessous crée une application basée sur Java et copie le fichier Jar résultant dans l’image finale. Toutes les dépendances Maven récupérées lors de la construction sont omises.
FROM maven:3.5-jdk-8 as builder
WORKDIR /
COPY . /
RUN mvn clean package
FROM openjdk:8-jdk-alpine
LABEL maintainer="j.innerbichler@gmail.com"
COPY --from=builder /target/docker-build-demo-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
Sécurité du réseau
Docker Compose fournit des fonctionnalités permettant de définir des réseaux entre des services individuels, alors que les conteneurs ne sont autorisés à communiquer qu’avec des services au sein du même réseau. L’exemple ci-dessous montre trois services et deux réseaux (c’est-à-dire db-backend et frontend ). Il interdit la communication entre les services maildev et db. Seuls pgweb et db sont autorisés à communiquer puisqu’ils font partie du même réseau.
version: '3'
services:
maildev:
image: djfarrelly/maildev:1.0.0-rc2
ports:
- "8082:80"
- "25"
networks:
- frontend
pgweb:
image: sosedoff/pgweb
restart: on-failure
ports:
- "8081:8081"
environment:
- DATABASE_URL=postgres://admin:password@db:5432/postgres?sslmode=disable
networks:
- frontend
- db-backend
db:
image: postgres:10
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: password
networks:
- db-backend
networks:
db-backend:
frontend:
Database Initialisation
Parfois, il est pratique de commencer avec une base de données initialisée (par exemple en insérant des exportations de base de données sauvegardées). L’image officielle PostgreSQL de Docker prend en charge cette fonctionnalité. Copiez simplement vos scripts SQL ou shell dans /docker-entrypoint-initdb.d/
version: '3'
services:
pgweb:
image: sosedoff/pgweb
restart: on-failure
ports:
- "8081:8081"
environment:
- DATABASE_URL=postgres://admin:password@db:5432/persons?sslmode=disable
db:
image: postgres:10
ports:
- "5432:5432"
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: password
POSTGRES_DB: persons
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
Adaptation de la sortie ps
La sortie de docker ps peut parfois être trop détaillée, ce qui entraîne une sortie illisible dans le terminal. Heureusement, il est possible de définir quelles colonnes doivent être incluses dans la sortie (voir la commande ci-dessous). Il est même possible de modifier le format par défaut de la sortie.
docker ps -a --format "table {{.Names}}\\t{{.Image}}\\t{{.Status}}"
Docker-dans-Docker
Un moyen très pratique mais dangereux d’utiliser Docker dans des conteneurs Docker consiste à lier docker.sock depuis l’hôte via des volumes (voir le code ci-dessous). De cette façon, l’installation Docker de l’hôte peut être utilisée à l’intérieur du conteneur. Un scénario pour cette configuration pourrait être un framework CI (par exemple Jenkins) dans un conteneur Docker, qui devrait être capable de créer et de transmettre des images Docker. Plus d’information ici
version: '3'
services:
dind:
image: docker
volumes:
- /var/run/docker.sock:/var/run/docker.sock
entrypoint: ["docker", "run", "busybox", "echo", "\"hello from busybox\""]
Construction
Une fonctionnalité très utile pour créer des images de base réutilisables est fournie avec la version 0.8 de Docker. La commande ONBUILD permet de définir des commandes, qui sont exécutées une fois les images enfants construites.
FROM python:3.6
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ONBUILD COPY requirements.txt /usr/src/app/
ONBUILD RUN pip install --no-cache-dir -r requirements.txt
ONBUILD COPY . /usr/src/app
Exécuter des applications en tant qu’utilisateur non root
De nombreuses applications conteneurisées sont exécutées avec l’utilisateur root. Cela n’est pas toujours nécessaire et expose d’éventuelles surfaces d’attaque liées à la sécurité. Dans l’exemple ci-dessous, un serveur Web NGINX est configuré pour pouvoir être exécuté sans droits de super utilisateur. Plus d’informations ici
FROM nginx:1.15.3
# setup configuration
COPY ./nginx.conf /etc/nginx/nginx.conf
# set proper access right
RUN touch /var/run/nginx.pid && \
chown -R www-data:www-data /var/run/nginx.pid && \
chown -R www-data:www-data /var/cache/nginx
# change user
USER www-data
# copy static html file
COPY index.html /var/www/htdocs/
Installation des packages mis à jour
Si la commande « RUN apt-get update » est indiquée dans une ligne dédiée, elle sera mise en cache et ne sera pas exécutée dans les builds suivants. Par conséquent, une installation de packages obsolètes peut se produire.L’extrait de code ci-dessous met à jour les packages et installe curl dans une seule commande RUN.
FROM ubuntu:14.04
RUN apt-get update && apt-get install -y curl
ENTRYPOINT ["curl", "example.com"]
BusyBox sans fin
Dans certains cas, il est nécessaire de simplement démarrer un conteneur sans tâche spécifique (c’est à dire une boucle sans fin dans l’extrait de code ci-dessous). Une fois qu’il est en cours d’exécution, vous pouvez vous y connecter via Docker Exec et effectuer le débogage nécessaire dans l’environnement Docker (par exemple, dans un certain réseau).
docker run -d busybox /bin/sh -c "while true; do echo Docker; sleep 1; done"
0 commentaire