Chapter 03

Docker の基礎知識

ほげさん
ほげさん
2021.12.05に更新

以前公開した Book から抜粋して、超簡単に Docker について整理します

https://zenn.dev/suzuki_hoge/books/2021-04-docker-picture-60fbe950136be9c7ad85

必要に応じてご覧ください

1. Dockerfile はイメージを作る指示書

Dockerfile にはインストールするコマンドや起動時に実行する処理が書いてあります

docker build で Dockerfile からイメージを作ります

$ docker build -t my-php -f Dockerfile .

$ docker image ls
REPOSITORY             TAG       IMAGE ID       CREATED         SIZE
my-php                 latest    3ac11926df72   7 days ago      441MB

🤔 Dockerfile のコマンドは基本的に docker build でイメージを作る時に実行されます[1]

2. コンテナはイメージを起動したもの

イメージを docker run するとコンテナが起動します

$ docker run -i -t my-php
Interactive shell

php >

イメージは Dockerfile により起動時に行うコマンドが決まっています
my-php イメージは php -a で対話モードを起動します

Dockerfile の起動時コマンドは、docker run の引数で上書きできます

$ docker run -i -t my-php echo hello
hello

🤔 docker run が具体的にどういうコマンドを実行することになるのか把握しましょう

3. イメージが手元になければ docker pull される

docker run で指定したイメージは、手元になければ Docker Hub からダウンロードされます

Intel Mac
$ docker run -it alpine:latest uname -m
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
x86_64

$ docker image ls
REPOSITORY    TAG       IMAGE ID        CREATED        SIZE
alpine        latest    c059bfaa849c    10 days ago    5.59MB
ARM Mac
$ docker run -it alpine:latest uname -m
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
aarch64

$ docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
alpine        latest    e1d7573f448    10 days ago    5.33MB

docker pull では Mac のアーキテクチャと同じアーキテクチャのイメージが選ばれます

同じコマンドでも IMAGE ID が違いますね

🤔 Intel Mac と ARM Mac では同じコマンドでも違う結果になることを理解しましょう

4. 取得するイメージのアーキテクチャを明示できる

--platform オプションを付けると、取得するイメージのアーキテクチャを明示できます

ARM Mac
$ docker image rm -f alpine:latest        # 一度取得してしまったので削除

$ docker run --platform linux/x86_64 -it alpine:latest uname -m
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
x86_64

$ docker image ls
REPOSITORY    TAG       IMAGE ID        CREATED        SIZE
alpine        latest    c059bfaa849c    10 days ago    5.59MB

docker run の結果も IMAGE ID も Intel Mac と同じです

この状態で --platform を外して docker run すると、再取得されずにこれが使われます

ARM Mac
$ docker run -it alpine:latest uname -m
x86_64

手元に Intel イメージがあっても、ARM イメージを明示すれば取得されます

ARM Mac
$ docker run --platform linux/arm64/v8 -it alpine:latest uname -m
Unable to find image 'alpine:latest' locally
aarch64

ややこしいですが整理しておきましょう

image

image

🤔 イメージ取得のタイミングとアーキテクチャの決まり方をきっちり理解しましょう

4. コンテナは1つの命令を完了したら終了する

「ビルドする」「テストする」みたいなコンテナはすぐ破棄されます

$ docker run -it ruby:2.7.5 ruby -e 'puts "hello world"'
hello world

$ docker ps
CONTAINER ID   IMAGE         COMMAND                   CREATED          STATUS            PORTS    NAMES

「開発サーバ」みたいなコンテナはサーバを終了するまで存在します

$ docker run -it ruby:2.7.5 ruby -rwebrick -e 'WEBrick::HTTPServer.new(:DocumentRoot => "./").start'
[2021-12-05 11:55:55] INFO  WEBrick 1.6.1
[2021-12-05 11:55:55] INFO  ruby 2.7.5 (2021-11-24) [aarch64-linux]
[2021-12-05 11:55:55] INFO  WEBrick::HTTPServer#start: pid=1 port=80

$ docker ps    # 別のタブで
CONTAINER ID   IMAGE         COMMAND                   CREATED            STATUS          PORTS    NAMES
f11cfd769b38   ruby:2.7.5    "ruby -rwebrick -e '…"    13 seconds ago    Up 13 seconds             friendly_wing

-d オプションでバックグラウンド実行にした場合は、同じ命令でもターミナルは固まりません

$ docker run -d -it ruby:2.7.5 ruby -rwebrick -e 'WEBrick::HTTPServer.new(:DocumentRoot => "./").start'

$

$ docker ps    # 同じタブで
CONTAINER ID   IMAGE         COMMAND                   CREATED           STATUS           PORTS    NAMES
1605807b0e61   ruby:2.7.5    "ruby -rwebrick -e '…"    18 seconds ago    Up 18 seconds             compassionate_stonebraker

🤔 コンテナの状態と破棄タイミングを理解し、正常終了かエラーで落ちたのか判別しましょう

5. Docker Compose は docker x をまとめて実行するもの

DB 立ててメールサーバ立てて開発サーバ立てて...
コンテナをネットワークで繋いで...
ブラウザから見られるようにポートの調整をして...
開発サーバのコードが Mac のエディタで編集できるようにマウントして...

というあれやこれやを docker xxx で頑張るのは大変なので yaml で書けるようにしたものです

docker xxx に書き下せるはずで、エラー対応時は臨機応変にデバッグするスキルが求められます

🤔 Dockerfile や docker xxx を理解し、次に Docker Compose との対応付けを理解しましょう

脚注
  1. CMDENTRYPOINT などは起動時です ↩︎