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

The Path to Cloud Native: Starting with Docker ...

The Path to Cloud Native: Starting with Docker Containers

Masahito Zembutsu

March 14, 2024
Tweet

More Decks by Masahito Zembutsu

Other Decks in Programming

Transcript

  1. Docker Captain 前佛 雅人 (@zembutsu) 2024年3月14日(木) The Path to Cloud

    Native: Starting with Docker Containers Dockerコンテナから始めるクラウドネイティブへの道
  2. Dockerを広める活動 2 @zembutsu 前佛 雅人 さくらインターネット株式会社 ES本部 教育企画部 Technical Communicator

    / Engineer 高知工業高等専門学校 客員准教授 Factorio プレイ時間 13,000 時間超
  3. 3 Optimizing Deep Learning Workflows: Leveraging Stable Diffusion and Docker

    on WSL2 | Docker https://www.docker.com/blog/stable-diffusion-and-docker-on-wsl2/
  4. The Path to Cloud Native: Starting with Docker Containers ✔

    クラウド”とは ✔ クラウドネイティブとコンテナの関係性 ✔ Docker の基礎 ( Linux コンテナと OCI イメージ ) ※ 本日の資料は、connpass ページ上で公開予定
  5. 本質的価値は “Not Technologies, Workflow” • 「どう使うのか」ではなく「何をしたいのか」が重要 • コンテナは一見すると、構成管理ツール、パッケージ管理ツール • いきなり開発しよう、本番投入しようではなく、使ってみる

    • 100%頭で学習してから覚えてからではなく、まず手を動かす • 終わりなき試行錯誤のため • 「納品」という概念がない時代における、開発・運用に適う
  6. 8 8 Network Topology Icons - Doing Business With Cisco

    - Cisco https://www.cisco.com/c/en/us/about/brand-center/network-topology-icons.html
  7. 9 9 Network Topology Icons - Doing Business With Cisco

    - Cisco https://www.cisco.com/c/en/us/about/brand-center/network-topology-icons.html
  8. The Big Switch: Rewiring the world, From Edition to Google

    • 20世紀の「電力会社」のように、 インターネットを通した社会のありかたを 「クラウドコンピューティング」と提唱 • Nicholas G. Carr • 2008年1月発売(邦訳10月発売) • 翔泳社 10
  9. 1879年白熱電球実用化、1882年石炭火力発電所を建設 11 Pearl Street Station - Wikipedia https://en.wikipedia.org/wiki/Pearl_Street_Station • 1929年

    “scale models” 開発 • ボタン(スイッチ)を押すだけで、モーターが エンジン、発電機、そのほかの機器を稼働 • ボタンについたランプから、稼働状況を確認
  10. 12

  11. 13

  12. クラウドの定義 • 基本的な特徴 • オンデマンド・セルフサービス • 幅広いネットワークアクセス • リソースの共有 •

    スピーディーな拡張性 • サービスが計測可能であること • サービス・モデル • サービスの形で提供される ソフトウェア (SaaS) • 〃 プラットフォーム(PaaS) • 〃 インフラストラクチャ (IaaS) https://www.ipa.go.jp/files/000025366.pdf SP 800-145, The NIST Definition of Cloud Computing 14
  13. NIST によるクラウドの定義[1] “ Cloud computing is a model for enabling

    ubiquitous, convenient, on-demand network access to a shared pool of configurable computing resources ( e.g., networks, servers, storage, applications, and services ) that can be rapidly provisioned and reused with minimal management effort or service provider interaction.” https://www.ipa.go.jp/files/000025366.pdf [1] NIST SP 800-145, The NIST Definition of Cloud Computing (2011年9月) https://csrc.nist.gov/pubs/sp/800/145/final 設定可能な計算資源の共有プール 柔軟性・スケーラビリティ 迅速に利用・再利用できる + 基本的な特徴 ⚫ オンデマンド・セルフサービス ⚫ 幅広いネットワークアクセス ⚫ リソースの共有 ⚫ スピーディーな拡張性 ⚫ サービスが計測可能 15
  14. インフラストラクチャ (サーバや設備) ソフトウェア (サービス、アプリ) プラットフォーム (OS・CI/CD・自動化) インフラストラクチャ (サーバや設備) ソフトウェア (サービス、アプリ)

    プラットフォーム (OS・CI/CD・自動化) インフラストラクチャ (サーバや設備) ソフトウェア (サービス、アプリ) プラットフォーム (OS・CI/CD・自動化) SaaS PaaS IaaS
  15. 23

  16. 初期概念 ( 2013年~ ) • アプリケーションのスケール手段模索として「Cloud Native」 • クラウドにより IaaS

    / PaaS はスケールできる。でもアプリケーションは? 25 出典: What is Cloud Native and why Should I care? https://github.com/cncf/presentations/blob/main/2016-software-circus/what-is-cloud-native/what-is-cloud-native.pdf
  17. 2010年代初期の概念 “ペット vs 家畜” • 「スケールアウトのパターン スケールアップではない」 26 Architectures for

    open and scalable clouds http://www.slideshare.net/randybias/architectures-for-open-and-scalable-clouds スケールアップ: サーバはペットのように スケールアウト: サーバは家畜のように
  18. Docker コンテナの誕生 • 2023年3月 PyCon US のライトニングトーク枠でお披露目 • dotCloud Slomon

    Hykes 氏 が発表 • Linux コンテナ(LXC) を使った アプリケーション実行の複雑さを 解決する概念 • linux コンテナランタイムとして Docker を公開 • 同年オープンソースとして公開 28 The future of Linux Containers - YouTube https://www.youtube.com/watch?v=wW9CAH9nSLs
  19. Cloud Native 参照アーキテクチャ 32 出典: What is Cloud Native and

    why Should I care? Software Circus 2016 https://github.com/cncf/presentations/blob/main/2016-software-circus/what-is-cloud-native/what-is-cloud-native.pdf
  20. Cloud Native Trail Map • エンタープライズが Cloud Native ジャーニーを始めるための概略 ”The

    Cloud Native Trail Map provides an overview for enterprises starting their cloud native journey.” • 手順#3以降は状況に応じたオプション 1. コンテナ化 2. CI/CD 3. オーケストレーションとアプリケーション定義 34 cncf/trailmap: TrailMap files from the cncf/landscape repo https://github.com/cncf/trailmap
  21. 35

  22. 高品質で持続的な開発・運用を行うため • 継続的インテグレーション • 「すべての開発者のコードを定期的にメインラインにマージすること」 • テスト、ビルド(コンパイル)などを自動的に行う仕組み • デプロイ作業の自動化を CD

    (継続的デリバリ)と呼ぶ • 活用手段 • バージョン管理 • Git ... ソースコードの変更履歴を記録・追跡するバージョン管理システム • GitHub ... 内部に git を使う、GUI のソフトウェア開発プラットフォーム • テスト自動化 • Jenkins 等 ... ソフトウェアのビルド、検証、インストールなどを自動化できるツール • コンテナ化 • Docker ... アプリケーションを開発・移動・実行するプラットフォーム • Kubernetes ... アプリケーションをデプロイ、スケーリング、管理をする CI / CD Continuous Integration / Continuous Delivery 37
  23. Cloud Native まとめ • 「クラウドコンピューティング」を使い、アプリケーションをスケールする ソフトウェアのパターンが「Cloud Native」の基本的な考え • 「Cloud Native」の導入には

    Trail Map を参考にすると以下の順番が必要 1. コンテナ化 2. CI/CD 3. オーケストレーションとアプリケーション定義 • クラウドコンピューティング上で生まれた、クラウドの特性を活かす ソフトウェア、ハードウェア、アーキテクチャ、文化・習慣
  24. Docker 42 “Docker allows you to package an application with

    all of its dependencies into a standardized unit for software development.” www.docker.com 全ての依存関係をパッケージ化して、コンテナとして動かす Dockerイメージとして Linuxファイルシステムを
  25. 43 デプロイ software deployment プログラム 設定ファイル ソースコード データ “ソフトウェアシステムを利用可能にする活動全般を指す用語である。” (Wikipedia)

    <?php ini_set('display_errors', "On"); mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); print "<h1>counter</h1>¥n"; $mysqlhost = "host"; $mysqluser = "user"; $mysqlpass = "pass"; $mysqldata = "database"; $connect = new mysqli($mysqlhost, $mysqluser, $mysqlpass, $mysqldata); if (!$connect) { die ("database error"); } $result = $connect->query("UPDATE counter SET count = count + 1"); $result = $connect->query("SELECT count FROM counter"); $count = $result->fetch_row(); print "count=$count[0]"; mysqli_close($connect); ?>
  26. Docker Hub で Docker イメージを保管・共有 • Docker コンテナは Docker イメージを使ってアプリケーションを実行

    • ローカルにイメージが無い場合、 Docker Hub 等からダウンロードできる 45 Docker コンテナ Docker イメージ Docker エンジン 実行 Docker Hub (公式レジストリ) ※ Docker 社が運営 docker pull 例: 「docker run nginx」を実行すると、Docker Hub の公式 nginx イメージをダウンロードし、Docker コンテナとして実行 公式イメージ
  27. Docker 公式イメージ • Docker Hub https://hub.docker.com 上で公開されているイメージ • 検索すると のマーク

    • 自由に使えるオープンソースのものが中心 • Docker とコミュニティが協力しながら作っている • Dockerfile のベストプラクティス例 https://github.com/docker-library/official-images/tree/master/library • Docker Hub は一般公開されたイメージも多数検索結果に出る • 基本的に公式イメージ以外は信頼すべきではない 46 official image
  28. Docker はプラットフォーム 47 BUILD(構築) SHARE(共有) RUN(実行) docker image build (docker

    build) アプリケーションに必要なすべてを Dockerイメージに集約 docker container run (docker run) Dockerイメージのアプリケーションを Dockerコンテナ内で実行 Docker イメージ 構築 Docker コンテナ 実行 ソースコード バイナリ 設定ファイル ライブラリ Dockerイメージの 公開レジストリ Docker Hub Dockerイメージの共有や自動構築、 コラボレーションのための場所 docker image push (docker push) Dockerイメージ送信 docker image pull (docker pull) Dockerイメージ取得
  29. Dockerイメージはイメージ・レイヤの積み重ね 49 利用者からは 1つに見える 親 子 関 係 派生も 共有

    利用者からは 1つに見える プログラムやライブラリと メタ情報(実行するプログラムやポートなど) だから高速に移動できる・開発を高速化できる リソースを有効に使える “lightweight” な性質
  30. Dockerコンテナもイメージ・レイヤを持つ 50 元のレイヤに対する変更情報を記録 Copy on Write の性質 利用者からは 1つに見える 利用者からは

    1つに見える だから高速に移動できる・開発を高速化できる リソースを有効に使える “lightweight” な性質
  31. 参考:Dockerfileで中間コンテナ実行・イメージ作成を自動化 ❶ まず Dockerfile を 書きます。あるいは、 GitHub等から取得 ❷ “docker build”

    で Docker はイメージを 自動構築開始 ❸完成したイメージで コンテナを起動したり DockerHubに送信を 命令1 命令2 命令3 $ mkdir myproject $ cd myproject $ vim Dockerfile $ docker build -t myproj . 読み込み イメージレイヤ群を自動構築 Dockerfile $ docker run -d myproj $ docker push DockerがDockerfileを読み込み 中間コンテナを起動して命令を実行 →docker commitでイメージ化 ((( commit commit commit
  32. Dockerfile Dockerfile にイメージ構築に必要な全ての命令を書く • Dockerイメージは読み込み専用のイメージレイヤ群で構成 • 各イメージ・レイヤが Dockerfile の命令に相当する •

    記述例 53 FROM ubuntu:22.04 COPY . /app ← “ubuntu:22.04”のイメージから、レイヤを作成 ← “.” ディレクトリを、コンテナの “/app” にコピー レイヤは親子関係を持ち、依存・参照
  33. Dockerfile Dockerfile にイメージ構築に必要な全ての命令を書く • Dockerイメージは読み込み専用のイメージレイヤ群で構成 • 各イメージ・レイヤが Dockerfile の命令に相当する •

    記述例 54 FROM ubuntu:22.04 COPY . /app RUN make /app ← “ubuntu:22.04”のイメージから、レイヤを作成 ← “.” ディレクトリを、コンテナの “/app” にコピー ← コンテナ内で “meke /app” を実行 レイヤは親子関係を持ち、依存・参照
  34. Dockerfile Dockerfile にイメージ構築に必要な全ての命令を書く • Dockerイメージは読み込み専用のイメージレイヤ群で構成 • 各イメージ・レイヤが Dockerfile の命令に相当する •

    記述例 55 ← “ubuntu:22.04”のイメージから、レイヤを作成 ← “.” ディレクトリを、コンテナの “/app” にコピー ← コンテナ内で “meke /app” を実行 ← コンテナ実行時、デフォルトで実行するコマンドとして ”python /app/app.py” を指定 FROM ubuntu:22.04 COPY . /app RUN make /app CMD python /app/app.py
  35. コンテナは特別なプロセスの状態 56 コンテナAの ファイルシステム … … コンテナBの ファイルシステム /etc (/data/ubuntu/etc)

    /bin (/data/ubuntu/bin) /etc (/data/centos/etc) /bin (/data/centos/bin) / / httpd PID 1 プロセスA プロセスB ruby PID 1 chris.rb PID 2 コンテナA コンテナB 名前空間の isolate ・プロセス ・ファイルシステム ・ネットワーク ・ホスト名 ・UID・GID ・プロセス間通信、等 cgroupでリソース制限 ・CPU ・メモリ ・I/O ・ディスク・クォータ、等
  36. PID名前空間 57 httpd PID 1 プロセスhttpd 名前空間 プロセスruby 名前空間 ruby

    PID 1 chris.rb PID 2 /sbin/init PID 1 containerd PID 5 httpd PID 6 ruby PID 7 chris.rb PID 8 alice PID 2 bob PID 3 PPID 1 PPID 1 PPID 4 PPID 5 PPID 5 PPID 7 PPID 1 dockerd PID 4 ホスト上には存在
  37. 基本的なコマンド コマンド名 説明 使用例 docker run [イメージ名:タグ] docker container run

    [イメージ名:タグ] Docker コンテナの作成・実行 docker run hello-world docker pull [イメージ名:タグ] docker image pull [イメージ名:タグ] Docker イメージの取得 docker pull hello-world docker images docker image ls Docker イメージ一覧表示 docker images docker history [イメージ名:タグ] docker image history [イメージ名:タグ] Docker イメージの履歴表示 docker history hello-world docker inspect [イメージ名:タグ] docker image inspect [イメージ名:タグ] Docker イメージの詳細情報表示 docker inspect hello-world 60 ※ タグを省略すると、「latest」 ※ イメージ名はイメージ ID でも指定可能
  38. コンテナの起動・停止・削除 • 「docker run」は 「docker pull」と 「docker create」の 組み合わせ •

    コンテナの作成とは、 読み書き可能な イメージレイヤの作成。 • コンテナの削除とは、 そのコンテナ用のイメージ レイヤを削除。 61 Docker コンテナ Docker イメージ Linux カーネル Docker エ ンジン 概念としての コンテナ作成 特別な状態で プロセスを起動 出来る場所
  39. コンテナのお約束 • コンテナ作成時に名前をつけられ(--name)変更も可能(docker rename) • ただし、コンテナは重複した名前を持てない • 一般的には、名前はつけない(自動で割り振られる) • ユニークなコンテナ

    ID で各コンテナを区別・操作 • docker ps で表示されるもの……ショートID • 本来割り当てられているもの……ロングID • 前方一致で操作できる(たいてい2~3文字で操作) 62
  40. docker ps / docker container ls • 「docker ps」は、実行中のDocker コンテナ(用のイメージレイヤ)を表示

    • 停止中も含めて表示するには「-a」または「--all」オプションをつける • コンテナ(用のイメージレイヤ)が使用している容量は「-s」オプションで表示 63 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 855612c0f3ea nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 80/tcp naughty_saha $ docker ps -s CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE 855612c0f3ea nginx "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 80/tcp naughty_saha 1.09kB (virtual 142MB)
  41. サービス “wordpress” wordpress イメージ サービス “db” mysql:5.7 イメージ WordPress 公式

    compose.yaml version: '3.1' services: wordpress: image: wordpress restart: always ports: - 8080:80 environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: exampleuser WORDPRESS_DB_PASSWORD: examplepass WORDPRESS_DB_NAME: exampledb volumes: - wordpress:/var/www/html db: image: mysql:5.7 restart: always environment: MYSQL_DATABASE: exampledb MYSQL_USER: exampleuser MYSQL_PASSWORD: examplepass MYSQL_RANDOM_ROOT_PASSWORD: '1' volumes: - db:/var/lib/mysql volumes: wordpress: db: ボリューム “wordpress” ボリューム “db” /var/www/html /var/lib/mysql プロジェクト用のブリッジネットワーク 8080 80
  42. Compose demo cd mkdir wordpress cd wordpress curl -L bit.ly/wp-yaml

    -o compose.yaml docker compose pull docker compose up -d 65
  43. Docker のアーキテクチャ 69 Docker Desktop Docker Engine docker CLI クライアント

    サーバ Linux カーネル 制御 Docker API Docker イメージ Docker Hub docker push docker pull Docker コンテナ namespaces cgroups
  44. Docker を使った開発やデプロイをするには? 70 Docker コンテナ Docker イメージ Linux カーネル Docker

    エンジン macOS Windows WSL 2 Docker Desktop for macOS Docker Desktop for windows
  45. Docker を使った開発やデプロイをするには? • Docker Engine を実行できる環境を準備する 71 Linux macOS Windows

    Docker Engine Docker Desktop for macOS (Apple Chip, intel Chip) Docker Desktop for Windows + WSL 2 と Ubuntu 等を事前設定 便利なインストール用スクリプト https://get.docker.com/ ダウンロード用 URL https://www.docker.com/products/docker-desktop/ ※Virtual Box 等で、別途仮想サーバをインストールする方法もある。 主にローカルでの開発用途 リモート開発 or デプロイ先
  46. Docker Desktop for Windows の注意点 • インストール手順 • 事前に「アプリ」で「Ubuntu 22.04.5

    LTS」等をセットアップする • 次に「wsl --update」コマンドを実行(Linuxカーネルの更新) • それから「Docker Desktop」のインストーラーを設定する(Hyper-Vもここで有効化) • インストール後は、必要に応じて CPUやメモリの抑制 • C:¥Users¥<ユーザ名>¥.wslconfig ファイルを作成または編集 72 [wsl2] memory=2GB processors=2 ← 使うコア数を 2 つ ← 使うメモリ上限を 2 GB ※ファイル編集後は「wsl --shutdown」、または PC 再起動
  47. The Path to Cloud Native: Starting with Docker Containers ✔

    クラウド”とは ✔ クラウドネイティブとコンテナの関係性 ✔ Docker の基礎 ( Linux コンテナと OCI イメージ ) ※ 本日の資料は、connpass ページ上で公開予定
  48. Docker Captain 前佛 雅人 (@zembutsu) 2024年3月14日(木) The Path to Cloud

    Native: Starting with Docker Containers Dockerコンテナから始めるクラウドネイティブへの道 質問? Thank you! 谢谢!!