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

Docker Compose

Composeの概要

Composeは、多容器Dockerアプリケーションの定義と実行に使用されるツールです。Composeを使用すると、YMLファイルでアプリケーションが必要とするすべてのサービスを設定できます。その後、1つのコマンドでYMLファイルの設定からすべてのサービスを生成および起動できます。

Composeの3つのステップ:

  • 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

Linux 上我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:Linuxでは、Githubからバイナリパッケージをダウンロードして使用することができます。最新版のリリースURLはこちらです://L "https:/docker/$ docker/github.com

https:

以下のコマンドを実行してDocker Composeの現在の安定版をダウンロードします: -$ sudo curl//L "https:/docker/$ docker/github.com/releases/1.24.1/docker-$ docker-s) -download-s) -$(uname -m)" /usr/local/bin/docker-$ docker

o 1.24.1。

他のComposeのバージョンをインストールするには、以下を置き換えてください:

二進数ファイルに実行権限を適用します: +$ sudo chmod /usr/local/bin/docker-$ docker

x

シンボリックリンクを作成します: -s /usr/local/bin/docker-$ docker /usr/bin/docker-$ docker

$ sudo ln

インストールが成功したか確認してください:-$ docker --version
compose-cker 1.24.1compose version 4667896, build

b注意-:alpine用の以下の依存パッケージが必要です:py-pip、python-dev、libffi-dev、openssl-dev、gcc、libc

macOS

MacのDockerデスクトップ版とDockerToolboxにはComposeと他のDockerアプリケーションが含まれていますので、MacユーザーはComposeを個別にインストールする必要はありません。Dockerのインストール手順はこちらを参照してください。 MacOS Docker インストール

windows PC

WindowsのDockerデスクトップ版とDockerToolboxにはComposeと他のDockerアプリケーションが含まれていますので、WindowsユーザーはComposeを個別にインストールする必要はありません。Dockerのインストール手順はこちらを参照してください。 Windows Docker インストール

使用

1準備

テストディレクトリを作成します:

$ mkdir composetest
$ cd composetest

テストディレクトリに app.py という名前のファイルを作成し、以下の内容をコピー&ペーストしてください:

composetest/app.py ファイルのコード

import time
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 'Hello World! I have been seen {} times.
'.format(count)

この例では、redisはアプリケーションネットワーク上のredisコンテナのホスト名であり、使用するポートは以下の通りです。 6379。

composetestディレクトリに、以下の内容のrequirements.txtファイルを作成してください。

flask
redis

2、Dockerfileファイルを作成してください

composetestディレクトリに、以下の内容のDockerfileファイルを作成してください。

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の内容説明:

  • FROM python:3.7-alpine: Pythonから 3.7 イメージがビルドを開始します。

  • WORKDIR /code: ワークディレクトリを設定します。 /code。

  • ENV FLASK_APP app.py
    ENV FLASK_RUN_HOST 0.0.0.0

    flaskコマンドを使用する環境変数を設定します。

  • RUN apk add --no-cache gcc musl-dev linux-headers: gccをインストールし、MarkupSafeやSQLAlchemyなどのPythonパッケージがコンパイル加速できるようにします。

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

    requirements.txtをコピーし、Pythonの依存関係をインストールします。

  • COPY . .: .プロジェクトの現在のディレクトリを.workディレクトリにコピーします。

  • CMD ["flask", "run"]: コンテナはデフォルトの実行コマンドとして以下を提供します:flask run。

3、dockerを作成してください-compose.yml

テストディレクトリにdockerを作成してください-compose.ymlのファイル、以下の内容を貼り付けてください:

docker-compose.yml 設定ファイル

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

この Compose ファイルは 2 つのサービスを定義しています:web と redis。

  • web:この web サービスは Dockerfile の現在のディレクトリからビルドされたイメージを使用しています。その後、コンテナとホストを暴露されたポートにバインドします。 5000。この例のサービスは Flask Web サーバーのデフォルトポートを使用しています。 5000 。

  • redis:この redis サービスは Docker Hub のパブリック Redis イメージを使用しています。

4、Compose コマンドを使用してアプリケーションを構築および実行します

テストディレクトリで以下のコマンドを実行してアプリケーションを起動します:

docker-compose up

バックグラウンドでサービスを実行したい場合は、以下を追加できます: -d パラメータ:

docker-compose up -d

yml 設定命令の参照

version

指定されたこの yml が従う compose のどのバージョンで定義されたかを指定します。

build

ビルドイメージのコンテキストパスを指定します:

例えば webapp サービスは、コンテキストパス . として指定されます。/dir/Dockerfile でビルドされたイメージ:

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

