1. ホーム
  2. ドッカー

docker-composeの使い方ガイド

2022-03-03 11:10:18
<パス

コンポーザー は、マルチコンテナDockerアプリケーションを定義し、実行するためのツールです。

Docker-composeは、サービスの設定、コラボレーション、管理のプロセスを自動化するためのDocker社のオーサリングツールです。Docker-composeでは、起動するコンテナのセットとそのランタイムプロパティをYAMLファイルで定義することができます。


Docker-composeのインストール

Centos7でのインストールはこちらをご覧ください。 Docker-composeのインストール

また、docker-compose は Python で書かれているため、pip で直接インストールすることができます。

$ pip install -U docker-compose



最初のComposeファイル

version: '3'
services:
  spider:
    build:
      . context: .
      dockerfile: Dockerfile
    volumes:
      - $PWD:/code
      - /data1/datascience/scrapy-data:/data
    command: scrapy crawl comment


説明

  • versionはコンポジットファイルのバージョンを指定し、最新版は3.4です。
  • services はサービス、この場合はクローラーサービスのスパイダーを定義します。
  • buildは、ビルドイメージのコンテキスト、Dockerfileファイル、ARGSなどを指定します。
  • volumes は、ボリュームの作成とマウントに使用され、ここではソースとデータストアのディレクトリがマウントされます。
  • command サービス起動時に実行するコマンドを指定します。DockerfileのCOMMANDを参照してください。

Compose File ディレクティブ

まずはdocker-compose.ymlファイルをコピーしてみましょう。

version: '2'
services:
  web:
    image: dockercloud/hello-world
    ports:
      - 8080
    networks:
      - front-tier
      - back-tier

  redis:
    image: redis
    links:
      - web
    networks:
      - back-tier

  back-tier
    image: dockercloud/haproxy
    ports:
      - 80:80
    links:
      - web
    networks:
      - front-tier
      - back-tier
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock 

networks:
  front-tier:
    driver: bridge
  back-tier:
driver: bridge


