概要
「docker container run」と「docker-compose」の対応関係がよく分からないので大雑把に把握したい。
「Dockerイメージの作成(初級1)」の
- Dockerイメージ作成(docker image buildコマンド)
- コンテナ作成・起動(docker container runコマンド)
をdocker-composeにて置き換えて実施する。
作業の内容
- 作成するコンテナは「Dockerイメージの作成(初級1)」と同様
- Alpine Linux上でシェルを実行する
- コンテナを起動するとシェルが実行され、「Hello, World!」と出力する
- イメージ名:shellsample
- コンテナ名:shellsample
- Dockerイメージの作成とコンテナ実行までを行うdocker-compose.ymlを用意する
- 「docker-compose up」コマンドでコンテナが起動すると期待した出力が行われる
- 「初級2」までに作成したコンテナ、Dockerイメージは事前に削除しておく
- 今回はComposeを覚える目的であるため、起動するコンテナは1つとする
- 階層構造は以下のとおり
shellsample
├ hello.sh
├ Dockerfile
└ docker-compose.yml
Docker Composeとは
Docker Composeはyaml形式の設定ファイルで、複数のコンテナ実行を一括で管理できる。
コマンドを1つ実行するだけで、設定した全てのサービスを作成・起動する。
※詳細はこちら
docker-composeに置き換えるコマンド
①「docker image build」と同等のことをdocker-composeで実現する。
> docker image build -t shellsample .
②「docker container run」コマンドと同等のことをdocker-composeで実現する。
> docker container run -it --name shellsample shellsample
docker-compose.ymlの作成
version: "3.3"
services:
shell:
build:
context: .
dockerfile: Dockerfile
image: shellsample
container_name: shellsample
stdin_open: true
tty: true
【補足】
version: "3.3"
docker-compose.ymlのファイルフォーマットバージョンを宣言している。※詳細
build
context
Dockerfile を含むディレクトリへのパスを設定 ※詳細
dockerfile
指定されたパスの Dockerfile を使ってビルドを行う。 ※詳細
image
build に加えて image も指定した場合、Compose はビルドイメージに名前をつける。 ※詳細
container_name
デフォルトのコンテナー名ではない、独自のコンテナー名を設定する ※詳細
stdin_open
「docker container run」のオプションに対応づいている(iオプションに相当)。
コンテナの標準入力とDockerホストの標準入力を接続する。
tty
「docker container run」のオプションに対応づいている(tオプションに相当)。
コンテナの標準出力とDockerホストの標準出力を接続する。
Dockerイメージ作成&コンテナ起動
「docker-compose up」コマンドを実行するイメージ作成からコンテナ起動までを行う。
> docker-compose up
Building shell
Step 1/5 : FROM alpine:latest
latest: Pulling from library/alpine
cbdbe7a5bc2a: Pull complete
Digest: sha256:9a839e63dad54c3a6d1834e29692c8492d93f90c59c978c1ed79109ea4fb9a54
Status: Downloaded newer image for alpine:latest
---> f70734b6a266
・・・省略・・・
Step 5/5 : CMD ["/opt/shell/hello.sh"]
---> Running in bc536cdc4f2f
Removing intermediate container bc536cdc4f2f
---> 41f2adcf037a
Successfully built 41f2adcf037a
Successfully tagged shellsample:latest
WARNING: Image for service shell was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating shellsample ... done
Attaching to shellsample
shellsample | Hello, World!
shellsample exited with code 0
※「Hello, World!」を出力できた
※本サンプルはバックグラウンド実行する必要がないため、「-d」オプションは指定していない。
分かること
- 作業後のDockerイメ―ジ一覧
Dockerイメージを作成できている。また、「image」で指定したイメージ名(shellsample)になっている。
> docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
shellsample latest 41f2adcf037a 9 minutes ago 5.61MB
alpine latest f70734b6a266 4 days ago 5.61MB
- 作業後のコンテナ一覧
「docker container run」の時と同様に「shellsample」コンテナが作成された。
> docker container ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6985b0405485 shellsample "/opt/shell/hello.sh" 13 minutes ago Exited (0) 13 minutes ago shellsample
- コンテナを再度起動したときに出力がなされるか確認
出力されない。
> docker-compose start
Starting shell ... done
おそらく、「stdin_open: true」「tty: true」の設定をしたとしても実際にコンテナの標準入出力がアタッチされるのは「docker attach」コマンドを実行したあとであろうと思う。「docker attach」コマンドは、コンテナが実行されている状態で実行が必要だが、本サンプルは、出力を行った後、すぐにコンテナは終了するので試せない。