English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

DockerCompose

Compose 简介

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。

  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

  • 最后,执行 docker-使用 compose up 命令来启动并运行整个应用程序。

docker-compose.yml 的配置案例如下(配置参数参考下文):

# yaml 配置示例
version: '3'
services:
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

Compose 安装

Linux

Auf Linux können wir das Binärbündel von Github herunterladen, um es zu verwenden, die Adresse der neuesten Version:https://github.com/docker/compose/releases.

Führen Sie die folgenden Befehl aus, um die aktuelle stabile Version von Docker Compose herunterzuladen:

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Um andere Versionen von Compose zu installieren, ersetzen Sie 1.24.1.

Verwenden Sie die ausführbaren Berechtigungen für Binärdateien:

$ sudo chmod +x /usr/local/bin/docker-compose

Erstellen Sie einen Symbolischen Link:

$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Überprüfen Sie, ob die Installation erfolgreich war:

$ docker-compose --version
cker-compose version 1.24.1, build 4667896b

Beachten SieFür alpine sind die folgenden Abhängigkeitspakete erforderlich: py-pip, python-dev, libffi-dev, openssl-dev, gcc, libc-dev und make.

macOS

Docker Desktop Edition und Docker Toolbox für Mac enthalten Compose und andere Docker-Anwendungen, daher müssen Mac-Benutzer Compose nicht separat installieren. Docker-Installationsanweisungen können überprüft werden MacOSDockerInstallation.

windows PC

Docker Desktop Edition und Docker Toolbox für Windows enthalten Compose und andere Docker-Anwendungen, daher müssen Windows-Benutzer Compose nicht separat installieren. Docker-Installationsanweisungen können überprüft werden WindowsDockerInstallation.

Verwendung

1、Vorbereitung

Erstellen Sie ein Testverzeichnis:

$ mkdir composetest
$ cd composetest

Erstellen Sie im Testverzeichnis eine Datei namens app.py und fügen Sie den folgenden Inhalt ein:

composetest/app.py Datei-Code

import time
import redis
von flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
    retries = 5
    während True:
        versuchen:
            return cache.incr('hits')
        außer redis.exceptions.ConnectionError als exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)
@app.route('/)
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.
'.format(count)

In diesem Beispiel ist redis der Hostname des redis-Containers im Netzwerk der Anwendung, der Port, den dieser Host verwendet, ist 6379.

Erstellen Sie im Verzeichnis composetest eine weitere Datei namens requirements.txt mit folgendem Inhalt:

flask
redis

2Erstellen Sie die Datei Dockerfile

Erstellen Sie im Verzeichnis composetest eine Datei namens Dockerfile mit folgendem Inhalt:

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]

Dockerfile-Inhaltsbeschreibung:

  • FROM python:3.7-alpine: Von Python 3.7 Das Abbild wird erstellt, wenn das Abbild beginnt zu bauen.

  • WORKDIR /code: Setzen Sie das Arbeitsverzeichnis auf /code.

  • ENV FLASK_APP app.py
    ENV FLASK_RUN_HOST 0.0.0.0

    Setzen Sie die Umgebungsvariablen für den flask-Befehl.

  • RUN apk add --no-cache gcc musl-dev linux-headers: Installieren Sie gcc, damit Python-Pakete wie MarkupSafe und SQLAlchemy kompiliert und beschleunigt werden können.

  • COPY requirements.txt requirements.txt
    RUN pip install -r requirements.txt

    Kopieren Sie requirements.txt und installieren Sie die Python-Abhängigkeiten.

  • COPY . .: Kopieren Sie den aktuellen Verzeichnisinhalt von . Projekt in das Arbeitsverzeichnis der . Abbildung.

  • CMD ["flask", "run"]: Der Standardausführungsbefehl des Containers ist: flask run.

3Erstellen Sie docker-compose.yml

Erstellen Sie im Testverzeichnis einen Ordner namens docker-Datei compose.yml und fügen Sie den folgenden Inhalt hinzu:

docker-compose.yml-Konfigurationsdatei

# yaml-Konfiguration
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

Dieser Compose-Datei sind zwei Dienste definiert: web und redis.

  • web:Dieser Web-Dienst verwendet das Abbild, das aus dem aktuellen Verzeichnis des Dockerfile gebaut wird. Dann bindet es den Container und den Host an die angebotenen Ports 5000. Dieser Beispiel-Dienst verwendet den Standardport des Flask-Web-Servers 5000 .

  • redis:Dieser Redis-Dienst verwendet das öffentliche Redis-Abbild von Docker Hub.

