Upgrade to Pro — share decks privately, control downloads, hide ads and more …

2022 Container Training #01

2022 Container Training #01

22新卒技術研修で実施したコンテナ研修の講義資料(コンテナ基礎編)です。
動画も後日公開予定です。

Kubernates基礎編
https://speakerdeck.com/mixi_engineers/2022-container-training-number-02-kubernates

※ハンズオン環境は提供していないので、ハンズオンを実際に試していただくことはできません。

B16717ef4b7aab0b253d933c3934f280?s=128

mixi_engineers

April 22, 2022
Tweet

More Decks by mixi_engineers

Other Decks in Programming

Transcript

  1. 2022年度 新入社員研修
 コンテナ
 開発本部CTO室 SREG 栗原 尚弘


  2. 自己紹介
 • 栗原 尚弘
 ◦ 18新卒
 • 社歴
 ◦ ライブエクスペリエンス事業本部

    18-20半ば
 ◦ 開発本部CTO室SREG 20半ば-今
 • Androidエンジニアとして入社しましたが
 紆余曲折あり今は、クラウドインフラを用いた
 インフラの構築&運用、ゲームの認証認可基盤の運用、
 ETLとDWH構築をやっています。
 • SNS
 ◦ https://www.instagram.com/k__naohiro

  3. 自己紹介 
 • 浅野 大我
 ◦ 20新卒
 ◦ などと言いつつ2018〜2019までインターンや内定者バイトをしていました
 •

    モンスト事業本部 ゲーム運営部
 モンストサーバ2グループ サーバチーム
 ◦ 兼務: 開発本部 セキュリティ室(4月〜)
 • モンストの開発や運用を
 していたりします
 • https://twitter.com/atpons
 • Google CloudのProfessional Cloud Architectを最近(?)とりました

  4. 本研修の目的
 • コンテナを利用して環境構築が出来る
 • 簡単なサイトを構築し挙動を理解しコンテナへの理解を深めていく


  5. 流れ
 • 前半の部 (13時ぐらいまで)
 ◦ コンテナについての基礎&ハンズオン
 • 後半の部
 ◦ kubernetesについての基礎&ハンズオン


  6. なぜコンテナ技術を学ぶのか
 • 弊社のプロジェクトに広く利用されているため
 • 弊社以外でも多くの企業で利用されている技術だから
 • コンテナ技術を雰囲気ではなく少し踏み込んで知って欲しいから


  7. dockerを利用しているproject (一例)


  8. コンテナ技術を少し踏み込んで知るメリット
 • docker以外のコンテナを選定できるようになる
 ◦ docker desktopの有料化に伴いdocker以外の選択する記事を見るようになりました
 ◦ dockerの有料が悪とかそういう意味ではなく、選択できるほどの知識を身につけよう


  9. docker architecture (一部省略)
 docker
 docker engine
 runc
 docker cli
 docker

    api
 containerd
 volumes
 buildkit
 networking

  10. docker architecture (一部省略)
 docker
 docker enging
 runc
 docker cli
 docker

    api
 containerd
 volumes
 buildkit
 networking
 ここの技術について知って欲しい

  11. containerd
 • 2016年12月14日 docker社がdocker engineのコアコンポーネントであるcontainerdをスピンア ウト
 • container imageのpull, push、コンテナの実行と監視等が利用できる


    • runcを利用している

  12. runc
 • OCI(Open Container Initiative)のリファレンス実装
 • containerdで利用されている
 • linux namespace,

    cgroups等をコンテナでも利用できるようにする
 ◦ macOSには上記に相当するものが無いのでコンテナを利用したい場合は
 linuxを動かす必要がある
 ◦ windowsにはHCS(Host Compute Service)といった上記に相当するものが実装されていてwindows containerを起動する際に利用される

  13. Open Container Initiative
 • コンテナの業界標準となる仕様を決めている
 ◦ Google, AWS, Microsoft, Docker等数々の名だたる企業が参加している


    • runtime-spec, image-specの二つの仕様がある
 ◦ runtime-spec
 ▪ コンテナのライフサイクル等動作に関わる標準化 
 ◦ image-spec
 ▪ コンテナイメージ仕様の標準化

  14. なぜdockerを使うのか?
 • コンテナを利用するためにはlinuxを動かす必要がある
 ◦ macOS上でVMかhypervisorなどを利用する必要がある
 ◦ docker desktopではその当たりが利用者に気にしなくても使える仕組みになっている
 ▪ Mac

    OS上でdocker desktopを起動するとappleのhypervisor frameworkを利用しlinuxを起動している 
 ▪ kernel patches, security fixesは良い感じにdockerが適用している 
 ▪ この楽さがここまで普及した理由の一つだと個人的には思っている 

  15. 結局docker以外のコンテナって何選べば良いのよ?
 • containerdを利用するのが無難です
 ◦ dockerから移行とかになったとき、そもそもdockerはcotainerdを利用しているので
 動作に差異が生じない
 ◦ docker cliによせたcliが存在する
 https://github.com/containerd/nerdctl

  16. step1 静的サイトを動かしてみよう
 • dockerを利用してnginxから静的サイトを配信できるようにする
 • 起動に必要なファイルは 2022BeginnerTraningContainer/step1 に入ってます


  17. step1のファイル構成
 • Dockerfile
 • コンテナの起動に必要
 • index.html
 • 今回配信する静的ファイル
 •

    nginx.conf
 • 静的ファイルを配信するのに必要な
 nginxの設定
 • コンテナと関係ないのでこの内容には
 触れません

  18. Dockerfileとコンテナの関係性
 Dockerfile
 コンテナイメージ
 コンテナ
 build
 create


  19. Dockerfileとコンテナの関係性
 • Dockerfile
 • コンテナイメージを構築するための設計書
 • コンテナイメージ
 • コンテナを作成するための手順が記載された読み取り専用のテンプレート
 •

    コンテナ
 • アプリケーションが実行される

  20. step1のディレクトリに移動しコンテナイメージの作成
 Dockerfile
 コンテナイメージ
 build
 docker build -t $IMAGE_NAME . イメージの作成


    タグの命名
 (これが無いと何のイメージを作成したのか分からなくなる)
 contextの指定

  21. コンテナの作成
 コンテナイメージ
 コンテナ
 create
 docker run -d -p 80:80 $IMAGE_NAME

    コンテナの起動と作成
 portの指定

  22. ブラウザを通してlocalhostに接続してよう


  23. コンテナを止めてみよう
 • docker container ls
 • 起動しているコンテナを一覧表示する
 • docker stop

    $CONTAINER_ID
 • 指定したコンテナを止める
 • (例) docker stop 9b18a51729d3

  24. Dockerfileの見方


  25. Dockerfileの見方


  26. FROMについて
 Docker社のContainer Registryである
 
