Slide 1

Slide 1 text

技術書LT #11 実践 Docker ソフトウェアエンジニアの「Docker よくわからない」を終わりにする本 2022-11-22 山本雄太

Slide 2

Slide 2 text

Webで無料で読めます https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59

Slide 3

Slide 3 text

● 「Docker よくわからない」を終わりにする本 ● 感想: 今まで何となくの理解でやってた部分がちゃんと説明されていてスッキリした ○ Docker って仮想 OS 的…ではない? ○ docker run と docker exec て何が違うの? ○ docker exec -it bash の bash の部分って何? ○ etc… どんな本?

Slide 4

Slide 4 text

どんな内容? 概念理解 基礎 実践

Slide 5

Slide 5 text

● Docker触ったことない人 ○ この本の内容一通りやれば、理解も実際に手を動かす部分もバッチリになれる ● とりあえず動かしながらDockerを始めた人 ○ (山本はこのパターン) ○ 本の前1/4の内容は、手を動かしながら始めるとすっ飛ばしがちな内容が多い(と感じた) どんな人に(特に)オススメ?

Slide 6

Slide 6 text

「本の前1/4」て具体的にどの辺? 概念理解 基礎 実践

Slide 7

Slide 7 text

1. Docker Desktop って何? 2. Docker コンテナは仮想 OS っぽいけど仮想 OS ではない 3. コンテナ起動時に実行する命令の指定方法 4. volume マウント、 bind マウント、 Dockerfile の COPY 命令の違い 5. Docker Hub のレイヤー情報の見方 ここからは山本が個人的に勉強になった点を抜粋して紹介します

Slide 8

Slide 8 text

1. Docker Desktop って何?

Slide 9

Slide 9 text

● Windows や Mac で Docker を使うためのデスクトップアプリ ● Docker を動かすための一式が入っている ○ Linux カーネル, Docker Engine, Docker Compose, Kubenetes, etc… → だから Linux 以外の OS でも Docker が使えるようになる 1. Docker Desktop って何? 図の引用: 1部: Docker とは|実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わ りにする本 図の引用: 1部: 仮想化とは|実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わ りにする本

Slide 10

Slide 10 text

2. Docker コンテナは 仮想 OS っぽいけど仮想 OS ではない

Slide 11

Slide 11 text

● 実体は Linux の Namespace (名前空間)という機構で分離された1プロセス ● 名前空間とは… ○ Linux カーネル内のグローバルなリソースを管理する機構 ○ プロセスIDやファイルシステムのマウントポイント等を管理 ○ これにより、ホスト-ゲスト間、ゲスト間の環境分離が可能に ● 「Linux の Namespace 自体はもう 20 年近く存在する技術であり、それをコンテナ やイメージというものを用いて扱いやすくした技術が Docker」らしい 2. Docker コンテナは仮想 OS っぽいけど仮想 OS ではない この PID 2 を kill しても... この PID 2 には 影響なし 元の図: Linuxカーネル4.1の名前空間(ドラフト)

Slide 12

Slide 12 text

● なので、実際にはホストマシン上の Linux カーネルを利用している ○ Intel Mac だと動くのに M1 Mac だと動かない事象が発生するのはこれが原因 2. Docker コンテナは仮想 OS っぽいけど仮想 OS ではない カーネルが違う 元の図: 1部: 仮想化とは|実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わりにする本

Slide 13

Slide 13 text

3. コンテナ起動時に実行する命令の 指定方法

Slide 14

Slide 14 text

● イメージにはコンテナ起動時にどんなコマンドを実行するか定義されている ○ 例)Nginx イメージの場合:  CMD ["nginx" "-g" "daemon off;"]  ● 起動時に実行するコマンドは自分で指定できる ○ Dockerfile の CMD 命令 ○ docker exec [option] command(←コレ) ○ docker-compose.yml の command: ● 指定した場合、次の優先度でコマンドは上書きされる ○ docker-compose.yml の command: = docker exec の command > Dockerfile の CMD 命令 > イメージで指定されたコマンド 3. コンテナ起動時に実行する命令の指定方法

Slide 15

Slide 15 text

