66
77

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Docker Composeの仕様について混乱しがちな箇所を整理した

Last updated at Posted at 2018-10-04

docker・docker composeの仕様について細かい部分を調べて理解する

Docker compose 公式ドキュメント

Docker composeとは

Compose is a tool for defining and running multi-container Docker applications. To learn more about Compose refer to the following documentation:
https://docs.docker.com/compose/

複数コンテナから構成されるアプリケーションを構築・実行するためのツール。
一から触ってみるなら、https://docs.docker.com/compose/gettingstarted/の内容を試すのが手軽。

Docker compose CLI

docker-compose xxxで実行するCLIの仕様

downとstopの違い

down

起動中のコンテナを停止・削除する。なお、デフォルトの挙動で削除されるのはdocker-compose.ymlに定義されたcontainer・networkとなる。externalで定義したnetwork・volumeは削除対象にはならない。

また、---volumes指定でvolumeも削除される

stop

起動中のコンテナを削除せずに停止する。削除していないので、docker-compose startで再起動する。

multiple docker-compose file: -f

Use the -f flag to specify the location of a Compose configuration file.

$ docker-compose -f docker-compose.yml -f docker-compose.admin.yml run backup_db

複数のcomposeファイルを指定することが可能。

up

-d flag

    -d, --detach               Detached mode: Run containers in the background,
                               print new container names. Incompatible with
                               --abort-on-container-exit.

バックグラウンドでコンテナを起動。

run

The docker-compose run command allows you to run one-off commands for your services.

サービス定義したコンテナに対するコマンドを実行する

bind mount

docker-compose.yml
version: '3'
services:
    web:
        build: .
        ports:
            - "5000:5000"
        volumes:
            - .:/code
    redis:
        image: "redis:alpine"

volumesで指定。ホストPCのディレクトリをコンテナの特定パスにマウントする。
ローカルファイル変更したら、検知され反映される。

web_1    |  * Detected change in '/code/app.py', reloading
web_1    |  * Restarting with stat
web_1    |  * Debugger is active!
web_1    |  * Debugger PIN: 303-274-835

ps

-> % docker-compose ps
       Name                      Command               State           Ports
-------------------------------------------------------------------------------------
composetest_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
composetest_web_1     python app.py                    Up      0.0.0.0:5000->5000/tcp

実行中のプロセスを確認する。

Docker Compose file

docker-composeの設定ファイルについてのフォーマット・各フィールド指定による効果について整理

Version

compose fileのフォーマットバージョン。1・2・3とあり、2018/10/4現在は3が最新バージョン。

Service

argsとenvironment

Note: If your service specifies a build option, variables defined in environment are not automatically visible during the build. Use the args sub-option of build to define build-time environment variables.

args・environment両方設定した値を環境変数にアクセスすることでコンテナ内で見ることができる。ただし、buildオプションでイメージをビルド際に必要な環境変数がある場合は、environmentに指定しても見れないのでargsで指定する必要がある。

ports

Either specify both ports (HOST:CONTAINER), or just the container port (an ephemeral host port is chosen).

コンテナがホストに対して公開するポートを指定する。

ports:
 - "3000"
 - "3000-3005"
 - "8000:8000"
 - "9090-9091:8080-8081"
 - "49100:22"
 - "127.0.0.1:8001:8001"
 - "127.0.0.1:5000-5010:5000-5010"
 - "6060:6060/udp"

expose

Expose ports without publishing them to the host machine - they’ll only be accessible to linked services. Only the internal port can be specified.

exposeで指定したポートはlinkされたサービスからアクセス可能となる、ホストからのアクセスが可能にするための指定ではない。

expose:
 - "3000"
 - "8000"

external_links

Link to containers started outside this docker-compose.yml or even outside of Compose

docker-composeで定義したコンテナ以外のコンテナへのリンクを作成する。CONTAINER:ALIASという形式で指定。

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

extra_hosts

hostnameのマッピング、コンテナ内の/etc/hostsに指定した内容が書き込まれる。

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

healthcheck

特定のcontainer serviceのヘルスチェックを行う設定

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 1m30s
  timeout: 10s
  retries: 3

healthcheckが通っている場合、docker-compose psで表示した際の状態(State)に、Up (health: starting) といったように表示される。

-> % docker-compose ps
       Name                      Command               State           Ports
-------------------------------------------------------------------------------------
composetest_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
composetest_web_1     python app.py                    Up (health: starting)       0.0.0.0:5000->5000/tcp

dns

Custom DNS servers. Can be a single value or a list.

DNSサーバを指定する

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

Network

Networkingに関する説明は、https://docs.docker.com/compose/networking/にて詳説されている。
参考訳:Docker コンテナ・ネットワークの理解にて日本語翻訳していただいているので、そちらを合わせてみるとより理解度が深まります。

本設定を省略した場合

下記のYAMLファイルのように、network設定を省略した場合。

version: "3"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
    ports:
      - "8001:5432"
  • ディレクトリ名 + _defaultというネットワークが作成される。
    例えば、myappというディレクトリだった場合は、myapp_defaultというネットワークが作成され、各サービスはmyapp_defaultにjoinする。

すでに存在するネットワークを指定する

externalでネットワーク名を指定することですでに存在するネットワークにjoinする。

networks:
  default:
    external:
      name: my-pre-existing-network
66
77
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
66
77

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?