または、コンテキストパスが指定されたオブジェクトとして、オプションの Dockerfile と 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:コンテキストパス。

  • dockerfile:ビルドイメージの Dockerfile ファイル名を指定します。

  • args:ビルドパラメータを追加します。これはビルドプロセス中にのみアクセスできる環境変数です。

  • labels:ビルドイメージのタグを設定します。

  • target:マルチレイヤー構築、構築するレイヤーを指定できます。

cap_add、cap_drop

コンテナが持つホストのカーネル機能を追加または削除します。

cap_add:
  - ALL # すべての権限を開く
cap_drop:
  - SYS_PTRACE # ptrace権限を閉じる

cgroup_parent

コンテナに親 cgroup グループを指定することは、そのグループのリソース制限を継承することを意味します。

cgroup_parent: m-executor-abcd

command

コンテナ起動のデフォルトコマンドをオーバーライドします。

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

container_name

カスタムコンテナ名を指定し、デフォルトの名前を使用しないことを指定します。

container_name: my-web-container

depends_on

依存関係の設定。

  • docker-compose up :依存関係の順序でサービスを起動します。以下の例では、まず db と redis を起動し、その後 web を起動します。

  • docker-compose up SERVICE :SERVICE の依存関係を自動的に含めます。以下の例では、docker-compose up web は、db と redis を作成および起動することも行います。

  • docker-compose stop :依存関係の順序でサービスを停止します。以下の例では、web が db と redis 之前に停止します。

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

注意:web サービスは redis db が完全に起動する前に待機しません。

deploy

サービスのデプロイと実行に関連する設定を指定します。swarm モードでのみ有効です。

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

選択可能なパラメータ:

endpoint_mode:クラスタサービスへのアクセス方法。

endpoint_mode: vip 
# Docker クラスタサービスの外部の仮想 IP。すべてのリクエストはこの仮想 IP を通じてクラスタサービス内のマシンに到達します。
endpoint_mode: dnsrr
# DNS ループ(DNSRR)。すべてのリクエストは自動的にループして、クラスタ IP リストの 1 つの IP アドレスを取得します。

labels:サービス上にタグを設定します。コンテナの labels(deploy と同階層の設定)を使用して、deploy 下の labels を上書きすることができます。

mode:指定されたサービスが提供するモード。

  • replicated:コピーサービス、指定されたサービスをクラスタのマシンにコピーします。

  • global:グローバルサービス、サービスはクラスタの各ノードにデプロイされます。

  • 図解:以下の図で黄色いボックスは replicated モードの実行状況、灰色のボックスは global モードの実行状況です。

replicas:mode replicated 時、このパラメータを使用して具体的な実行ノード数を設定する必要があります。

resources:サーバー資源使用の制限の設定、例えば上記の例では、redis クラスタの実行が必要な CPU百分率和メモリ使用量を設定します。リソースの過度な使用を避け、異常を発生させないようにします。

restart_policy:コンテナの退出時にコンテナを再起動する方法の設定。

  • condition:オプションとして none、on-failure または any(デフォルト値:any)。

  • delay:再起動までの時間の設定(デフォルト値:0)。

  • max_attempts:再起動を試みる回数、その回数を超えた場合、再試行しません(デフォルト値:常に再試行)。

  • window:コンテナの再起動タイムアウトの設定(デフォルト値:0)。

rollback_config:更新失敗時のサービスのロールバック方法の設定。

  • parallelism:一度にロールバックするコンテナの数。0に設定された場合、全てのコンテナが同時にロールバックされます。

  • delay:各コンテナグループのロールバック間に待つ時間(デフォルト:0s)。

  • failure_action:ロールバックが失敗した場合の対応方法。そのうちの continue または pause(デフォルト pause)。

  • monitor:各コンテナの更新後、失敗した時間を観察し続ける(ns|us|ms|s|m|h)(デフォルト:0s)。

  • max_failure_ratio:ロールバック中に許容できる故障率(デフォルト:0)。

  • order:リバース中の操作順序。stop-first(シリアルリバースロールバック)、または start-first(並列ロールバック)(デフォルト stop-first )。

update_config:サービスの更新方法の設定、特にサービスのロールバック更新に役立ちます。

  • parallelism:一度に更新するコンテナの数。

  • delay:一組のコンテナの更新間に待つ時間。

  • failure_action:更新が失敗した場合の対応方法。そのうちの continue、rollback、または pause(デフォルト:pause)。

  • monitor:各コンテナの更新後、失敗した時間を観察し続ける(ns|us|ms|s|m|h)(デフォルト:0s)。

  • max_failure_ratio:更新中に許容できるエラーレート。

  • order:リバース中の操作順序。stop-first(シリアルリバースロールバック)、または start-first(並列リバースロールバック)(デフォルトstop-first)。

