docker-composeの使い方ガイド
コンポーザー は、マルチコンテナ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:
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ハートビート・エフェクトのためのHTML+CSS
-
HTML ホテル フォームによるフィルタリング
-
HTML+cssのボックスモデル例(円、半円など)「border-radius」使いやすい
-
HTMLテーブルのテーブル分割とマージ(colspan, rowspan)
-
ランダム・ネームドロッパーを実装するためのhtmlサンプルコード
-
Html階層型ボックスシャドウ効果サンプルコード
-
QQの一時的なダイアログボックスをポップアップし、友人を追加せずにオンラインで話す効果を達成する方法
-
sublime / vscodeショートカットHTMLコード生成の実装
-
HTMLページを縮小した後にスクロールバーを表示するサンプルコード
-
html のリストボックス、テキストフィールド、ファイルフィールドのコード例