Slide 1

Slide 1 text

Docker Captain 前佛 雅人 (@zembutsu) 2024年3月14日(木) The Path to Cloud Native: Starting with Docker Containers Dockerコンテナから始めるクラウドネイティブへの道

Slide 2

Slide 2 text

Dockerを広める活動 2 @zembutsu 前佛 雅人 さくらインターネット株式会社 ES本部 教育企画部 Technical Communicator / Engineer 高知工業高等専門学校 客員准教授 Factorio プレイ時間 13,000 時間超

Slide 3

Slide 3 text

3 Optimizing Deep Learning Workflows: Leveraging Stable Diffusion and Docker on WSL2 | Docker https://www.docker.com/blog/stable-diffusion-and-docker-on-wsl2/

Slide 4

Slide 4 text

The Path to Cloud Native: Starting with Docker Containers ✔ クラウド”とは ✔ クラウドネイティブとコンテナの関係性 ✔ Docker の基礎 ( Linux コンテナと OCI イメージ ) ※ 本日の資料は、connpass ページ上で公開予定

Slide 5

Slide 5 text

本質的価値は “Not Technologies, Workflow” • 「どう使うのか」ではなく「何をしたいのか」が重要 • コンテナは一見すると、構成管理ツール、パッケージ管理ツール • いきなり開発しよう、本番投入しようではなく、使ってみる • 100%頭で学習してから覚えてからではなく、まず手を動かす • 終わりなき試行錯誤のため • 「納品」という概念がない時代における、開発・運用に適う

Slide 6

Slide 6 text

突然ですが、クラウドネイティブ的なデモをさせてください • “ollama” https://ollama.com/ • クラウドネイティブ「技術」ではないが「文化」を感じる 6

Slide 7

Slide 7 text

7 クラウドコンピューティング

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

The Big Switch: Rewiring the world, From Edition to Google • 20世紀の「電力会社」のように、 インターネットを通した社会のありかたを 「クラウドコンピューティング」と提唱 • Nicholas G. Carr • 2008年1月発売(邦訳10月発売) • 翔泳社 10

Slide 11

Slide 11 text

1879年白熱電球実用化、1882年石炭火力発電所を建設 11 Pearl Street Station - Wikipedia https://en.wikipedia.org/wiki/Pearl_Street_Station • 1929年 “scale models” 開発 • ボタン(スイッチ)を押すだけで、モーターが エンジン、発電機、そのほかの機器を稼働 • ボタンについたランプから、稼働状況を確認

Slide 12

Slide 12 text

12

Slide 13

Slide 13 text

13

Slide 14

Slide 14 text

クラウドの定義 • 基本的な特徴 • オンデマンド・セルフサービス • 幅広いネットワークアクセス • リソースの共有 • スピーディーな拡張性 • サービスが計測可能であること • サービス・モデル • サービスの形で提供される ソフトウェア (SaaS) • 〃 プラットフォーム(PaaS) • 〃 インフラストラクチャ (IaaS) https://www.ipa.go.jp/files/000025366.pdf SP 800-145, The NIST Definition of Cloud Computing 14

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

クラウドは特別な存在ではなくなった • 個々のマシンやデータセンタ上のサー バにデータを持ち、システムを動かす 時代の終焉を予測 • ただし、1つのマシン(One Machine) に集約されるのではなく、分散した http://www.roughtype.com/?p=8314 17

Slide 18

Slide 18 text

(余談)クラウドは「余白」 • 海岸に港を作ります。A市・B市のいずれにも近い地点はどこでしょうか? 18 海 平地 A市 B市 2 3 1

Slide 19

Slide 19 text

海 平地 A市 B市 A’ 港を作るべき場所

Slide 20

Slide 20 text

(余談)クラウドは「余白」 • 海岸に港を作ります。A市・B市のいずれにも近い地点はどこでしょうか? 20 海 平地 A市 B市

Slide 21

Slide 21 text

21 クラウドネイティブ

Slide 22

Slide 22 text

22 Cloud Computing ≒ Cloud Native ( Cloud Native computing )

Slide 23

Slide 23 text

23

Slide 24

Slide 24 text

技術観点では、仮想化→コンテナ→クラウドネイティブ 24 出典: CNCF Overview 2023 https://github.com/cncf/presentations

Slide 25

Slide 25 text

