Dockerイメージの作成（初級３）

# 概要

「docker container run」と「docker-compose」の対応関係がよく分からないので大雑把に把握したい。
[「Dockerイメージの作成（初級１）」](https://qiita.com/yuzutarogo/items/66c22ea2dec593980169)の
1. Dockerイメージ作成（docker image buildコマンド）
2. コンテナ作成・起動（docker container runコマンド）
を**docker-composeにて置き換えて実施する**。

## 作業の内容

- 作成するコンテナは「[Dockerイメージの作成（初級１）](https://qiita.com/yuzutarogo/items/66c22ea2dec593980169)」と同様
 - Alpine Linux上でシェルを実行する
 - コンテナを起動するとシェルが実行され、「Hello, World!」と出力する
 - イメージ名：shellsample
 - コンテナ名：shellsample
- Dockerイメージの作成とコンテナ実行までを行うdocker-compose.ymlを用意する
- 「docker-compose up」コマンドでコンテナが起動すると期待した出力が行われる
- [「初級２」](https://qiita.com/yuzutarogo/items/6e913909ae8190ac74c6)までに作成したコンテナ、Dockerイメージは事前に削除しておく
- 今回はComposeを覚える目的であるため、起動するコンテナは１つとする
- 階層構造は以下のとおり

```
shellsample
 ├ hello.sh
 ├ Dockerfile
 └ docker-compose.yml
```

# Docker Composeとは

Docker Composeはyaml形式の設定ファイルで、複数のコンテナ実行を一括で管理できる。
コマンドを１つ実行するだけで、設定した全てのサービスを作成・起動する。
※[詳細はこちら](http://docs.docker.jp/compose/overview.html)

# docker-composeに置き換えるコマンド

①「docker image build」と同等のことをdocker-composeで実現する。

```:Powershell
> docker image build -t shellsample .
```

②「docker container run」コマンドと同等のことをdocker-composeで実現する。

```:Powershell
> docker container run -it --name shellsample shellsample
```

# docker-compose.ymlの作成

```: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のファイルフォーマットバージョンを宣言している。※[詳細](https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/)

**build**

　**context**
　Dockerfile を含むディレクトリへのパスを設定 ※[詳細](https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/#context)　

　**dockerfile**
　指定されたパスの Dockerfile を使ってビルドを行う。 ※[詳細](https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/#dockerfile)　

**image**
build に加えて image も指定した場合、Compose はビルドイメージに名前をつける。　※[詳細](https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/#build)　

**container_name**
デフォルトのコンテナー名ではない、独自のコンテナー名を設定する　※[詳細](https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/#container_name)

**stdin_open**
「docker container run」のオプションに対応づいている（iオプションに相当）。
コンテナの標準入力とDockerホストの標準入力を接続する。

**tty**
「docker container run」のオプションに対応づいている（tオプションに相当）。
コンテナの標準出力とDockerホストの標準出力を接続する。

# Dockerイメージ作成＆コンテナ起動

「docker-compose up」コマンドを実行するイメージ作成からコンテナ起動までを行う。

```:Powershell
> 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-compose コマンドの概要](http://docs.docker.jp/compose/reference/overview.html)


# 分かること

- 作業後のDockerイメ―ジ一覧

Dockerイメージを作成できている。また、「image」で指定したイメージ名（shellsample）になっている。

```:Powershell
> 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」コンテナが作成された。

```:Powershell
> 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
```

- コンテナを再度起動したときに出力がなされるか確認

出力されない。

```:Powershell
> docker-compose start
Starting shell ... done     
```
おそらく、「stdin_open: true」「tty: true」の設定をしたとしても実際にコンテナの標準入出力がアタッチされるのは「docker attach」コマンドを実行したあとであろうと思う。「docker attach」コマンドは、コンテナが実行されている状態で実行が必要だが、本サンプルは、出力を行った後、すぐにコンテナは終了するので試せない。


# 関連記事

- [Windows10でDocker環境構築手順](https://qiita.com/yuzutarogo/items/6b46c48e41b10949ba58)
- [Dockerイメージの作成（初級１）](https://qiita.com/yuzutarogo/items/66c22ea2dec593980169)
- [Dockerイメージの作成（初級２）](https://qiita.com/yuzutarogo/items/6e913909ae8190ac74c6)