English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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: {}
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.
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.
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.
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:
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
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.
Erstellen Sie im Testverzeichnis einen Ordner namens docker-Datei compose.yml und fügen Sie den folgenden Inhalt hinzu:
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.
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
Spezifiziert, welche Version von Compose in diesem yml-Abbild verwendet wird.
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.
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
Die Zuweisung eines Eltern cgroup-Gruppens an einen Container bedeutet, dass die Ressourcenbeschränkungen dieser Gruppe geerbt werden.
cgroup_parent: m-executor-abcd
Überschreibt den Standardbefehl für die Containerstart.
command: ["bundle", "exec", "thin", "-p", "3000"]
Gibt einen benutzerdefinierten Containername an, anstatt den generierten Standardnamen zu verwenden.
container_name: my-web-container
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.
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.
Geben Sie eine Liste der Geräteto Mappingen an.
devices: - "/dev/ttyUSB0:/dev/ttyUSB0"
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
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
Ü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
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
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'
Port暴露,但不映射到宿主机,仅供连接的服务访问。
Es können nur interne Ports als Parameter angegeben werden:
expose: - "3000" - "8000"
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
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
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
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"
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.
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.
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
Ä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
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.
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
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
Installieren Sie eine temporäre Dateisystem im Container. Es kann ein einzelner Wert oder eine Liste mehrerer Werte sein.
tmpfs: /run tmpfs: - /run - /tmp
Überschreiben Sie die Standard-ulimit des Containers.
ulimits: nproc: 65535 nofile: soft: 20000 hard: 40000
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"