:V3.4 およびそれ以降のバージョン。

devices

デバイスマッピングリストを指定します。

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

dns

カスタム DNS サーバーを設定します。単一の値またはリストの複数の値が可能です。

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

dns_search

カスタム DNS 検索ドメインを設定します。単一の値またはリストが可能です。

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

entrypoint

コンテナのデフォルトの entrypoint を上書きします。

entrypoint: /code/entrypoint.sh

以下の形式でも可能です:

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

ファイルから環境変数を追加します。単一の値またはリストの複数の値が可能です。

env_file: .env

リスト形式でも可能です:

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

environment

環境変数を追加します。配列や辞書、任意のボルン値を使用できます。ボルン値は引号で囲む必要があります。これにより、YML パーサーがそれを True または False として解析しないようにします。

environment:
  RACK_ENV: development
  SHOW: 'true'

 

expose

ポートを暴露しますが、ホストマシンにマッピングされず、接続するサービスのみがアクセスできます。

内部ポートを引数として指定することができます:

expose:
 - "3000"
 - "8000"

extra_hosts

ホスト名のマッピングを追加します。docker client に似ています。 --add-host。

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

上記は、このサービスの内部コンテナ内で /etc/hosts が IP アドレスとホスト名のマッピング関係を作成します:

162.242.195.82  somehost
50.31.209.229   otherhost

healthcheck

Dockerサービスが健康に動作しているかを検出するために使用されます。

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"] # 検出プログラムを設定
  interval: 1m30s # 検出間隔を設定
  timeout: 10s # 検出タイムアウト時間を設定
  retries: 3 # リトライ回数を設定
  start_period: 40s # 起動後、何秒後に検出プログラムを開始します

image

コンテナが実行するイメージを指定します。以下の形式が使用できます:

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd # イメージID

logging

サービスのログ記録設定。

driver:サービスコンテナのログ記録ドライバーを指定します。デフォルト値はjsonです-file。以下の3つのオプションがあります

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

ただし json-file ドライバーの下では、以下のパラメータを使用して、ログの数とサイズを制限できます。

logging:
  driver: json-file
  options:
    max-size: "200k" # 单个文件大小为200k
    max-file: "10" # 最多10個文件

ファイルの制限上限に達すると、古いファイルが自動的に削除されます。

syslog ドライバーの下では、syslogを使用できます。-address はログ受信先の指定です。

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

network_mode

ネットワークモードを設定します。

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

networks

コンテナのネットワーク接続を設定し、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 :同じネットワーク上の他のコンテナは、サービス名またはこの別名を使用して対応するコンテナのサービスに接続できます。

restart

  • no:デフォルトの再起動ポリシーで、どんな状況でもコンテナは再起動しません。

  • always:コンテナは常に再起動します。

  • on-failure:コンテナが異常で退出した場合(退出状態が0でない場合)にのみ、コンテナを再起動します。

  • unless-stopped:コンテナが退出した場合、常にコンテナを再起動しますが、Dockerデーモンが起動時にすでに停止していたコンテナは除きます。

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

注:swarm クラスターモードでは、restart_policyを使用してください。

secrets

パスワードなどの機密情報を保存するための、例えば:

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

コンテナのデフォルトのスキーマタグを変更します。

security-opt:
  - label:user:USER   # コンテナのユーザータグを設定
  - label:role:ROLE   # コンテナのロールタグを設定
  - label:type:TYPE   # コンテナのセキュリティポリシータグを設定
  - label:level:LEVEL  # コンテナのセキュリティレベルタグを設定

stop_grace_period

コンテナがSIGTERM(または任何 stop_signal のシグナル)を処理できない場合、どれくらいの時間を待ってからSIGKILLシグナルを送信してコンテナを閉じるか指定します。

stop_grace_period: 1s # 待機 1 秒
stop_grace_period: 1m30s # 待機 1 分 30 秒

デフォルトの待機時間は 10 秒。

stop_signal

コンテナの停止シグナルを設定します。デフォルトではSIGTERMを使用します。

以下の例では、SIGUSRを使用します。1 コンテナを停止するためのシグナル SIGTERM を代わりに使用します。

stop_signal: SIGUSR1

sysctls

コンテナ内のカーネルパラメータを設定します。配列または辞書形式で使用できます。

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

tmpfs

コンテナ内に一時ファイルシステムをインストールします。単一の値またはリストの複数の値です。

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

ulimits

デフォルトの ulimit をオーバーライドします。

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

volumes

ホストのデータボリュームまたはファイルをコンテナにマウントします。

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