概要
「docker container run」と「docker-compose」の対応関係がよく分からないので大雑把に把握したい。
「Dockerイメージの作成(初級1)」の
「作成したDockerイメージから、docker container runでコンテナを実行」を
**「作成したDockerイメージから、docker-composeにてコンテナ実行」**に置き換えてみる。
作業の内容
- こちらで作成したDockerイメージを利用する
- Dockerイメージを単に実行するだけのdocker-compose.ymlを用意する
- 「docker-compose up」コマンドでコンテナを起動する。シェルが実行されて「Hello, World!」と出力する
- イメージ名:shellsample
- コンテナ名:shellsample
- 「初級1」で作成したコンテナは「docker container rm」コマンドで事前に削除しておく
- 今回はComposeを覚える目的であるため、起動するコンテナは1つとする
- 階層構造は以下のとおり
shellsample
├ hello.sh
├ Dockerfile
└ docker-compose.yml
Docker Composeとは
Docker Composeはyaml形式の設定ファイルで、複数のコンテナ実行を一括で管理できる。
コマンドを1つ実行するだけで、設定した全てのサービスを作成・起動する。
※詳細はこちら
docker-composeに置き換えるコマンド
以下の「docker container run」コマンドと同等のことをdocker-composeで実現する。
> docker container run -it --name shellsample shellsample
docker-compose.ymlの作成
version: "3.3"
services:
shell:
image: shellsample:latest
container_name: shellsample
stdin_open: true
tty: true
【補足】
version: "3.3"
docker-compose.ymlのファイルフォーマットバージョンを宣言している。※詳細
image
コンテナーを起動させるイメージを設定。 ※詳細
container_name
デフォルトのコンテナー名ではない、独自のコンテナー名を設定する ※詳細
stdin_open
「docker container run」のオプションに対応づいている(iオプションに相当)。
コンテナの標準入力とDockerホストの標準入力を接続する。
tty
「docker container run」のオプションに対応づいている(tオプションに相当)。
コンテナの標準出力とDockerホストの標準出力を接続する。
コンテナ起動
「docker-compose up」コマンドでコンテナの作成と起動を行う。
> docker-compose up
Starting shellsample ... done
shellsample | Hello, World!
shellsample exited with code 0
※「Hello, World!」を出力できた
※本サンプルはバックグラウンド実行する必要がないため、「-d」オプションは指定していない。
分かること
- 作業後のコンテナ一覧
「docker container run」の時と同様に「shellsample」コンテナが作成された。
> docker container ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4701fb8ae2b7 shellsample:latest "/opt/shell/hello.sh" 51 minutes ago Exited (0) 3 minutes ago shellsample
- コンテナを再度起動したときに出力がなされるか確認
出力されない。
> docker-compose start
Starting shell ... done
おそらく、「stdin_open: true」「tty: true」の設定をしたとしても実際にコンテナの標準入出力がアタッチされるのは「docker attach」コマンドを実行したあとであろうと思う。「docker attach」コマンドは、コンテナが実行されている状態で実行が必要だが、本サンプルは、出力を行った後、すぐにコンテナは終了するので試せない。