LoginSignup
4
2

More than 3 years have passed since last update.

Dockerイメージの作成(初級3)

Last updated at Posted at 2020-04-28

概要

「docker container run」と「docker-compose」の対応関係がよく分からないので大雑把に把握したい。
「Dockerイメージの作成(初級1)」
1. Dockerイメージ作成(docker image buildコマンド)
2. コンテナ作成・起動(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で実現する。

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のファイルフォーマットバージョンを宣言している。※詳細

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」コマンドを実行するイメージ作成からコンテナ起動までを行う。

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 コマンドの概要

分かること

  • 作業後の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」コマンドは、コンテナが実行されている状態で実行が必要だが、本サンプルは、出力を行った後、すぐにコンテナは終了するので試せない。

関連記事

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2