Docker Compose
Compose-Einführung
Compose ist ein Tool zum Definieren und Ausführen von Multi-Container-Docker-Anwendungen. Mit Compose können Sie eine YML-Datei verwenden, um alle Services zu konfigurieren, die Ihre Anwendung benötigt. Anschließend können Sie mit einem einzigen Befehl alle Services aus der YML-Dateikonfiguration erstellen und starten.
Wenn Sie die YML-Dateikonfiguration noch nicht verstehen, können Sie zuerstYAML-Tutorial für den Einstieg lesen。
Die drei Schritte, die bei Compose verwendet werden:
-
Verwenden Sie ein Dockerfile, um die Umgebung der Anwendung zu definieren.
-
Verwenden Sie docker-compose.yml, um die Dienste zu definieren, aus denen Ihre Anwendung besteht, damit sie zusammen in einer isolierten Umgebung ausgeführt werden können.
-
Führen Sie schließlich den Befehl docker-compose up aus, um die gesamte Anwendung zu starten und auszuführen.
Ein Beispiel für eine docker-compose.yml-Konfiguration sieht wie folgt aus (Konfigurationsparameter siehe unten):
Beispiel
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
Compose-Installation
Unter Linux können wir das Binärpaket von GitHub herunterladen, um es zu verwenden. Adresse der neuesten Version:https://github.com/docker/compose/releases。
Führen Sie den folgenden Befehl aus, um die aktuelle stabile Version von Docker Compose herunterzuladen:
$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Um eine andere Version von Compose zu installieren, ersetzen Sie v2.2.2.
Docker Compose wird auf GitHub gehostet und ist nicht sehr stabil.
Sie können Docker Compose auch schnell installieren, indem Sie den folgenden Befehl ausführen.
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
Weisen Sie der Binärdatei ausführbare Berechtigungen zu:
$ sudo chmod +x /usr/local/bin/docker-compose
Symlink erstellen:
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
Testen Sie, ob die Installation erfolgreich war:
$ docker-compose version cker-compose version 1.24.1, build 4667896b
HinweisFür alpine sind die folgenden Abhängigkeitspakete erforderlich: py-pip, python-dev, libffi-dev, openssl-dev, gcc, libc-dev und make.
macOS
Docker Desktop für Mac und Docker Toolbox enthalten bereits Compose und andere Docker-Anwendungen, daher müssen Mac-Benutzer Compose nicht separat installieren. Die Docker-Installationsanleitung finden Sie unterMacOS Docker-Installation。
Windows-PC
Docker Desktop für Windows und Docker Toolbox enthalten bereits Compose und andere Docker-Anwendungen, daher müssen Windows-Benutzer Compose nicht separat installieren. Anweisungen zur Docker-Installation finden Sie unterWindows Docker-Installation。
Nutzung
1. Vorbereitung
Erstellen Sie ein Testverzeichnis.
$ mkdir composetest $ cd composetest
Erstellen Sie im Testverzeichnis eine Datei namens app.py, kopieren Sie den folgenden Inhalt und fügen Sie ihn ein:
Code der Datei composetest/app.py
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hallo Welt! Ich wurde {} Mal gesehen.\n'.format(count)
In diesem Beispiel ist redis der Hostname des redis-Containers im Anwendungsnetzwerk, und der von diesem Host verwendete Port ist 6379.
Erstellen Sie im Verzeichnis composetest eine weitere Datei namensrequirements.txtmit folgendem Inhalt:
flask redis
2. Erstellen Sie ein Dockerfile
Erstellen Sie im Verzeichnis composetest eine Datei namensDockerfilemit 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"]
Erklärung des Dockerfile-Inhalts:
- FROM python:3.7-alpine: Erstellen Sie das Image ausgehend vom Python 3.7-Image.
- WORKDIR /code: Setzen Sie das Arbeitsverzeichnis auf /code.
-
ENV FLASK_APP app.py ENV FLASK_RUN_HOST 0.0.0.0
Legen Sie die vom flask-Befehl verwendeten Umgebungsvariablen fest.
- 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 Python-Abhängigkeiten.
- COPY . .: Kopieren Sie das aktuelle Verzeichnis aus dem Projekt (.) in das Arbeitsverzeichnis im Image (.).
- CMD ["flask", "run"]: Der Standard-Ausführungsbefehl des Containers ist: flask run.
3. Erstellen Sie docker-compose.yml
Erstellen Sie im Verzeichnis test eine Datei namens docker-compose.yml und fügen Sie den folgenden Inhalt ein:
Konfigurationsdatei docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
Die Compose-Datei definiert zwei Dienste: web und redis.
- web: Der web-Dienst verwendet ein Image, das aus dem Dockerfile im aktuellen Verzeichnis erstellt wurde. Dann bindet er den Container und den Host an den exponierten Port 5000. Dieser Beispieldienst verwendet den Standardport 5000 des Flask-Webservers.
- redis: Der Redis-Dienst verwendet das öffentliche Redis-Image von Docker Hub.
4. Verwenden Sie Compose-Befehle, um Ihre Anwendung zu erstellen und auszuführen
Führen Sie im Testverzeichnis den folgenden Befehl aus, um die Anwendung zu starten:
docker-compose up
Wenn Sie den Dienst im Hintergrund ausführen möchten, können Sie-dParameter hinzufügen:
docker-compose up -d
Referenz zu yml-Konfigurationsdirektiven
version
Geben Sie an, welcher Version von Compose diese yml entspricht.
build
Geben Sie den Kontextpfad für das Build-Image an:
Geben Sie beispielsweise für den webapp-Dienst das aus dem Kontextpfad ./dir/Dockerfile erstellte Image an:
version: "3.7"
services:
webapp:
build: ./dir
Oder als Objekt mit dem im context angegebenen Pfad sowie optionalem 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: gibt den Dockerfile-Dateinamen an, der zum Erstellen des Images verwendet wird.
- args: Fügt Build-Argumente hinzu, also Umgebungsvariablen, die nur während des Build-Prozesses verfügbar sind.
- labels: Legt Labels für das erstellte Image fest.
- target: Multi-Stage-Build; Sie können angeben, welche Stage gebaut werden soll.
cap_add,cap_drop
Hinzufügen oder Entfernen von Host-Kernel-Capabilities, die für den Container verfügbar sind.
cap_add: - ALL # 开启全部权限 cap_drop: - SYS_PTRACE # 关闭 ptrace权限
cgroup_parent
Gibt die übergeordnete cgroup-Gruppe für den Container an; das bedeutet, dass er die Ressourcenlimits dieser Gruppe erbt.
cgroup_parent: m-executor-abcd
command
Den Standardbefehl für den Containerstart überschreiben.
command: ["bundle", "exec", "thin", "-p", "3000"]
container_name
Gibt einen benutzerdefinierten Containernamen an, anstelle des generierten Standardnamens.
container_name: my-web-container
depends_on
Legt Abhängigkeitsbeziehungen fest.
- docker-compose up: Startet Dienste in Abhängigkeitsreihenfolge. Im folgenden Beispiel werden db und redis vor web gestartet.
- docker-compose up SERVICE: schließt automatisch die Abhängigkeiten von SERVICE ein. Im folgenden Beispiel wird docker-compose up web auch db und redis erstellen und starten.
- docker-compose stop: Stoppt Dienste in Abhängigkeitsreihenfolge. 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-Dienst wartet nicht darauf, dass redis db vollständig gestartet ist, bevor er startet.
deploy
Gibt die Konfiguration im Zusammenhang mit der Bereitstellung und dem Betrieb des Dienstes an. Nur im Swarm-Modus nützlich.
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
Optionale Parameter.
endpoint_mode: Wie auf Cluster-Dienste zugegriffen wird.
endpoint_mode: vip # Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。 endpoint_mode: dnsrr # DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。
labels: Legt Labels für den Dienst fest. Sie können die Labels des Containers (Konfigurationen auf derselben Ebene wie deploy) verwenden, um die Labels unter deploy zu überschreiben.
mode: Gibt den vom Dienst bereitgestellten Modus an.
-
replicated: Repliziert den Dienst; repliziert den angegebenen Dienst auf die Maschinen im Cluster.
-
global: Globaler Dienst; der Dienst wird auf jeden Knoten im Cluster bereitgestellt.
-
Diagramm: In der Abbildung unten zeigen die gelben Blöcke die Funktionsweise des replizierten Modus und die grauen Blöcke die Funktionsweise des globalen Modus.

