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

Laisser un commentaire

Emplacement de l’avatar

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Site développé et maintenu par la société DevNet-Solutions.fr

ErosiaX est une application libertine dédiée aux rencontres libertines, offrant un espace sécurisé et discret pour explorer des affinités d'érotismes diverses. Favorisant la liberté et le respect mutuel, ErosiaX permet à ses membres libertins de découvrir des partenaires partageant des intérêts similaires dans une communautée libertine ouverte et accueillante.