Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

技術書LT #11 実践 Docker - ソフトウェアエンジニアの「Docker よくわか...

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

yamamoto-yuta

July 05, 2023
Tweet

More Decks by yamamoto-yuta

Other Decks in Technology

Transcript

  1. • 「Docker よくわからない」を終わりにする本 • 感想: 今まで何となくの理解でやってた部分がちゃんと説明されていてスッキリした ◦ Docker って仮想 OS

    的…ではない? ◦ docker run と docker exec て何が違うの? ◦ docker exec -it <container> bash の bash の部分って何? ◦ etc… どんな本?
  2. 1. Docker Desktop って何? 2. Docker コンテナは仮想 OS っぽいけど仮想 OS

    ではない 3. コンテナ起動時に実行する命令の指定方法 4. volume マウント、 bind マウント、 Dockerfile の COPY 命令の違い 5. Docker Hub のレイヤー情報の見方 ここからは山本が個人的に勉強になった点を抜粋して紹介します
  3. • Windows や Mac で Docker を使うためのデスクトップアプリ • Docker を動かすための一式が入っている

    ◦ Linux カーネル, Docker Engine, Docker Compose, Kubenetes, etc… → だから Linux 以外の OS でも Docker が使えるようになる 1. Docker Desktop って何? 図の引用: 1部: Docker とは|実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わ りにする本 図の引用: 1部: 仮想化とは|実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わ りにする本
  4. • 実体は Linux の Namespace (名前空間)という機構で分離された1プロセス • 名前空間とは… ◦ Linux

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

    だと動かない事象が発生するのはこれが原因 2. Docker コンテナは仮想 OS っぽいけど仮想 OS ではない カーネルが違う 元の図: 1部: 仮想化とは|実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わりにする本
  6. • イメージにはコンテナ起動時にどんなコマンドを実行するか定義されている ◦ 例)Nginx イメージの場合:  CMD ["nginx" "-g" "daemon off;"] 

    • 起動時に実行するコマンドは自分で指定できる ◦ Dockerfile の CMD 命令 ◦ docker exec [option] <container> command(←コレ) ◦ docker-compose.yml の command: • 指定した場合、次の優先度でコマンドは上書きされる ◦ docker-compose.yml の command: = docker exec の command > Dockerfile の CMD 命令 > イメージで指定されたコマンド 3. コンテナ起動時に実行する命令の指定方法
  7. 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 は指定したコマンドに なっている
  8. 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 を実行
  9. 4. volume マウント、 bind マウント、 Dockerfile の COPY 命令の違い 効果

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

    内のファイルを削除すると volume-A からも削除される ↓ ホストマシンには影響なし dir-D/ 内のファイルを削除すると、 dir-B/ からも削除される ↓ ホストマシンに影響あり
  11. 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
  12. 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
  13. 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