3. コンテナ起動時に実行する命令の指定方法 $ docker container run \ --name nginx1 \ --rm \ --detach \ nginx:1.21 $ docker container run \ --name nginx2 \ --rm \ --interactive \ --tty \ nginx:1.21 \ bash そのままコンテナを起動した場合 起動時に bash を 実行するよう指定した場合 # ps x PID TTY STAT TIME COMMAND 1 ? Ss 0:00 nginx: master process nginx -g daemon off; 36 pts/0 Ss 0:00 bash 387 pts/0 R+ 0:00 ps x # ps PID TTY TIME CMD 1 pts/0 00:00:00 bash 346 pts/0 00:00:00 ps コンテナ内で ps を実行した結果 コンテナ内で ps を実行した結果 PID 1 はイメージで指定されたコマンド( Nginx の起動コマンド)に なっている PID 1 は指定したコマンドに なっている

Slide 16

Slide 16 text

3. コンテナ起動時に実行する命令の指定方法 $ docker container run \ --name ubuntu1 \ --rm \ --interactive \ --tty \ my-ubuntu CMD $ docker container run \ --name ubuntu1 \ --rm \ --interactive \ --tty \ my-ubuntu \ echo "exec" exec $ docker-compose up [+] Running 2/0 ⠿ Network tech-book-lt_default Created 0.0s ⠿ Container tech-book-lt-sample-1 Created 0.0s Attaching to tech-book-lt-sample-1 tech-book-lt-sample-1 | compose tech-book-lt-sample-1 exited with code 0 CMD 命令の通り “CMD” と出る (イメージ指定の命令は上書きされる ) 指定通り “exec” と出る ( CMD 命令は上書きされる) 指定通り “compose” と出る ( CMD 命令は上書きされる) FROM ubuntu:20.04 CMD ["echo", "CMD"] Dockerfile version: '3' services: sample: image: my-ubuntu tty: true command: echo "compose" docker-compose.yml 起動時に echo “CMD” を実行 起動時に echo “compose” を実行 そのままコンテナを起動した場合 docker exec で指定した場合 docker-compose.yml で指定した場合 起動時に echo “exec” を実行 Ubuntu イメージのレイヤー 起動時に bash を実行

Slide 17

Slide 17 text

4. volume マウント、 bind マウント、 Dockerfile の COPY 命令の違い

Slide 18

Slide 18 text

4. volume マウント、 bind マウント、 Dockerfile の COPY 命令の違い 効果 ホストマシンとの関係 volume マウント Docker が管理する領域をコンテナ内の指定ディレクトリ に割り当てる ホストマシンからはアクセスできない =ファイルを削除したりしてもホストマシンには影響が出ない bind マウント ホストマシンの指定ディレクトリ をコンテナ内の指定ディレ クトリに割り当てる ホストマシンからアクセスできる =ファイルを削除するとホストマシンからも消える Dockerfile の COPY 命令 指定ファイルをイメージビルド時にコピー する コンテナを起動するとファイルが存在 →変更の反映にはイメージの再ビルドが必要

Slide 19

Slide 19 text

4. volume マウント、 bind マウント、 Dockerfile の COPY 命令の違い dir-C/ 内のファイルを削除すると volume-A からも削除される ↓ ホストマシンには影響なし dir-D/ 内のファイルを削除すると、 dir-B/ からも削除される ↓ ホストマシンに影響あり

Slide 20

Slide 20 text

4. volume マウント、 bind マウント、 Dockerfile の COPY 命令の違い COPY 命令 bind マウント COPY bind マウント イメージビルド時に COPY コンテナ起動時に bind マウント 元の図: https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59/viewer/3-5-bind-mount

Slide 21

Slide 21 text

5. Docker Hub のレイヤー情報の見方 (例: rails:5.0.1 イメージの場合)

Slide 22

Slide 22 text

5. Docker Hub のレイヤー情報の見方(例: rails:5.0.1 イメージの場合) Rails イメージの Tag ページにあるレイヤー情報 22 レイヤー Rails のリポジトリにある Dockerfile 4 レイヤー なぜ違う? 元の図: https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59/viewer/2-8-dockerfile

Slide 23

Slide 23 text

5. Docker Hub のレイヤー情報の見方(例: rails:5.0.1 イメージの場合) ruby:2.3 のレイヤー ( 18 レイヤー) Rails の Dockerfile ( 4 レイヤー) 元の図: https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae3 6c33424b59/viewer/2-8-dockerfile

Slide 24

Slide 24 text

ご清聴ありがとうございました!