Docker hubからダウンロードしている


  27. コンテナイメージを選ぶときの目安
 FROMは必ずDocker Official Imagesから選択しましょう


  28. コンテナイメージを選ぶときの目安
 • 身元の分からないコンテナイメージを選択するとバックドアが仕掛けられていた
 ケースがあります
 • https://www.bleepingcomputer.com/news/security/17-backdoored-docker-images-removed-from-do cker-hub/
 • 暗号通貨がマイニングされていたとのこと


  29. Dockerfileの見方


  30. Dockerfileの見方


  31. Dockerfileの見方


  32. Dockerfileの見方


  33. Dockerfileの見方


  34. Dockerfileの見方


  35. step2 混乱しやすい命令たち
 このDockerfileもstep1と同じ動作をします


  36. step2 混乱しやすい命令たち


  37. step2 混乱しやすい命令たち


  38. 動作に違いが無いのになぜ宣言が異なるのか…?
 


  39. ADDとCOPYの違い
 • ADD
 ◦ .tar の展開とコピーが同時に出来る
 ◦ 外部ファイルのダウンロードが出来る
 • COPY


    ◦ コピーしか出来ない

  40. どっち使えば良いのか?
 • .tarを展開したいなど明確な理由が無い場合はCOPYでよい
 ◦ ADDだといろいろ機能がつきすぎて透過的では無いため
 ◦ 公式のベストプラクティスにもそう書いてある
 ▪ https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#add-or-copy


  41. CMDを利用した例


  42. ENTRYPOINTを利用した例


  43. CMDとENTRYPOINTを利用した例


  44. 違いから分かる注意点
 • DockerfileにCMDしか書かない場合はFROMで指定するイメージで
 利用されるENTRYPOINTに注意する必要がある
 ◦ CMDに書かれたコマンドが意図通りに動作するとは限らないため
 ◦ 不安なら自分でENTRYPOINTで指定してあげると良い
 ▪ 複数ENTRYPOINTがある場合、一番最後に書かれたENTRYPOINTが
有効になる


  45. step3 動的サイトをdocker composeを利用して起動する
 • Goで作られたAPIサーバをdocker composeを用いて構築する
 localhost


  46. docker composeとは
 • 開発環境で複数のコンテナを動かすときに使うことが多い
 • 何のコンテナがどのように動いているのかが定義されていたりコンテナの起動順序を指定で きたりする
 • AWS ECSではdocker

    composeのファイルをそのまま利用できるサービスを提供している
 ◦ https://aws.amazon.com/jp/blogs/news/automated-software-delivery-using-docker-compose-and-a mazon-ecs/
 

  47. step3のファイル構成
 • step3/docker/app/Dockerfile
 ◦ アプリケーションコンテナの起動に必要
 • step3/docker/mysql/volumes
 ◦ mysqlのデータを保存する場所
 •

    step3/docker-compose.yml
 ◦ アプリケーションコンテナとmysqlコンテナを
 制御するために必要

  48. 実際に動かして見よう
 • コマンド実行時のディレクトリは 2021BeginnerTraningContainer/step3 直下を想定していま す
 ◦ M1 Macの方は必ずdocker-compose.ymlの33行目のコメントアウトを外してください
 •

    docker compose build
 ◦ docker-compose.ymlの内容に沿ってイメージを作成
 • docker compose up -d
 ◦ docker-compose.ymlの内容に沿ってコンテナの起動
 • docker compose exec app ./bin/generator
 ◦ appコンテナにあるgeneratorを起動し
 databaseのmigrationを行います
 • docker compose stop
 ◦ docker-compose.ymlに定義されているコンテナが停止する

  49. ブラウザを通してlocalhostに接続しよう
 http://localhost:8081/users/1/image
 http://localhost:8081/users/1


  50. docker-compose.yml の見方


  51. docker-compose.yml の見方


  52. docker-compose.yml の見方


  53. docker-compose.yml の見方


  54. docker-compose.yml の見方


  55. docker-compose.yml の見方


  56. docker-compose.yml の見方


  57. docker-compose.yml の見方


  58. docker-compose.yml の見方