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

コンテナ・K8s研修 - 前半 コンテナ基礎・ハンズオン【MIXI 24新卒技術研修】

コンテナ・K8s研修 - 前半 コンテナ基礎・ハンズオン【MIXI 24新卒技術研修】

本スライドは、MIXIの2024年度新卒向け技術研修で使用された資料です。

<科目名>
コンテナ・K8s研修

<関連リンク>
動画▶ https://youtu.be/-QJ3B7xwAmI

※お願い※ 〜 資料・動画・リポジトリのご利用について〜
公開している資料や動画は、是非、勉強会や社内の研修などにご自由にお使いいただければと思いますが、以下のような場でのご利用はご遠慮ください。
- 受講者から参加費や授業料など金銭を集めるような場での利用
(会場費や飲食費など勉強会の運営に必要な実費を集める場合は問題ありません)
- 出典を削除または改変しての利用

MIXI ENGINEERS

July 22, 2024
Tweet

Video

More Decks by MIXI ENGINEERS

Other Decks in Technology

Transcript

  1. 自己紹介 
 • 浅野 大我
 ◦ 20 新卒
 ◦ などと言いつつ

    2018〜2019 までインターンや内定者バイトをしていました
 • デジタルエンターテインメント事業本部
 モンストゲーム運営部 モンストサーバ2グループサーバチーム
 ◦ 兼務: セキュリティ室
 • モンスト 開発や運用をしていたりします
 • https://twitter.com/atpons

  2. 自己紹介
 • 宗形 翼
 ◦ 22 新卒
 • 開発本部 C 室

    E グループ
 • Go を書いたりしています

  3. Docker 等インストール確認 
 • gcloud auth list
 ◦ 会社 メールアドレスが出てくるか確認


    • docker version
 ◦ erver: Docker Desktop 4.28.0 がでてくる
 • GitHub リポジトリにアクセスできる
 ◦ https://github.com/mixigroup/2024Beginner rainingContainer
 • gcloud auth configure-docker asia-northeast1-docker.pkg.dev
 • docker pull asia-northeast1-docker.pkg.dev/hr-mixi/container-training-2024/test-example
 

  4. なぜコンテナ技術を学ぶ か 
 • 弊社 プロジェクトに広く利用されているため
 • 弊社以外でも多く 企業で利用されている技術だから
 •

    コンテナ技術を雰囲気で なく少し踏み込んで知って欲しいから
 利用例
 • 開発環境に必要なバックエンドサーバーや DB 等をコマンド一つで用意
 • 本番環境へコンテナとしてデプロイ

  5. コンテナ 概要: 軽量で移植性 高いアプリケーション実行環境 
 • コンテナと アプリケーションとそ 依存関係を一つ パッケージにまとめ独立して実行でき

    る環境。
 • メリット
 ◦ 複数環境で同じコンテナを動作させることができる で移植性が高い
 ◦ に比べて軽量でインフラリソースを効率的に利用できる
 • 代表的なコンテナ技術 
 ◦ Docker
 ◦ ubernetes
 ◦ クラウド (EC , Cloud un…)
 
 

  6. とコンテナ 違い 
 • 同じマシンで動作する他 とリソース隔離
 • ごとに独立して が動作
 •

    起動に時間がかかる
 • 他 コンテナとリソース隔離
 ◦ 独立したファイルシステム・ネットワーク
 • 通常 inux プロセスが動作する で軽量
 • プロセスと同程度 起動時間

  7. Docker architecture (一部省略) 
 Client Host Registry Host を操作するプログラム
 コンテナ

    実行・管理を行う
 コンテナイメージ 保存・管理
 $ docker run $ docker pull $ docker build Docker Desktop アプリ等 Docker deamon (dockerd) • ubuntu • python • golang • my-image1 docker cli イメージ 実行中 • ubuntu-1 • my-app-1 停止中 • my-app-2 コンテナ • 様々な公開イメージ • プライベートイメージ Docker Hub Amazon ECR Docker 社以外 レジストリ 例 
 Google Container Registry 管理

  8. Docker Desktop for ac で inux が動作 
 Client Host

    Registry Host を操作するプログラム
 コンテナ 実行・管理を行う
 コンテナイメージ 保存・管理
 $ docker run $ docker pull $ docker build Docker Desktop アプリ等 Docker deamon (dockerd) • ubuntu • python • golang • my-image1 docker cli イメージ 実行中 • ubuntu-1 • my-app-1 停止中 • my-app-2 コンテナ • 様々な公開イメージ • プライベートイメージ Docker Hub Amazon ECR Docker 社以外 レジストリ 例 
 Google Container Registry 管理
 Linux VM
  9. containerd 
 • 2016年12月14日 Docker 社が Docker Engine コアコンポーネントであるcontainerd をスピ

    ンアウト
 • Dockerd 内部で containerd を利用
 • container image pull, push、コンテナ 実行と監視等が利用できる
 • lazy pulling や I F ような先進的な機能を利用可能
 • コンテナ 隔離環境 構築や起動に 低レベルランタイムを使う
 • Docker Desktop で 低レベルランタイムにデフォルトで runc を利用
 Docker deamon (dockerd) containerd runc コンテナ コンテナごとに起動されるプロセス 
 docker cli H 
 g C

  10. runc
 • CI( pen Container Initiative)によるリファレンス実装
 • inux namespace, cgroups

    等を利用してコンテナ 隔離環境を作成・管理
 ◦ mac に 上記に相当するも が無い でコンテナを利用したい場合 
 inux を動かす必要がある
 ◦ indows に HC (Host Compute ervice)といった上記に相当するも が実装されていて indows container を起動する際に利用される
 • containerd runc 以外 CI 互換 低レベルランタイムも利用可能
 ◦ Kata Containers 軽量 VM を用いて隔離コンテナ環境を用意 
 ◦ runwasi WebAssembly をコンテナとして実行できる
  11. Docker architecture (一部省略) 
 Client Host Registry Host を操作するプログラム
 コンテナ

    実行・管理を行う
 コンテナイメージ 保存・管理
 $ docker run $ docker pull $ docker build docker compose Docker Desktop アプリ等 Docker deamon (dockerd) • ubuntu • python • golang • my-image1 docker cli イメージ 実行中 • ubuntu-1 停止中 • my-app-1 コンテナ • 様々な公開イメージ • プライベートイメージ Docker Hub Amazon ECR Docker 社以外 レジストリ 例 
 Google Container Registry Buildkit containerd storage network runc イメージを作成
 コンテナ 実行

  12. なぜ containerd を直接使わずに Docker Desktop を使う か? 
 • コンテナを利用するために

    inux を動かす必要がある
 ◦ mac 上で inux を動かす を用意する必要がある
 ◦ Docker Desktop で そ あたりが利用者に気にしなくても使える仕組みになっている
 ▪ mac 上で Docker Desktop を起動する Hypervisor Framework を利用し inuxを起動してくれる 
 ▪ kernel patches, security fixes 良い感じにdockerが適用している 
 ▪ Git ようにインストールするだけで便利に使える が普及した理由だと個人的に 思っている 

  13. 結局 Docker 以外 コンテナって何選べ 良い よ? 
 • 本番環境で containerd

    を利用する が無難です
 ◦ Docker から移行とかになったとき、そもそも Docker containerd を利用している で
 動作に差異が生じない
 ◦ Docker cli によせた cli が存在する
 https://github.com/containerd/nerdctl 
 ◦ 8s や A Fargate すでに Docker を使わず直接 containerd を利用している
 
 • mac で Docker Desktop が便利
 ◦ 無料で使いたい場合や containerd を直接触りたいなら lima が便利
 ◦ lima mac 上で inux を動作 + mac, inux 間 ファイルやポートを自動で共有
 ◦ lima 上で nerdctl + containerd を使える

  14. 結局 docker 以外 コンテナって何選べ 良い よ? 
 • ローカル開発
 ◦

    基本Docker Desktop
 ◦ mac で無料で使うなら lima + nerdctl + containerd などが便利
 ▪ lima mac 上で inux を動作 + mac, inux 間 ファイルやポートを自動で共有
 ▪ nerdctl Docker cli と同じようなコマンドで containerd を利用可能な cli
 • 本番環境
 ◦ containerd を利用する が無難です
 ▪ Dockerから移行とかになったとき、そもそもDocker cotainerdを利用している で 
 動作に差異が生じない
 ▪ Docker cliによせたcliが存在する 
 https://github.com/containerd/nerdctl 
 ▪ 8s や Fargate すでに Docker を使わず直接 containerd を利用している 
 

  15. 実行結果
 コマンド 実行結果 $ docker run hello-world Unable to find

    image 'hello-world:latest' locally latest: Pulling from library/hello-world 7050e35b49f5: Pull complete Digest: sha256:ffb13da98453e0f04d33a6eee5bb8e46ee50d08e be17735fc0779d0349e889e9 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. (以下略) ローカルにないイメージ 
 自動的に pull してくる
 
 ここからコンテナで実行
 しているプログラム 出力

  16. Docker architecture (一部省略) 
 Client Host Registory Host を操作するプログラム
 コンテナ

    実行・管理を行う
 コンテナイメージ 保存・管理
 $ docker run Docker Desktop アプリ等 Docker deamon (dockerd) • hello-world docker cli イメージ 実行中 • xxx コンテナ • hello-world Docker Hub Amazon ECR Docker 社以外 レジストリ 例 
 Google Container Registry 管理
 ①
 ②pull
 ③起動
 ④出力を転送

  17. コンテナと H 通信する 
 ython を実行して簡易 web サーバーを起動し、ブラウザからアクセスする。 
 


    step 1 ディレクトリで python -m http.server コマンドを実行すると
 localhost:8000/index.html にブラウザでアクセスできる
 
 これをコンテナで行う。 

  18. コンテナと H 通信する 
 実行するコマンド (step1) $ docker run -p

    8000:8000 -v $PWD:/app python \ python -m http.server オプション -p 8000:8000 コンテナ ポート(右)をホスト ポート(左)へ公開 -v $PWD:/app ホスト $PWD をコンテナ /app にマウント イメージ python Python イメージ コマンド python Python コマンドを実行する 引数... -m http.server コマンド引数、Python 標準 サーバーを起動 ython を実行して簡易 web サーバーを起動し、ブラウザからアクセスする。 
 http://localhost:8000/app へアクセスしてみよう

  19. 実行結果
 出力 172.17.0.1 - - [07/Apr/2023 04:17:00] "GET /app/HTTP/1.1" 200

    - • コンテナとファイルを共有できる
 • コンテナ ポートに通信できる

  20. コンテナ 終了方法 
 コマンド $ docker ps CONTAINER ID IMAGE

    COMMAND (略) NAMES 888036ffe01a python "python -m http.serv…" (略) charming_hoover $ docker stop 888036ffe01a 1. Ctrl-C などでプロセスを終了する。 
 2. docker stop コマンドを使う。 
 Ctrl+p Ctrl+q を順番に押すとコンテナ 実行したままターミナルに戻れる

  21. tep 2: イメージを作成してアップロードする 
 Dockerfile
 コンテナイメージ
 レジストリ
 build
 push
 Build

    it • コンテナイメージを作るた め 手順書
 
 • ビルドに必要なファイル
 ファイル

  22. Dockerfile 命令が順番に実行される 
 Dockerfile FROM python:3.12 WORKDIR /app RUN pip

    install flask COPY . /app CMD ["python", "main.py"] ベースイメージ 指定 
 こ イメージをもとにして新しいイメージを作成する
 

  23. イメージ名 指定 仕方 
 registry-1.docker.io/library/hello-world:latest レジストリ ドメイン
 イメージ 名前
 イメージ

    タグ
 イメージ タグを指定することでバージョン等を指定可能 
 イメージ名を省略可能 
 • レジストリを省略すると registry-1.docker.io になる • library/ 場合 library/ を省略可能 • タグを省略すると :latest になる registry-1.docker.io/library/python:latest を省略すると python
  24. ベースイメージ 選び方 
 Docker Hub から検索しよう。
 Docker Hub へ 誰でもアップロードできる

    で Docker fficial Image を選ぶ が安心 
 \ Docker Hub 以外もあるよ / 

  25. Dockerfile 命令が順番に実行される 
 Dockerfile FROM python:3.12 WORKDIR /app RUN pip

    install flask COPY . /app CMD ["python", "main.py"] ワーキングディレクトリ 設定 
 
 

  26. Dockerfile 命令が順番に実行される 
 Dockerfile FROM python:3.12 WORKDIR /app RUN pip

    install flask COPY . /app CMD ["python", "main.py"] コマンド 実行 
 ライブラリ インストールなど
 

  27. Dockerfile 命令が順番に実行される 
 Dockerfile FROM python:3.12 WORKDIR /app RUN pip

    install flask COPY . /app CMD ["python", "main.py"] ホスト ディレクトリからファイルをコピー 
 
 

  28. Dockerfile 命令が順番に実行される 
 Dockerfile FROM python:3.12 WORKDIR /app RUN pip

    install flask COPY . /app CMD ["python", "main.py"] デフォルト コマンドを指定 
 docker run でコマンドを指定しない場合、
 こ コマンドが実行される
 

  29. docker build によってイメージを作成し起動してみる 
 • docker build コマンドでコンテキストと Dockerfile から


    コンテナイメージを作成
 • 引数でビルド対象 ディレクトリを指定
 • -t オプションでイメージ名を指定できる。
 実行するコマンド (step2) $ docker build -t myimage . $ docker run myimage • カレントディレクトリ ファイルと Dockerfile でイメージを作成し、
 myimage と名前をつけるコマンド

  30. docker build によってイメージを作成し起動してみる 
 実行結果 [+] Building 3.0s (9/9) FINISHED

    => [internal] load build definition from Doc 0.0s => => transferring dockerfile: 37B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/li 0.9s => [1/4] FROM docker.io/library/python:3.11. 0.0s => [internal] load build context 0.0s => => transferring context: 59B 0.0s => CACHED [2/4] WORKDIR /app 0.0s => [3/4] RUN pip install flask 1.9s => [4/4] COPY . /app 0.0s => exporting to image 0.1s => => exporting layers 0.1s => => writing image sha256:9144792bebcfff27c 0.0s => => naming to docker.io/library/myapp 0.0s docker が Build it を起動してコンテナをビルド 
 ローカル ファイルを転送
 Dockerfile 命令を一つずつ実行

  31. Dockerfile 命令ごとに差分を増やして新しいイメージを作る 
 変更差分 変更差分 変更差分 変更差分 ベースイメージ (python:3.11.2)
 変更差分

    変更差分 変更差分 変更差分 WORKDIR 差分 RUN 差分 COPY 差分 CMD 差分 新イメージ
 Dockerfile
 変更差分 ベースイメージ 
 ベースイメージ
 一部省略. docker history [I AGE] コマンドで履歴が見れる 

  32. Dockerfile を書き換えて本番環境用 イメージを作る 
 Flask で本番環境用 サーバーを実行する一例
 1. まず pip

    install waitress で本番環境用 サーバーをインストールする
 2. waitress-serve 'main:app' でサーバーを 8080 ポートに起動する
 Dockerfile に必要な処理を書き加えてイメージ ビルド・実行してみよう。
 INFO:waitress:Serving on http://0.0.0.0:8080 と出力されて同じページが見れる 
 
 ヒント:
 いきなり Dockerfile を書く 大変な で先ほど作ったイメージ上で bash を起動して、
 コマンドが合っているかどうか一つずつ実行しながら試すと良いです。
 $ docker run -it python bash また $ docker run -it python <先ほど作ったイメージ名>
  33. Dockerfile ベストプラクティス (余裕がある人向け) 
 • イメージサイズを小さくすることで起動に必要な pull 時間を短縮できる
 ◦ サイズが小さいベースイメージを使う

    (python:3.12-slim, 3.12-alpine など)
 ◦ パッケージマネージャー等 キャッシュを削除する (rm -rf $(pip cache dir) など)
 ◦ 命令 まとめて書く
 • Dockerfile キャッシュが有効になるように書くとビルド時間を短縮できる
 ◦ 命令で使わないファイル 、あとで C Y 命令で追加する
 ◦ main.py を変更しても pip install 実行されずにキャッシュが使えるようになる

  34. 書き換えた Dockerfile 例 
 Dockerfile FROM python:3.12 WORKDIR /app RUN

    pip install flask waitress && pip cache purge COPY . /app CMD ["waitress-serve", "main:app"]
  35. コンテナを Google Cloud に push する 
 実行するコマンド (step2) $

    docker tag myimage \ asia-northeast1-docker.pkg.dev/hr-mixi/container-training-2024/好きな名 前:latest $ docker push asia-northeast1-docker.pkg.dev/hr-mixi/container-training-2024/好きな名 前:latest https://console.cloud.google.com/artifacts/docker/hr-mixi/asia-northeast1/container-training-2024

  36. Docker Compose を利用して開発環境に複数 コンテナを起動する 
 • アプリケーション 複数 サービスが協調して動作する
 ◦

    アプリケーションサーバー, データベースサーバーなど
 • 複数 コンテナを起動する方法を学ぶ
 • Docker Compose 開発環境で複数 コンテナを動かすため ツール
 • 本番環境 複数 サーバーで構成される で使えない
 App サーバー
 DB サーバー

  37. Docker Compose が管理するも 
 docker-compose
 .yaml
 サービス: コンテナと環境変数など 設定
 docker

    compose up
 ボリューム : コンテナ間で共有できる永続的なストレージ
 ネットワーク : サービス間 通信を管理する仮想的なネット ワーク

  38. Docker Compose 主なコマンド 
 • docker compose … 形式、昔 docker-compose

    コマンドだった。
 • docker compose up コンテナ 起動 • docker compose up -d デタッチモードでコンテナ 起動 • docker compose down コンテナ 削除 • docker compose build サービス ビルド
  39. docker-compose.yaml にサービス等 定義を書く 
 step3/docke-compose.yaml (一部省略) services: app: # API

    サーバー build: context: python dockerfile: Dockerfile environment: ... ports: - "5000:5000" web: # React image: node:18 working_dir: '/app' volumes: - ./web/:/app ports: - "3000:3000" environment: REACT_APP_API_URL: 'http://localhost:5… entrypoint: /bin/bash command: - /app/entrypoint.sh db: # データベース image: mysql:8.0 ... yaml に3 つ コンテナが起動するように定義されている。
 • app (A I サーバー)
 ◦ python ディレクトリ Dockerfile でビルドしたコンテナ起 動
 • web ( eact eb アプリ)
 ◦ node イメージにソースコード ディレクトリをマウントして 開発サーバーを起動
 • db (データベースサーバー)
 ◦ データベースファイルを永続化できるようにマウント

  40. Docker Compose を利用して複数 コンテナを起動する 
 実行するコマンド (step3) $ docker compose

    build $ docker compose up 1 分弱で localhost:3000 にアクセスできる。
 • odo App が動くか確認しよう。
 • docker ps コマンドで起動したコンテナを確認しよう。
 docker compose up コンテナがない場合 自動で build してく れる。すでにコンテナがある場合 ファイルを更新しても自動で build されない で注意。

  41. docker compose exec を利用して mysql に接続する 
 実行するコマンド (step3) $

    docker compose exec db -it mysql -uroot -ppassword docker compose exec 実行中 コンテナ 中でプログラムを実行でき る。
 • db サービス 名前
 • -it 対話型 プログラムを動かすときに使うオプション。
 • mysql 以降 実行するコマンド
 
 y に接続してクエリを入力できる画面が表示される で、
 クエリを実行して DB 内容を確認してみよう。
 クエリ実行例 mysql> SELECT * FROM app.todos; +----+-------+-----------+ | id | task | completed | +----+-------+-----------+ | 31 | test1 | 0 | | 32 | test2 | 0 | +----+-------+-----------+ 2 rows in set (0.01 sec)