$30 off During Our Annual Pro Sale. View Details »

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  8. 1. Docker Desktop って何?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  14. ● イメージにはコンテナ起動時にどんなコマンドを実行するか定義されている
    ○ 例)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. コンテナ起動時に実行する命令の指定方法

    View Slide

  15. 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 は指定したコマンドに
    なっている

    View Slide

  16. 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 を実行

    View Slide

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

    View Slide

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

    View Slide

  19. 4. volume マウント、 bind マウント、 Dockerfile の COPY 命令の違い
    dir-C/ 内のファイルを削除すると
    volume-A からも削除される

    ホストマシンには影響なし
    dir-D/ 内のファイルを削除すると、
    dir-B/ からも削除される

    ホストマシンに影響あり

    View Slide

  20. 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

    View Slide

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

    View Slide

  22. 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

    View Slide

  23. 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

    View Slide

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

    View Slide