4、Verwenden Sie den Compose-Befehl, um Ihre Anwendung zu bauen und auszuführen

Führen Sie im Testverzeichnis die folgenden Befehle aus, um die Anwendung zu starten:

docker-compose up

Wenn Sie den Dienst im Hintergrund ausführen möchten, können Sie dies hinzufügen -d Parameter:

docker-compose up -d

Referenz der yml-Konfigurationsanweisungen

version

Spezifiziert, welche Version von Compose in diesem yml-Abbild verwendet wird.

build

Spezifizieren Sie den Kontextpfad für das Abbild, das gebaut werden soll:

Zum Beispiel der webapp-Dienst, der auf dem Kontextpfad . spezifiziert ist./dir/Das Abbild, das vom Dockerfile gebaut wird:

version: "3.7"
services:
  webapp:
    build: ./dir

Oder als Objekt mit dem im Kontext angegebenen Pfad und optionalen Dockerfile und args:

version: "3.7"
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1
      labels:
        - "com.example.description=Accounting webapp"
        - "com.example.department=Finance"
        - "com.example.label"-with-empty-value"
      target: prod
  • context: Kontextpfad.

  • dockerfile: Geben Sie den Dateinamen des Dockerfile für das zu baute Abbild an.

  • args: Fügen Sie Bauparameter hinzu, dies sind nur im Bauprozess zugängliche Umgebungsvariablen.

  • labels: Setzen Sie die Markierungen für das zu baute Abbild.

  • target: Mehrschichtige Bauweise, kann angegeben werden, welche Ebene gebaut werden soll.

cap_add, cap_drop

Hinzufügen oder Entfernen der Kernelfunktionen des Hosts, die der Container besitzt.

cap_add:
  - ALL # Aktivieren aller Berechtigungen
cap_drop:
  - SYS_PTRACE # Schließen der ptrace-Berechtigungen

cgroup_parent

Die Zuweisung eines Eltern cgroup-Gruppens an einen Container bedeutet, dass die Ressourcenbeschränkungen dieser Gruppe geerbt werden.

cgroup_parent: m-executor-abcd

command

Überschreibt den Standardbefehl für die Containerstart.

command: ["bundle", "exec", "thin", "-p", "3000"]

container_name

Gibt einen benutzerdefinierten Containername an, anstatt den generierten Standardnamen zu verwenden.

container_name: my-web-container

depends_on

Abhängigkeiten setzen.

  • docker-compose up :Startet die Dienst nach Abhängigkeiten. Im folgenden Beispiel werden db und redis vor dem Start von web gestartet.

  • docker-compose up SERVICE :Fügt automatisch die Abhängigkeiten von SERVICE hinzu. Im folgenden Beispiel enthält docker-compose up web wird auch db und redis erstellen und starten.

  • docker-compose stop :Stoppt die Dienst nach Abhängigkeiten. Im folgenden Beispiel wird web vor db und redis gestoppt.

version: "3.7"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

Hinweis: Der Web-Service wartet nicht darauf, dass die redis db vollständig gestartet ist, bevor er selbst startet.

deploy

Spezifiziert die Konfigurationen, die die Bereitstellung und den Betrieb des Dienstes betreffen. Dies ist nur im Swarm-Modus gültig.

version: "3.7"
services:
  redis:
    image: redis:alpine
    deploy:
      mode: replicated
      replicas: 6
      endpoint_mode: dnsrr
      labels: 
        description: "This redis service label"
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s

Verfügbare Parameter:

endpoint_mode:Der Zugriff auf den Cluster Service.

endpoint_mode: vip 
# Docker Cluster Service stellt einen virtuellen IP für den externen Zugriff bereit. Alle Anfragen erreichen die internen Maschinen des Cluster Services über diese virtuelle IP.
endpoint_mode: dnsrr
# DNS Round Robin (DNSRR). Alle Anfragen werden automatisch轮询 um eine IP-Adresse aus der Liste der Cluster-IP-Adressen zu erhalten.

labelsSet labels on the service. The labels on the container (at the same level as deploy configuration) can override the labels under deploy.

