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


# 概要

Dockerイメージの作成方法を大雑把に把握したい。
そのため、**簡単なシェルを実行するのみのコンテナイメージを作成する。**
※Windows でDocker環境を構築する手順は[こちら](https://qiita.com/yuzutarogo/items/6b46c48e41b10949ba58)

## 作業の内容

- Alpine Linux上でシェルを実行する
- コンテナを起動するとシェルが実行され、「Hello, World!」と標準出力する
- イメージ名：shellsample
- コンテナ名：shellsample
- 階層構造は以下のとおり

```
shellsample
 ├ hello.sh
 └ Dockerfile
```

# サンプルシェルの作成

```:hello.sh
#!/bin/ash

echo "Hello, World!"
```

※改行コードは「LF」にて作成
※alpine linuxはbusyboxを元に作られていて、シェルにはashが使われている。[参考にしたページ](https://qiita.com/yutachaos/items/56dd7ea09d7e2b0d9173)

# Dockerfile の作成

```:Dockerfile
FROM alpine:latest

RUN mkdir /opt/shell
COPY hello.sh /opt/shell/
RUN chmod 755 /opt/shell/hello.sh
CMD ["/opt/shell/hello.sh"]
```
【補足】
**FROM**
　Dockerイメージのベースとなるイメージを指定する。
　指定するDockerイメージはDocker Hubに公開されているものを指定する。
**RUN**
　Dockerイメージビルド時にDockerコンテナ内で実行するコマンドを定義する。
**COPY**
　Dockerを動作させているホストマシン上のファイルなどをコンテナ内にコピーする。
**CMD**
　Dockerコンテナとして実行する際に、コンテナ内で実行するプロセスを指定する。

※[詳細はこちら](http://docs.docker.jp/engine/userguide/eng-image/dockerfile_best-practice.html)



# Docker image を作成しコンテナを実行

① PowerShellを起動する。
ショートカットキーの「Win + R」で「ファイル名を指定して実行」を起動し、「powershell」と入力し実行。

② Dockerfile 格納ディレクトリに移動。

③ Docker imageを作成

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

Sending build context to Docker daemon  3.072kB
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 108795c9aa54
Removing intermediate container 108795c9aa54
 ---> 6f1e9dc96d04
Successfully built 6f1e9dc96d04
Successfully tagged shellsample:latest
```

【補足】「docker image build」コマンドのフォーマット
> docker image build [options] \(Dockerfile配置ディレクトリのパス|URL)

※ -t オプション：任意のイメージ名を指定



④ コンテナ作成＆実行

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

Hello, World!
```


【補足】「docker container run」コマンドのフォーマット（新規にDockerコンテナを実行する）
> docker container run [options] イメージ名[:タグ名] [コマンド] [コマンド引数]

※ -it オプション：ホスト（手元のターミナル）とコンテナの標準入出力をつなげる
　（[こちらを参照](https://webdesign-manga.com/docker_run_option/)）
※ --name オプション：コンテナの名前を割り当てる
※ [詳細はこちら](http://docs.docker.jp/engine/reference/run.html)


# わかること

- 作業後のDockerイメージ一覧の確認

２つのDockerイメージができている。

```:Powershell
> docker image ls

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
shellsample         latest              6f1e9dc96d04        3 hours ago         5.61MB
alpine              latest              f70734b6a266        4 days ago          5.61MB
```

- 作業後のコンテナの状態

DockerfileのCMDで定義されているアプリケーション実行が終了したので、コンテナは「停止」状態となっている。

```:Powershell
> docker container ps -a

CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                   PORTS                    NAMES
7eabec82e384        shellsample           "/opt/shell/hello.sh"    3 hours ago         Exited (0) 3 hours ago                            shellsample
```

- コンテナを再度起動させると、標準出力が行われる。

```:Powershell
> docker container start -ai shellsample

Hello, World!
```

【補足】「docker container start」コマンドのフォーマット（新規にDockerコンテナを実行する）
> docker container start [options] イメージ名[:タグ名] [CONTAINER...]

※ -a オプション：コンテナの標準出力とDockerホストの標準出力を接続する
※ -i オプション：コンテナの標準入力とDockerホストの標準入力を接続する
※ [詳細はこちら](http://docs.docker.jp/engine/reference/commandline/start.html)

# 関連記事

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