replicas:ModusWenn er auf replicated gesetzt ist, ist dieser Parameter erforderlich, um die genaue Anzahl der laufenden Knoten zu konfigurieren.
resources: Konfigurieren Sie Ressourcennutzungslimits für den Server. Beispielsweise im obigen Beispiel: Konfigurieren Sie den CPU-Prozentsatz und die Speichernutzung, die für den Betrieb des Redis-Clusters erforderlich sind, um Ausnahmen aufgrund übermäßig hoher Ressourcennutzung zu vermeiden.
restart_policy: Konfigurieren Sie, wie der Container neu gestartet werden soll, wenn er beendet wird.
- condition: optional none, on-failure oder any (Standard: any).
- delay: Legen Sie fest, wie lange vor dem Neustart gewartet wird (Standard: 0).
- max_attempts: Anzahl der Versuche, den Container neu zu starten. Nach Überschreitung wird nicht mehr erneut versucht (Standard: unbegrenzt wiederholen).
- window: Legen Sie das Zeitlimit für den Neustart des Containers fest (Standard: 0).
rollback_config: Konfigurieren Sie, wie der Dienst im Falle eines Update-Fehlers zurückgerollt werden soll.
- parallelism: Die Anzahl der Container, die gleichzeitig zurückgerollt werden sollen. Wenn sie auf 0 gesetzt ist, werden alle Container gleichzeitig zurückgerollt.
- delay: Die Wartezeit zwischen jedem Rollback einer Containergruppe (Standard: 0s).
- failure_action: Was zu tun ist, wenn das Rollback fehlschlägt. Entweder continue oder pause (Standard: pause).
- monitor: Die Dauer, für die weiter beobachtet wird, ob ein Update eines Containers fehlgeschlagen ist (ns|us|ms|s|m|h) (Standard ist 0s).
- max_failure_ratio: Die Fehlerrate, die während des Rollbacks toleriert werden kann (Standard: 0).
- order: die Reihenfolge der Vorgänge während des Rollbacks. Entweder stop-first (serieller Rollback) oder start-first (paralleler Rollback) (Standard stop-first).
update_config: Konfiguriert, wie der Dienst aktualisiert werden soll, was für die Konfiguration von Rolling Updates nützlich ist.
- parallelism: Die Anzahl der Container, die gleichzeitig aktualisiert werden.
- delay: Die Wartezeit zwischen der Aktualisierung einer Gruppe von Containern.
- failure_action: Was zu tun ist, wenn das Update fehlschlägt. Eines von continue, rollback oder pause (Standard: pause).
- monitor: Die Dauer, für die weiter beobachtet wird, ob ein Update eines Containers fehlgeschlagen ist (ns|us|ms|s|m|h) (Standard ist 0s).
- max_failure_ratio: Die Fehlerrate, die während des Aktualisierungsvorgangs toleriert werden kann.
- order: die Reihenfolge der Vorgänge während des Rollbacks. Entweder stop-first (serieller Rollback) oder start-first (paralleler Rollback) (Standard stop-first).
Hinweis: Nur in V3.4 und höher unterstützt.
Geräte
Geben Sie die Liste der Gerätezuordnungen an.
devices: - "/dev/ttyUSB0:/dev/ttyUSB0"
dns
Benutzerdefinierter DNS-Server, kann ein einzelner Wert oder eine Liste mit mehreren Werten sein.
dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9
dns_search
Benutzerdefinierte DNS-Suchdomänen. Kann ein einzelner Wert oder eine Liste sein.
dns_search: example.com dns_search: - dc1.example.com - dc2.example.com
entrypoint
Überschreibt den Standard-Entrypoint des Containers.
entrypoint: /code/entrypoint.sh
Es kann auch im folgenden Format angegeben werden:
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 einer Datei hinzufügen. Kann ein einzelner Wert oder eine Liste mit mehreren Werten sein.
env_file: .env
Es kann auch im Listenformat angegeben werden:
env_file: - ./common.env - ./apps/web.env - /opt/secrets.env
environment
Umgebungsvariablen hinzufügen. Sie können Arrays oder Dictionaries oder beliebige boolesche Werte verwenden. Boolesche Werte müssen in Anführungszeichen eingeschlossen werden, damit der YML-Parser sie nicht in True oder False umwandelt.
environment: RACK_ENV: development SHOW: 'true'
expose
Ports freigeben, aber nicht auf den Host-Rechner abbilden; nur durch verbundene Dienste zugänglich.
Als Parameter können nur interne Ports angegeben werden:
expose: - "3000" - "8000"
extra_hosts
Hostnamen-Zuordnungen hinzufügen. Ähnlich dem Docker-Client --add-host.
extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229"
Das Obige erstellt eine Zuordnungsbeziehung zwischen einer IP-Adresse und einem Hostnamen in der Datei /etc/hosts im Container des Dienstes:
162.242.195.82 somehost 50.31.209.229 otherhost
healthcheck
Wird verwendet, um zu erkennen, ob der Docker-Dienst fehlerfrei läuft.
healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序 interval: 1m30s # 设置检测间隔 timeout: 10s # 设置检测超时时间 retries: 3 # 设置重试次数 start_period: 40s # 启动后,多少秒开始启动检测程序
image
Geben Sie das Image an, das der Container ausführt. Alle folgenden Formate sind zulässig:
image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd # 镜像id
logging
Logging-Konfiguration für den Dienst.
driver: Geben Sie den Logging-Treiber für den Dienstcontainer an. Der Standardwert ist json-file. Es gibt die folgenden drei Optionen:
driver: "json-file" driver: "syslog" driver: "none"
Nur unter dem json-file-Treiber können die folgenden Parameter verwendet werden, um die Anzahl und Größe von Logs zu begrenzen.
logging:
driver: json-file
options:
max-size: "200k" # 单个文件大小为200k
max-file: "10" # 最多10个文件
Wenn das Dateilimit erreicht ist, werden alte Dateien automatisch gelöscht.
Unter dem syslog-Treiber können Sie syslog-address verwenden, um die Empfangsadresse für Logs anzugeben.
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
network_mode
Netzwerkmodus festlegen.
network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]"
networks
Konfiguriert das Netzwerk, mit dem der Container verbunden wird, und verweist dabei auf Einträge unter den networks auf oberster Ebene.
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 Dienstnamen oder diesen Alias verwenden, um eine Verbindung zum Dienst des entsprechenden Containers herzustellen.
restart
- no: Dies ist die Standard-Neustartrichtlinie. Der Container wird unter keinen Umständen neu gestartet.
- always: Der Container wird immer neu gestartet.
- on-failure: Der Container wird nur neu gestartet, wenn er ungewöhnlich beendet wird (Exit-Status ungleich null).
- unless-stopped: Den Container immer neu starten, wenn er beendet wird, aber Container, die beim Start des Docker-Daemons bereits gestoppt waren, nicht berücksichtigen.
restart: "no" restart: always restart: on-failure restart: unless-stopped
Hinweis: Verwenden Sie im Swarm-Clustermodus bitte stattdessen restart_policy.
secrets
Sensible Daten wie Passwörter speichern:
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
Das Standard-Schema-Label des Containers ändern.
security-opt: - label:user:USER # 设置容器的用户标签 - label:role:ROLE # 设置容器的角色标签 - label:type:TYPE # 设置容器的安全策略标签 - label:level:LEVEL # 设置容器的安全等级标签
stop_grace_period
Geben Sie an, wie lange gewartet werden soll, bevor SIGKILL gesendet wird, um den Container herunterzufahren, wenn er SIGTERM (oder ein beliebiges Signal von stop_signal) nicht verarbeiten kann.
stop_grace_period: 1s # 等待 1 秒 stop_grace_period: 1m30s # 等待 1 分 30 秒
Die Standard-Wartezeit beträgt 10 Sekunden.
stop_signal
Legen Sie ein alternatives Signal zum Stoppen des Containers fest. Standardmäßig wird SIGTERM verwendet.
Im folgenden Beispiel wird SIGUSR1 anstelle von SIGTERM verwendet, um den Container zu stoppen.
stop_signal: SIGUSR1
sysctls
Legen Sie Kernel-Parameter im Container fest; die Angabe kann im Array- oder Wörterbuchformat erfolgen.
sysctls: net.core.somaxconn: 1024 net.ipv4.tcp_syncookies: 0 sysctls: - net.core.somaxconn=1024 - net.ipv4.tcp_syncookies=0
tmpfs
Ein temporäres Dateisystem im Container einhängen. Kann ein einzelner Wert oder eine Liste mit mehreren Werten sein.
tmpfs: /run tmpfs: - /run - /tmp
ulimits
Den Standard-ulimit des Containers überschreiben.
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
volumes
Die Datenvolumes oder Dateien des Hosts in den Container einhängen.
version: "3.7"
services:
db:
image: postgres:latest
volumes:
- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
- "/localhost/data:/var/lib/postgresql/data"Weitere Erweiterungen