modeThe mode provided by the specified service.

  • replicatedReplicated service, replicate the specified service to the machines in the cluster.

  • globalGlobal service, the service will be deployed to each node of the cluster.

  • Illustration: In the figure below, the yellow blocks represent the running status of the replicated mode, and the gray blocks represent the running status of the global mode.

replicas: mode For replicated, this parameter needs to be used to configure the specific number of nodes to run.

resourcesHow to configure the limit of server resource usage, for example, in the above instance, configure the percentage of cpu and memory usage required for the redis cluster to run. Avoid using too many resources to cause exceptions.

restart_policyHow to restart the container when the container exits.

  • condition: Optional none, on-failure or any (default value: any).

  • delay: Set how long after to restart (default value: 0).

  • max_attempts: The number of times to try to restart the container. If the limit is exceeded, no more attempts will be made (default value: retry indefinitely).

  • window: Set the container restart timeout time (default value: 0).

rollback_configHow to configure the rollback of the service in case of update failure.

  • parallelism: The number of containers to roll back at once. If set to 0, all containers will roll back simultaneously.

  • delay: The time to wait between rolling back each container group (default: 0s).

  • failure_action: What to do if the rollback fails. One of continue or pause (default pause).

  • monitor: Watch the time (ns|us|ms|s|m|h) for which the container fails after each update (default: 0s).

  • max_failure_ratio: The allowable failure rate during rollback (default: 0).

  • order:Rollback-Operationen während des Rollbacks.-first(serial rollback),oder start-first (parallel rollback) (default stop-first ).

update_configHow to configure the update of the service, which is very useful for rolling updates.

  • parallelism: The number of containers to update at once.

  • delay: The time to wait between updating a group of containers.

  • failure_action: What to do if the update fails. One of continue, rollback, or pause (default: pause).

  • monitor: Watch the time (ns|us|ms|s|m|h) for which the container fails after each update (default: 0s).

  • max_failure_ratio:Die Fehlerquote, die während des Updates toleriert werden kann.

  • order:Rollback-Operationen während des Rollbacks.-first(serial rollback),oder start-first(parallel rollback)(Standard stop-first).

Anmerkung:Nur V3.4 und höher.

devices

Geben Sie eine Liste der Geräteto Mappingen an.

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"

dns

Definieren Sie einen benutzerdefinierten DNS-Server, es kann ein einzelner Wert oder mehrere Werte aus einer Liste sein.

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

dns_search

Definieren Sie einen benutzerdefinierten DNS-Suchbereich. Es kann ein einzelner Wert oder eine Liste sein.

dns_search: example.com
dns_search:
  - dc1.example.com
  - dc2.example.com

entrypoint

Überschreiben Sie den Standard EntryPoint des Containers.

entrypoint: /code/entrypoint.sh

Es kann auch in folgendem Format sein:

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

Umgebungsvariablen aus Dateien hinzufügen. Es kann ein einzelner Wert oder mehrere Werte aus einer Liste sein.

env_file: .env

Es kann auch im Listenformat sein:

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

environment

Fügen Sie Umgebungsvariablen hinzu. Sie können ein Array oder Dictionary verwenden, jede Boolean-Wert muss in Anführungszeichen gesetzt werden, um sicherzustellen, dass der YML-Parser ihn nicht in True oder False umwandelt.

environment:
  RACK_ENV: 'development'
  SHOW: 'true'

 

expose

Port暴露,但不映射到宿主机,仅供连接的服务访问。

Es können nur interne Ports als Parameter angegeben werden:

expose:
 - "3000"
 - "8000"

extra_hosts

Fügen Sie eine Hostnamen-Zuordnung hinzu. Ähnlich wie der docker Client --add-host.

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

Das oben genannte wird im internen Container dieses Dienstes /etc/hosts erstellt eine Zuordnung zwischen IP-Adresse und Hostnamen:

162.242.195.82  somehost
50.31.209.229   otherhost

healthcheck

Wird verwendet, um zu überprüfen, ob der Docker-Dienst gesund läuft.