初期概念 ( 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

Slide 26

Slide 26 text

2010年代初期の概念 “ペット vs 家畜” • 「スケールアウトのパターン スケールアップではない」 26 Architectures for open and scalable clouds http://www.slideshare.net/randybias/architectures-for-open-and-scalable-clouds スケールアップ: サーバはペットのように スケールアウト: サーバは家畜のように

Slide 27

Slide 27 text

「納品の概念がない」 → 「納品概念では競争に負ける」領域の出現 27 (成果を出せない) というより

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

Docker が解決したかった問題 • どちらも「中身」を気にせず「迅速かつ自動的に」輸送・移動できる 29 出典: dotScale 2013 - Solomon Hykes - Why we built Docker - YouTube https://www.youtube.com/watch?v=3N3n9FzebAA shipping

Slide 30

Slide 30 text

サービス(アプリケーション)もインフラも変わり続ける時代の到来 30

Slide 31

Slide 31 text

2015年12月 CNCF 設立 31 出典: FAQ https://www.cncf.io/about/faq/#what-is-cloud-native

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

CNCF の活動 33

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

35

Slide 36

Slide 36 text

大切なのは目標達成のための順番(道のり) • 一見すると、クラウドは支払方式が変わった単純な仮想化システムの導入 • システム(インフラ)だけでなく、開発・運用を通したビジネスへの対応 • 月額支払いとサブスクリプションビジネスの違いに近い • この考えの延長線上にあるのが、コンテナを活用するクラウドネイティブ 36

Slide 37

Slide 37 text

高品質で持続的な開発・運用を行うため • 継続的インテグレーション • 「すべての開発者のコードを定期的にメインラインにマージすること」 • テスト、ビルド(コンパイル)などを自動的に行う仕組み • デプロイ作業の自動化を CD (継続的デリバリ)と呼ぶ • 活用手段 • バージョン管理 • Git ... ソースコードの変更履歴を記録・追跡するバージョン管理システム • GitHub ... 内部に git を使う、GUI のソフトウェア開発プラットフォーム • テスト自動化 • Jenkins 等 ... ソフトウェアのビルド、検証、インストールなどを自動化できるツール • コンテナ化 • Docker ... アプリケーションを開発・移動・実行するプラットフォーム • Kubernetes ... アプリケーションをデプロイ、スケーリング、管理をする CI / CD Continuous Integration / Continuous Delivery 37

Slide 38

Slide 38 text

Cloud Native まとめ • 「クラウドコンピューティング」を使い、アプリケーションをスケールする ソフトウェアのパターンが「Cloud Native」の基本的な考え • 「Cloud Native」の導入には Trail Map を参考にすると以下の順番が必要 1. コンテナ化 2. CI/CD 3. オーケストレーションとアプリケーション定義 • クラウドコンピューティング上で生まれた、クラウドの特性を活かす ソフトウェア、ハードウェア、アーキテクチャ、文化・習慣

Slide 39

Slide 39 text

Cloud Native の未来 • WebAssembly ( WASM ) • メモリがホストシステム上から分離された環境(サンドボックス) • WASI ( WebAssembly System Interface ) • WIT ( WebAssembly Interface Types )

Slide 40

Slide 40 text

40 Docker の基本は「シンプル」

Slide 41

Slide 41 text

41 Linux コンテナ Docker (OCI) イメージ

Slide 42

Slide 42 text

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ファイルシステムを

Slide 43

Slide 43 text

43 デプロイ software deployment プログラム 設定ファイル ソースコード データ “ソフトウェアシステムを利用可能にする活動全般を指す用語である。” (Wikipedia) counter¥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); ?>

Slide 44

Slide 44 text

44 デプロイ software deployment プログラム 設定ファイル ソースコード データ “ソフトウェアシステムを利用可能にする活動全般を指す用語である。” (Wikipedia) Docker イメージ Docker エンジン

Slide 45

Slide 45 text

Docker Hub で Docker イメージを保管・共有 • Docker コンテナは Docker イメージを使ってアプリケーションを実行 • ローカルにイメージが無い場合、 Docker Hub 等からダウンロードできる 45 Docker コンテナ Docker イメージ Docker エンジン 実行 Docker Hub (公式レジストリ) ※ Docker 社が運営 docker pull 例: 「docker run nginx」を実行すると、Docker Hub の公式 nginx イメージをダウンロードし、Docker コンテナとして実行 公式イメージ

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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イメージ取得

Slide 48

Slide 48 text

Docker イメージは「概念」 48 Dockerイメージは「1つのファイル」ではなく「概念」。抽象的なイメージ・レイヤの積み重ね docker~.img × ではなく

Slide 49

Slide 49 text

