Slide 1

Slide 1 text

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


Slide 2

Slide 2 text

自己紹介
 ● 栗原 尚弘
 ○ 18新卒
 ● 社歴
 ○ ライブエクスペリエンス事業本部 18-20半ば
 ○ 開発本部CTO室SREG 20半ば-今
 ● Androidエンジニアとして入社しましたが
 紆余曲折あり今は、クラウドインフラを用いた
 インフラの構築&運用、ゲームの認証認可基盤の運用、
 ETLとDWH構築をやっています。
 ● SNS
 ○ https://www.instagram.com/k__naohiro


Slide 3

Slide 3 text

自己紹介 
 ● 浅野 大我
 ○ 20新卒
 ○ などと言いつつ2018〜2019までインターンや内定者バイトをしていました
 ● モンスト事業本部 ゲーム運営部
 モンストサーバ2グループ サーバチーム
 ○ 兼務: 開発本部 セキュリティ室(4月〜)
 ● モンストの開発や運用を
 していたりします
 ● https://twitter.com/atpons
 ● Google CloudのProfessional Cloud Architectを最近(?)とりました


Slide 4

Slide 4 text

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


Slide 5

Slide 5 text

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


Slide 6

Slide 6 text

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


Slide 7

Slide 7 text

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


Slide 8

Slide 8 text

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


Slide 9

Slide 9 text

docker architecture (一部省略)
 docker
 docker engine
 runc
 docker cli
 docker api
 containerd
 volumes
 buildkit
 networking


Slide 10

Slide 10 text

docker architecture (一部省略)
 docker
 docker enging
 runc
 docker cli
 docker api
 containerd
 volumes
 buildkit
 networking
 ここの技術について知って欲しい


Slide 11

Slide 11 text

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


Slide 12

Slide 12 text

runc
 ● OCI(Open Container Initiative)のリファレンス実装
 ● containerdで利用されている
 ● linux namespace, cgroups等をコンテナでも利用できるようにする
 ○ macOSには上記に相当するものが無いのでコンテナを利用したい場合は
 linuxを動かす必要がある
 ○ windowsにはHCS(Host Compute Service)といった上記に相当するものが実装されていてwindows containerを起動する際に利用される


Slide 13

Slide 13 text

Open Container Initiative
 ● コンテナの業界標準となる仕様を決めている
 ○ Google, AWS, Microsoft, Docker等数々の名だたる企業が参加している
 ● runtime-spec, image-specの二つの仕様がある
 ○ runtime-spec
 ■ コンテナのライフサイクル等動作に関わる標準化 
 ○ image-spec
 ■ コンテナイメージ仕様の標準化


Slide 14

Slide 14 text

なぜdockerを使うのか?
 ● コンテナを利用するためにはlinuxを動かす必要がある
 ○ macOS上でVMかhypervisorなどを利用する必要がある
 ○ docker desktopではその当たりが利用者に気にしなくても使える仕組みになっている
 ■ Mac OS上でdocker desktopを起動するとappleのhypervisor frameworkを利用しlinuxを起動している 
 ■ kernel patches, security fixesは良い感じにdockerが適用している 
 ■ この楽さがここまで普及した理由の一つだと個人的には思っている 


Slide 15

Slide 15 text

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


Slide 16

Slide 16 text

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


Slide 17

Slide 17 text

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


Slide 18

Slide 18 text

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


Slide 19

Slide 19 text

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


Slide 20

Slide 20 text

step1のディレクトリに移動しコンテナイメージの作成
 Dockerfile
 コンテナイメージ
 build
 docker build -t $IMAGE_NAME . イメージの作成
 タグの命名
 (これが無いと何のイメージを作成したのか分からなくなる)
 contextの指定


Slide 21

Slide 21 text

コンテナの作成
 コンテナイメージ
 コンテナ
 create
 docker run -d -p 80:80 $IMAGE_NAME コンテナの起動と作成
 portの指定


Slide 22

Slide 22 text

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


Slide 23

Slide 23 text

コンテナを止めてみよう
 • docker container ls
 • 起動しているコンテナを一覧表示する
 • docker stop $CONTAINER_ID
 • 指定したコンテナを止める
 • (例) docker stop 9b18a51729d3


Slide 24

Slide 24 text

Dockerfileの見方


Slide 25

Slide 25 text

Dockerfileの見方


Slide 26

Slide 26 text

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


Slide 27

Slide 27 text

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


Slide 28

Slide 28 text

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


Slide 29

Slide 29 text

Dockerfileの見方


Slide 30

Slide 30 text

Dockerfileの見方


Slide 31

Slide 31 text

Dockerfileの見方


Slide 32

Slide 32 text

Dockerfileの見方


Slide 33

Slide 33 text

Dockerfileの見方


Slide 34

Slide 34 text

Dockerfileの見方


Slide 35

Slide 35 text

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


Slide 36

Slide 36 text

step2 混乱しやすい命令たち


Slide 37

Slide 37 text

step2 混乱しやすい命令たち


Slide 38

Slide 38 text

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


Slide 39

Slide 39 text

ADDとCOPYの違い
 ● ADD
 ○ .tar の展開とコピーが同時に出来る
 ○ 外部ファイルのダウンロードが出来る
 ● COPY
 ○ コピーしか出来ない


Slide 40

Slide 40 text

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


Slide 41

Slide 41 text

CMDを利用した例


Slide 42

Slide 42 text

ENTRYPOINTを利用した例


Slide 43

Slide 43 text

CMDとENTRYPOINTを利用した例


Slide 44

Slide 44 text

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


Slide 45

Slide 45 text

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


Slide 46

Slide 46 text

docker composeとは
 ● 開発環境で複数のコンテナを動かすときに使うことが多い
 ● 何のコンテナがどのように動いているのかが定義されていたりコンテナの起動順序を指定で きたりする
 ● AWS ECSではdocker composeのファイルをそのまま利用できるサービスを提供している
 ○ https://aws.amazon.com/jp/blogs/news/automated-software-delivery-using-docker-compose-and-a mazon-ecs/
 


Slide 47

Slide 47 text

step3のファイル構成
 ● step3/docker/app/Dockerfile
 ○ アプリケーションコンテナの起動に必要
 ● step3/docker/mysql/volumes
 ○ mysqlのデータを保存する場所
 ● step3/docker-compose.yml
 ○ アプリケーションコンテナとmysqlコンテナを
 制御するために必要


Slide 48

Slide 48 text

実際に動かして見よう
 ● コマンド実行時のディレクトリは 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に定義されているコンテナが停止する


Slide 49

Slide 49 text

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


Slide 50

Slide 50 text

docker-compose.yml の見方


Slide 51

Slide 51 text

docker-compose.yml の見方


Slide 52

Slide 52 text

docker-compose.yml の見方


Slide 53

Slide 53 text

docker-compose.yml の見方


Slide 54

Slide 54 text

docker-compose.yml の見方


Slide 55

Slide 55 text

docker-compose.yml の見方


Slide 56

Slide 56 text

docker-compose.yml の見方


Slide 57

Slide 57 text

docker-compose.yml の見方


Slide 58

Slide 58 text

docker-compose.yml の見方