healthcheck:
  test: ["CMD", "curl", "-", "http:",//localhost"] # Setzen Sie das Überprüfungsprogramm
  interval: 1m30s # Setzen Sie den Intervall der Überprüfung
  timeout: 10s # Setzen Sie die Zeitüberschreitung der Überprüfung
  retries: 3 # Setzen Sie die Anzahl der Wiederholungen
  start_period: 40s # Nach wie vielen Sekunden beginnt die Überprüfung des Programms

image

Bestimmen Sie das Bild, das der Container ausführt. Die folgenden Formate sind gültig:

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd # Bild-ID

logging

Dienstprotokollierungskonfiguration.

driver: Bestimmt den Protokolldriver des Dienstkontainers, der Standardwert ist json-file. Es gibt drei Optionen

driver: "json"-file"
driver: "syslog"
driver: "none"

Nur in json-Unter dem file-Treiber können Sie die folgenden Parameter verwenden, um die Anzahl und Größe der Protokolldateien zu begrenzen.

logging:
  driver: "json"-file
  options:
    max-size: "200k"# Die Größe einer Datei beträgt200k
    max-file: "10"# Maximal10Datei

Wenn die Dateigrößenbegrenzung erreicht wird, werden alte Dateien automatisch gelöscht.

Unter dem syslog-Treiber können Sie syslog verwenden-Die Adresse legt die Adresse der Logempfangsadresse fest.

logging:
  driver: "syslog"
  options:
    syslog-address: "tcp://192.168.0.42:123"

network_mode

Stellen Sie das Netzwerkmodus ein.

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

networks

Konfigurieren Sie das Netzwerk, das der Container verbindet, und beziehen Sie sich auf den Eintrag unter den top-level networks .

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
      other-network:
        aliases:
         - alias2
networks:
  some-network:
    # Use a custom driver
    driver: custom-driver-1
  other-network:
    # Use a custom driver which takes special options
    driver: custom-driver-2

aliases :Andere Container im selben Netzwerk können den Service-Namen oder diesen Alias verwenden, um auf den Service des entsprechenden Containers zu verbinden.

restart

  • no:Das ist die Standardwiederstartstrategie, der Container wird in keiner Situation neu gestartet.

  • always:Der Container wird immer neu gestartet.

  • on-failure:Der Container wird nur neu gestartet, wenn der Container nicht normal beendet wird (Exitstatus ist nicht 0).

  • unless-stopped:Der Container wird immer neu gestartet, wenn der Container beendet wird, ohne dabei auf Container zu achten, die bereits beim Start des Docker-Daemons gestoppt wurden

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

Hinweis: Im Swarm-Clustermodus verwenden Sie bitte restart_policy.

secrets

Speichere sensible Daten, wie z.B. Passwörter:

version: "3.1"
services:
mysql:
  image: mysql
  environment:
    MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
  secrets:
    - my_secret
secrets:
  my_secret:
    file: ./my_secret.txt

security_opt

Ändere das Standard-Labelschema des Containers.

security-opt:
  - label:user:USER # Setze das Benutzer-Label des Containers
  - label:role:ROLE # Setze das Rollen-Label des Containers
  - label:type:TYPE # Setze das Sicherheitsstrategie-Label des Containers
  - label:level:LEVEL # Setze das Sicherheitsebene-Label des Containers

stop_grace_period

Bestimme, wie lange gewartet wird, bevor ein SIGKILL-Signal gesendet wird, um den Container zu schließen, wenn der Container SIGTERM (oder irgendein stop_signal-Signal) nicht verarbeiten kann.

stop_grace_period: 1s # Wartezeit 1 Sekunden
stop_grace_period: 1m30s # Wartezeit 1 Minuten 30 Sekunden

Die Standardwartedauer ist 10 Sekunden.

stop_signal

Setze das Signal, das den Container stoppt. Standardmäßig wird SIGTERM verwendet.

Nachfolgender Beispiel, verwenden Sie SIGUSR1 Ersetze das Signal SIGTERM, um den Container zu stoppen.

stop_signal: SIGUSR1

sysctls

Setzen Sie die Kernelparameter im Container. Sie können ein Array oder ein Dictionary-Format verwenden.

sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0
sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0

tmpfs

Installieren Sie eine temporäre Dateisystem im Container. Es kann ein einzelner Wert oder eine Liste mehrerer Werte sein.

tmpfs: /run
tmpfs:
  - /run
  - /tmp

ulimits

Überschreiben Sie die Standard-ulimit des Containers.

ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000

volumes

Mounten Sie den Datenbereich oder die Datei des Hosts auf den Container.

version: "3.7"
services:
  db:
    image: postgres:latest
    volumes:
      - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
      - "/localhost/data:/var/lib/postgresql/data"