標準的な設定ファイルには、バージョン、サービス、ネットワークが含まれているはずですが、このうち最も重要なのはサービスとネットワークであることがおわかりいただけると思います。

  • イメージ : Dockerfile FROM に対応する、コンテナの起動元となるイメージを指定します。
    servicesタグの下の第2レベルのタグはwebで、サービス名となるユーザー定義名です。imageは指定したサービスの名前またはイメージIDで、Composeはローカルにイメージが存在しない場合、そのイメージを引き出そうとします。

    image: redis
    image: ubuntu:14.04
    image: tutum/influxdb
    image: example-registry.com:4000/postgresql
    image: a4bc65fd
    
    
    
  • ビルド buildタグは、Dockerfileがあるフォルダのパスを指定します。composeはこれを用いて自動的にイメージをビルドし、サービスコンテナの起動に使用します。

    Dockerfile を使った最も簡単な直接ビルドは、コンテキストまたは Dockerfile の場所を指定するだけです。

    version: '2'
    services:
      webapp:
        build: .
    
    
    

    より細かい設定が必要な場合は、context、dockerfile、args、labelsなどのオプションを使用する必要があります。

    # Dockerfile
    ARG buildno
    ARG password
    
    RUN echo "Build number: $buildno"
    RUN script-requiring-password.sh "$password"
    
    
    # docker-compose file
    version: '2'
    services:
      webapp:
        image: webapp:tag
        build:
          context: . /dir
          dockerfile: dockerfile-alternate
          args:
            buildno: 1
            password: secret
    
    
    
  • コマンド : コンテナ起動後にデフォルトで実行されるコマンドをオーバーライドするには command を使用します。

    command: bundle exec thin -p 3000
    
    command: ["bundle", "exec", "thin", "-p", "3000"]
    
    
    
  • コンテナ名 : デフォルトの形式(<プロジェクト名><サービス名><シリアル番号>)ではなく、実行時コンテナ名を指定します。

        container_name: my-web-container
    
    
    
  • 依存関係 : サービス間の依存関係、コンテナの依存関係の解決、起動順序を指定します。

    version: '3'
    services:
      web:
        build: .
        depends_on:
          - db
          - redis
      redis:
        image: redis
      db:
        image: postgres
    
    
    

    依存するサービスが先に開始される(当たり前だが)
    サービス開始時に依存サービスが開始されていない場合は、自動的に開始される

  • dns : DNSサーバーを指定します。

    dns: 8.8.8.8
    dns:
      - 8.8.8.8
      - 9.9.9.9
    
    
    
  • tmpfs : コンテナ内の一時ディレクトリをマウントすると、run 引数と同じ効果があります:。

    tmpfs: /run
    tmpfs:
      - /run
      - /tmp
    
    
    
  • エントリポイント : Dockerfileにはアクセスポイントを指定するENTRYPOINTディレクティブというものがあり、Docker-compose.ymlで定義すると、Dockerfileの定義を上書きすることができるようになっています。

    entrypoint: /code/entrypoint.sh
    
    
    
  • 環境ファイル : 変数専用のファイルです。docker-compose -f FILE で設定ファイルを指定した場合、env_file のパスは設定ファイルのパスが使用されます。環境指示文と衝突する変数名がある場合は、後者が優先されます。書式は以下の通りです。

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

    ファイルフォーマットは以下の通りです。

    RACK_ENV=development
    
    
    

    なお、ここで述べた環境変数はホストであるComposeのものであり、設定ファイルにビルド操作がある場合は、これらの変数はビルド処理に入らないので、ビルドで変数を使用したい場合は、先ほどのargタグを優先してください。

  • 環境 : は、上記の env_file タグとは全く異なり、代わりに arg と多少似ています。このタグはミラー変数を設定するために使用され、ミラーに保存することができます。つまり、起動したコンテナはこれらの変数設定も含むことになり、これがargとの最大の違いです。

    <ブロッククオート

    argタグの変数は、一般にビルド処理でのみ使用されます。DockerfileのENVコマンドのような環境は、docker run -eの効果と同様に、イメージの中の変数をコンテナ内に保持します。

    environment:
      RACK_ENV: development
      SHOW: 'true'
      SESSION_SECRET:
    
    environment:
      - RACK_ENV=development
      - SHOW=true
      - SESSION_SECRET
    
    
    
  • 曝す : このタグはDockerfileのEXPOSEディレクティブと同様に、公開されたポートを指定するために使用されますが、あくまで参考です。実際にはdocker-compose.ymlでポートマッピング用のportsタグを用意する必要があります。

    expose:
      - "3000"
      - "8000"
    
    
    
  • 外部リンク : Dockerを使用するにあたり、個別に docker run Composeがdocker-compose.ymlで定義されていないこれらのコンテナに接続するためには、external_linksという特別なタグが必要です。このタグによって、Composeプロジェクト内のコンテナは、プロジェクト構成の外部のコンテナに接続できます(ただし、外部コンテナの少なくとも1つは、プロジェクト内のサービスと同じネットワークに接続していることが条件です)。

    external_links:
      - redis_1
      - project_db_1:mysql
      - project_db_1:postgresql
    
    
    
  • extra_hosts : ホスト名を追加するタグは、/etc/hosts ファイルにいくつかのレコードを追加することです。

    extra_hosts:
      - "somehost:162.242.195.82"
      - "otherhost:50.31.209.229"
    
    
    
  • ラベル : DockerfileのLABELコマンドと同じ意味で、コンテナにメタデータを追加する。

    labels:
      com.example.description: "Accounting webapp"
      com.example.department: "Finance"
      com.example.labels-with-empty-value: ""
    labels:
      - "com.example.description=Accounting webapp"
      - "com.example.department=Finance"
      - "com.example.label-with-empty-value"
    
    
    
  • リンク : 上記のdepends_onタグは 開始順序 このタグで解決されるのは コンテナ接続 の問題で、Dockerクライアントの-linkと同じ効果で、他のサービスのコンテナに接続することができます。

    web:
      links:
      - db
      - db:database
      - redis
    
    
    

    使用するエイリアスは、サービスコンテナ内の/etc/hostsに自動的に作成されます。
    また、対応する環境変数も作成されます。

  • ロギング : ロギングサービスを設定するために使用します。デフォルトのドライバはjson-fileです。

    logging:
      driver: syslog
      options:
        syslog-address: "tcp://192.168.0.42:123"
    
    
    
  • ピッド : PID モードをホスト PID モードに設定し、プロセスの名前空間をホストシステムと共有します。このタグを使用するコンテナは、他のコンテナやホストのネームスペースにアクセスして操作することができるようになります。

    pid: "host"
    
    
    
  • ポート : マッピングされたポートのためのタグ。HOST:CONTAINER の形式を使うか、コンテナのポートを指定すれば、ホストがランダムにポートをマッピングします。

    ports:
      - "3000"
      - "8000:8000"
      - "49100:22"
      - "127.0.0.1:8001:8001"
    
    
    

    注意: HOST:CONTAINER フォーマットを使用してポートをマッピングする場合、コンテナポートを 60 未満で使用すると正しくない結果を得る可能性があります。そのため、文字列形式を使用することが推奨されます。

  • セキュリティオプト : 各コンテナのデフォルトタグをオーバーライドします。簡単に言うと、これはすべてのサービスを管理するタグです。例えば、全てのサービスのuserタグの値をUSERに設定する。

    security_opt:
      - label:user:USER
      - label:role:ROLE
    
    
    
  • ストップシグナル : コンテナを停止するための別のシグナルを設定する。デフォルトでは、コンテナを停止するために SIGTERM が使用される。別のシグナルを設定するには、stop_signal タグを使用します。

    stop_signal: SIGUSR1
    
    
    
  • ボリューム : ディレクトリまたは既存のデータボリュームコンテナを、HOST:CONTAINERなどの形式を使用して直接マウントするか、HOST:CONTAINER:roなどの形式を使用して、コンテナを読み取り専用にし、ホストのファイルシステムを効果的に保護することができます。

    volumes:
      # Just specify a path, and Docker will automatically create a data volume in (this path is internal to the container).
      - /var/lib/mysql
    
      # Mount the data volume using an absolute path
      - /opt/data:/var/lib/mysql
    
      # Mount the data volume as a relative path centered on the Compose configuration file to the container.
      - . /cache:/tmp/cache
    
      # Use the relative path of the user (~/ means the directory is /home/<user directory>/ or /root/).
      - ~/configs:/etc/configs/:ro
    
      # Named data volumes that already exist.
      - datavolume:/var/lib/mysql
    
    
    
  • cap_add, cap_drop : コンテナを追加・削除するためのカーネル機能。

  • デバイス : デバイスマッピングのリスト。Dockerクライアントの --device パラメータを使用します。

    devices:
      - "/dev/ttyUSB0:/dev/ttyUSB0"
    
    
    
  • エクステンド : このタグは、現在のファイルから、または別のファイルから、同じサービスを拡張し、後でオプションで元の設定を上書きすることができます。

    extends:
      file: common.yml
      service: webapp
    
    
    
    

    file は相対パスでも絶対パスでもよく、file の値が指定されない場合は、Compose は現在の YML ファイルから情報を読み取ります。