Dockerイメージはイメージ・レイヤの積み重ね 49 利用者からは 1つに見える 親 子 関 係 派生も 共有 利用者からは 1つに見える プログラムやライブラリと メタ情報(実行するプログラムやポートなど) だから高速に移動できる・開発を高速化できる リソースを有効に使える “lightweight” な性質

Slide 50

Slide 50 text

Dockerコンテナもイメージ・レイヤを持つ 50 元のレイヤに対する変更情報を記録 Copy on Write の性質 利用者からは 1つに見える 利用者からは 1つに見える だから高速に移動できる・開発を高速化できる リソースを有効に使える “lightweight” な性質

Slide 51

Slide 51 text

参考: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

Slide 52

Slide 52 text

Dockerfile Dockerfile にイメージ構築に必要な全ての命令を書く • Dockerイメージは読み込み専用のイメージレイヤ群で構成 • 各イメージ・レイヤが Dockerfile の命令に相当する • 記述例 52 FROM ubuntu:22.04 ← “ubuntu:22.04”のイメージから、レイヤを作成

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

コンテナは特別なプロセスの状態 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 ・ディスク・クォータ、等

Slide 57

Slide 57 text

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 ホスト上には存在

Slide 58

Slide 58 text

ファイルシステムを分ける (chrootのような概念) 58 ubuntuの ファイルシステム … … centosの ファイルシステム /etc /bin /etc /bin / / /data/ubuntu /data/centos / /etc /data /bin ホスト上には存在

Slide 59

Slide 59 text

特別な状態のプロセスとは 59

Slide 60

Slide 60 text

基本的なコマンド コマンド名 説明 使用例 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 でも指定可能

Slide 61

Slide 61 text

コンテナの起動・停止・削除 • 「docker run」は 「docker pull」と 「docker create」の 組み合わせ • コンテナの作成とは、 読み書き可能な イメージレイヤの作成。 • コンテナの削除とは、 そのコンテナ用のイメージ レイヤを削除。 61 Docker コンテナ Docker イメージ Linux カーネル Docker エ ンジン 概念としての コンテナ作成 特別な状態で プロセスを起動 出来る場所

Slide 62

Slide 62 text

コンテナのお約束 • コンテナ作成時に名前をつけられ(--name)変更も可能(docker rename) • ただし、コンテナは重複した名前を持てない • 一般的には、名前はつけない(自動で割り振られる) • ユニークなコンテナ ID で各コンテナを区別・操作 • docker ps で表示されるもの……ショートID • 本来割り当てられているもの……ロングID • 前方一致で操作できる(たいてい2~3文字で操作) 62

Slide 63

Slide 63 text

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)

Slide 64

Slide 64 text

サービス “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

Slide 65

Slide 65 text

Compose demo cd mkdir wordpress cd wordpress curl -L bit.ly/wp-yaml -o compose.yaml docker compose pull docker compose up -d 65

Slide 66

Slide 66 text

例:Docker Compose を使ったAUTOMATIC1111環境構築 66

Slide 67

Slide 67 text

手順はこちらを参照ください さくらのクラウド《GPUプラン》ハンズオン~Stable Diffusionを使用したファンジーアートの作り方 - Qiita https://qiita.com/zembutsu/items/ae7809501b7e07700cf9

Slide 68

Slide 68 text

68 Docker を使うには?

Slide 69

Slide 69 text

Docker のアーキテクチャ 69 Docker Desktop Docker Engine docker CLI クライアント サーバ Linux カーネル 制御 Docker API Docker イメージ Docker Hub docker push docker pull Docker コンテナ namespaces cgroups

Slide 70

Slide 70 text

Docker を使った開発やデプロイをするには? 70 Docker コンテナ Docker イメージ Linux カーネル Docker エンジン macOS Windows WSL 2 Docker Desktop for macOS Docker Desktop for windows

Slide 71

Slide 71 text

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 デプロイ先

Slide 72

Slide 72 text

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 再起動

Slide 73

Slide 73 text

73 振り返り

Slide 74

Slide 74 text

The Path to Cloud Native: Starting with Docker Containers ✔ クラウド”とは ✔ クラウドネイティブとコンテナの関係性 ✔ Docker の基礎 ( Linux コンテナと OCI イメージ ) ※ 本日の資料は、connpass ページ上で公開予定

Slide 75

Slide 75 text

Docker Captain 前佛 雅人 (@zembutsu) 2024年3月14日(木) The Path to Cloud Native: Starting with Docker Containers Dockerコンテナから始めるクラウドネイティブへの道 質問? Thank you! 谢谢!!