Composeのファイルオプションの詳細については コンポーズファイルバージョン3リファレンス

ComposeファイルのオプションはDockerfileと似ているものが多いので、一緒に覚えておくとよいでしょう。 Dockerfileコマンド


コンポーズを実行する

ここでは、8つのスパイダーサービスを同時に起動しています。

$ docker-compose up -d --scale spider=8



コマンドラインツールの構成

コマンドを使用する docker-compose --help をクリックすると、コマンドツールがサポートするコマンドと引数を確認できます。

<ブロッククオート

docker-compose help [COMMAND] コマンドの詳細を表示します。

Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [OPTIONS] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE Specify an alternate Compose file (default: docker-compose.yml)
  -p, --project-name NAME Specify an alternate project name (default: directory name)
  --verbose Show more output
  --no-ansi Do not print ANSI control characters
  --v, --version Print version and exit
  -H, --host HOST Daemon socket to connect to

  --tls Use TLS; implied by --tlsverify
  --tlscacert CA_PATH Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH Path to TLS certificate file
  --tlskey TLS_KEY_PATH Path to TLS key file
  --tlsverify Use TLS and verify the remote
  --skip-hostname-check Don't check the daemon's hostname against the name specified in the client certificate (for example
                              in the client certificate (for example if your docker host
                              is an IP address)
  --project-directory PATH Specify an alternate working directory
                              (default: the path of the Compose file)

Commands:
  build Build or rebuild services
  bundle Generate a Docker bundle from the Compose file
  config Validate and view the Compose file
  create Create services
  Stop and remove containers, networks, images, and volumes
  events Receive real time events from containers
  exec Execute a command in a running container
  help Get help on a command
  images List images
  Kill Kill containers
  logs View output from containers
  pause Pause services
  port Print the public port for a port binding
  ps List containers
  pull Pull service images
  push Push service images
  restart Restart services
  rm Remove stopped containers
  Run a one-off command
  scale Set number of containers for a service
  start Start services
  stop Stop services
  top Display the running processes
  unpause Unpause services
  up Create and start containers
  version Show the Docker-Compose version information


よく使われるコマンドの1つに
- ビルド : docker-compose ファイルで指定されたイメージとオプションを元にビルドします。また、あらかじめ Dockerfile でコンパイルしておけば、ビルドする必要はなく、以下の↑で起動します。

    $ docker-compose build .


  • : Dockerと同様に、Composeはupを使用してコンテナを起動し、定式化されたパラメータで実行し、すべてのログ出力をマージします。

    $ docker-compose up 
    
    
    

    を指定して始めると -d フラグを使用すると、サービスはデーモン・モードで実行されます。

    $ docker-compose up -d
    
    
    

    サービスを一括で起動したい場合(例:8つのScrapyを起動する)には、以下のコードを --scale オプションはサービスの数を指定します。

    $ docker-compose up -d --scale spider=8
    
    
    
  • ps : ローカルのdocker-compose.ymlファイルに定義されている実行中のサービスをすべて一覧表示します。

    $ docker-compose ps
    
    
    
  • ログ : サービスのログを表示します。このコマンドは、サービスのログファイルを追跡します。 tail -f コマンドを使用します。 Ctrl+C で終了します。

    $ docker-compose logs
    
    
    
  • 停止 : すべてのサービスを停止します。もし停止していない場合は docker-compose kill で強制的にサービスを停止させることができます。

    $ docker-compose stop
    
    
    
  • rm : すべてのサービスを削除します。

    $ docker-compose rm
    
    
    

最後に、公式のdocker-compose.ymlで終わります。

version: "3"
services:

  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - deploy
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      backend deploy: placement:
        constraints: [node.role == manager]
  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - 5000:80
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure
  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - 5001:80
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker. image: dockersamples/examplevotingapp_worker
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.role == manager]

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]

networks:
  frontend:
  backend:

volumes:
  db-data: