Slide 1

Slide 1 text

Docker Desktop で Docker を始めよう Docker Captain 前佛 雅人 (@zembutsu) 2025年1月17日(金) Getting Started with Docker: A Complete Guide to Docker Desktop

Slide 2

Slide 2 text

コンテナ・Dockerを始めよう

Slide 3

Slide 3 text

3 https://docs.docker.com/

Slide 4

Slide 4 text

4 Docker とは? 基本は「シンプル」

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

“ペット vs 家畜” • 「スケールアウトのパターン スケールアップではない」 6 Architectures for open and scalable clouds, February 14, 2012 http://www.slideshare.net/randybias/architectures-for-open-and-scalable-clouds スケールアップ: サーバはペットのように スケールアウト: サーバは家畜のように

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

Docker はソフトウェア アプリケーション開発・移動・実行 BUILD SHIP RUN ⚫Docker Engine ⚫Docker Desktop とツール群

Slide 9

Slide 9 text

Docker はソフトウェア アプリケーション開発・移動・実行 BUILD SHIP RUN ⚫Docker Engine ⚫Docker Desktop とツール群 素早い

Slide 10

Slide 10 text

Docker はソフトウェア アプリケーション開発・移動・実行 BUILD SHIP RUN ⚫Docker Engine ⚫Docker Desktop とツール群 素早い プラットフォーム ⚫開発・実行環境の共有 PaaS ⚫開発やデプロイ自動化 Docker Hub (公式レジストリ) 使い捨て型

Slide 11

Slide 11 text

Docker の誕生 • 2013年3月 PyCon US のライトニングトーク枠でお披露目 • dotCloud Slomon Hykes 氏 が発表 • Linux コンテナ(LXC) を使った アプリケーション実行の複雑さを 解決する概念 • linux コンテナランタイムとして Docker を公開 • 同年オープンソースとして公開 11 The future of Linux Containers - YouTube https://www.youtube.com/watch?v=wW9CAH9nSL s

Slide 12

Slide 12 text

12 開発 環境 テスト 環境 準備 環境 本番 環境

Slide 13

Slide 13 text

13 サービスを 提供したい 開発 環境 テスト 環境 準備 環境 本番 環境 都度、環境構築 課題 異なるOS環境 課題 都度、プロビジョニング 課題 動かない 課題 時間がかかる 課題 遅い 課題 面倒 課題 アプリを 動かしたい

Slide 14

Slide 14 text

14 サービスを 提供したい 開発 環境 テスト 環境 準備 環境 本番 環境 都度、環境構築 課題 異なるOS環境 課題 都度、プロビジョニング 課題 動かない 課題 時間がかかる 課題 遅い 課題 面倒 課題 アプリを 動かしたい コンテナ 開発 テスト 準備 本番

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

16 Linux コンテナ Docker (OCI) 仕様

Slide 17

Slide 17 text

Docker 17 “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 18

Slide 18 text

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

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

Docker はコンテナを動かすアプリケーションであり、プラットフォーム 21 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 22

Slide 22 text

補足:Docker 公式イメージ • Docker Hub は “GitHub” のような存在 • Docker Hub https://hub.docker.com 上で公開されているイメージ • 検索すると のマークが「公式」 • 自由に使えるオープンソースのものが中心 • 一般公開されたイメージも多数検索結果に出る 22 official image

Slide 23

Slide 23 text

23 Docker を使うには?

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

ローカル開発環境に役立つ Docker Desktop • GUI • Docker Engine • Docker ツール群 25

Slide 26

Slide 26 text

26 集中管理ビュー • セキュリティや信頼性の問題に対処するための次のステップを示す統合ダッシュ ボード • ソフトウェアサプライチェーン全体での統合 推奨ワークフロー • 古いベースイメージ、品質ゲート、コピーレフトライセンス、セキュリティ問題を 評価 • 修正ガイダンス 継続的な改善 • Docker Desktop、CLI、scout.docker.comで詳細なイメージ分析 • 開発から本番環境まで、より良い意思決定を支援するフィードバックを提供 本番環境に到達する前に セキュリティ問題に対処

Slide 27

Slide 27 text

27 Docker Build Cloud は、ローカル リソースの制限、エミュレーションの遅 さ、チーム全体でのビルドのコラボレーションの欠如など、イメージ ビル ドが遅い一般的な原因に対処します。 クラウドベースのビルダーを使用すると、開発者は古いマシンで作業している 場合でも、より速くビルドできます。 AMD および ARM ビルダーのペアにより、開発者はエミュレータの構成や再構 築に時間を費やすことなく、マルチ アーキテクチャ ビルドを実行できます。 共有キャッシュを使用すると、同じリポジトリで作業するチームが重複作業を 回避して待ち時間を短縮できます。 これらの時間の節約が積み重なると、開発者は次のスプリントまたはエピック の作業に戻る時間が与えられ、市場投入までの時間が短縮されます。 クラウド機能でビルドを高速化 より高速なビルド 開発者あたり 1 日あたりの節約量

Slide 28

Slide 28 text

Docker Desktop を使った開発 28 Docker コンテナ Docker イメージ Linux カーネル Docker エンジン macOS Windows WSL 2 Docker Desktop for macOS Docker Desktop for windows

Slide 29

Slide 29 text

Docker を使った開発やデプロイをするには? • Docker Engine を実行できる環境を準備する 29 Linux macOS Windows Docker Engine Docker Desktop for macOS (Apple Chip, intel Chip) Docker Desktop for Windows + WSL 2 便利なインストール用スクリプト https://get.docker.com/ ダウンロード用 URL https://www.docker.com/ ※Virtual Box 等で、別途仮想サーバをインストールする方法もある。 主にローカルでの開発用途 リモート開発 or デプロイ先

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

31 Docker 基本概念

Slide 32

Slide 32 text

Dockerの基本コンセプト • 重要な考え方 • コンテナは「使い捨て型」 • アプリケーションの素早い “Build, Ship(Share), Run” を実現するため • キーワード • コンテナ • イメージ • ボリューム • ネットワーク • Docker Compose 32

Slide 33

Slide 33 text

33 技術と仕様 Technology Specification コンテナ Docker

Slide 34

Slide 34 text

Docker 34 “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 35

Slide 35 text

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

Slide 36

Slide 36 text

36 コンテナとは?

Slide 37

Slide 37 text

37 (物理または仮想) Linux カーネル + システム・ライブラリ(libc)等 コンピュータ CPU メモリ 記憶装置 オペレーティングシステム (OS)の領域

Slide 38

Slide 38 text

38 (物理または仮想) ユーザ空間 システム空間 Linux カーネル + システム・ライブラリ(libc)等 コンピュータ CPU メモリ 記憶装置 オペレーティングシステム (OS)の領域 プロセス プログラム 設定ファイル ソースコード データ プロセス 一般的な プロセス実行

Slide 39

Slide 39 text

39 (物理または仮想) ユーザ空間 システム空間 Linux カーネル + システム・ライブラリ(libc)等 コンピュータ CPU メモリ 記憶装置 オペレーティングシステム (OS)の領域 プログラム 設定ファイル ソースコード データ コンテナは 特別な状態の プロセスのこと isolate(隔離) プロセス isolate(隔離) プロセス

Slide 40

Slide 40 text

PID名前空間 40 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 41

Slide 41 text

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

Slide 42

Slide 42 text

コンテナは特別なプロセスの状態 42 コンテナ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 43

Slide 43 text

「Dockerとコンテナ」のまとめ ⚫ Docker は、アプリケーションを実行するために必要な 依存関係(Linuxファイルシステム)を、Dokcer イメージにパッケージ化 ⚫ アプリケーションを Docker コンテナとして実行するには、 Docker イメージが必要 ⚫ コンテナは特別な状態のプロセスで Linux カーネルの様々な名前空間 (namespace)を分離(isolate)し 起動するもの 43

Slide 44

Slide 44 text

44 Dockerイメージとは

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

Dockerイメージはイメージ・レイヤの積み重ね 46 プログラムやライブラリと メタ情報(実行するプログラムやポートなど)

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

48 利用者からは 1つに見える docker image build -t . (docker build)

Slide 49

Slide 49 text

49 利用者からは 1つに見える hello:v1 FROM alpine ENTRYPOINT ["/bin/echo"] CMD ["こんにちは!こんにちは!"] docker image build -t hello:v1 . (docker build)

Slide 50

Slide 50 text

50 hello:v1 FROM alpine ENTRYPOINT ["/bin/echo"] CMD [“おはよう!おはよう!"] docker image build -t hello:v2 . (docker build) hello:v2

Slide 51

Slide 51 text

「Dockerイメージ」のまとめ ⚫ Docker イメージは、イメージ・レイヤの積み重ねで構成 ⚫ 各イメージ・レイヤの中に「ファイルシステム」と「メタ情報」を含む ⚫ イメージ・レイヤは親子関係 ⚫ 複数のレイヤ上のファイルや ディレクトリが1つに見える 51

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

53 Dockerイメージの 作り方

Slide 54

Slide 54 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 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

Dockerfile Dockerfile にイメージ構築に必要な全ての命令を書く • Dockerイメージは読み込み専用のイメージレイヤ群で構成 • 各イメージ・レイヤが Dockerfile の命令に相当する • 記述例 58 ← “ubuntu:20.04”のイメージから、レイヤを作成 ← “.” ディレクトリを、コンテナの “/app” にコピー ← コンテナ内で “meke /app” を実行 ← コンテナ実行時、デフォルトで実行するコマンドとして ”python /app/app.py” を指定 FROM ubuntu:20.04 COPY . /app RUN make /app CMD python /app/app.py

Slide 59

Slide 59 text

FROM scratch COPY hello / CMD ["/hello"] Dockerイメージの理解を目指すチュートリアル - Qiita https://qiita.com/zembutsu/items/24558f9d0d254e33088f “hello-world” Docker イメージの Dockerfile

Slide 60

Slide 60 text

60 Docker ボリューム

Slide 61

Slide 61 text

61 データの扱い コンテナA専用 ファイル階層 File System … / /bin /etc /var コンテナB専用 ファイル階層 File System … / /bin /etc /var hello.txt HOST Root File System /var/lib/docker/overlay/ hello.txt A B UFS( Union File System ) ×

Slide 62

Slide 62 text

Docker ボリューム • ボリュームとは、コンテナ内における特別なディレクトリやファイル • Docker のイメージ・レイヤとは独立した存在 • Docker ボリュームの中身は Docker イメージに入れられない • コンテナのライフサイクルと切り離された設計思想 • コンテナを削除しても、ボリュームは残り続ける • ボリュームはコンテナ間でディレクトリやファイルを共有できる • さらに、ホスト側のディレクトリやファイルも、コンテナで共有できる(bind mount) 62

Slide 63

Slide 63 text

63 ボリューム コンテナA専用 ファイル階層 File System … / /bin /etc /var コンテナからはUFSを通してデータ領域が見える ストレージ・ドライバのオーバヘッドを受けない 複数のコンテナでボリュームを共有できる volume /data / ボリューム Volume /var/lib/docker/volumes/ HOST Root File System コンテナは「ボリューム」と呼ぶ領域(ディレクトリまたはファイル)をマウントできる ディレクトリはストレージドライバによって異なる

Slide 64

Slide 64 text

64 コンテナ ファイル階層 File System / UFS ( Union File System) … / /bin /var Docker イメージ Docker Image /var/lib/docker/image/ volume / ボリューム Volume /data コンテナ用 イメージ層 Container’s Image Layer / /var/lib/docker/volumes/ /var/lib/docker/containers/ ReadOnly

Slide 65

Slide 65 text

65 ボリュームは3分類 バインドマウント ホストをマウント 名前付き ホスト上のディレクトリ /docker/data /data volume IDのみ volume ボリュームの実体は、ホスト上のディレクトリ /var/lib/docker/volumes ボリュームはコンテナ間でデータを共有できる volume /data /data /etc bind mount named volume anonymous volume

Slide 66

Slide 66 text

66 Docker ネットワーク

Slide 67

Slide 67 text

67 3つの Docker 標準ネットワークモデル bridge (bridge) host (host) none (null) ブリッジ(bridge0 …) veth eth0 ethX NAT (iptables) + docker-proxy ホストと ネットワーク 共通 疎通しない コンテナはパブリックなIPアドレスを持ない ホスト側のポート番号を重複して、コンテナ のポート利用(マッピング)はできない 動的なネットワークの追加・変更・削除

Slide 68

Slide 68 text

Docker ネットワーク機能 • デフォルトでネットワークも隔離した状態(外から中へ通信できない) 68 isolate コンテナ (分離された名前空間) ホスト上 port 80 ethX

Slide 69

Slide 69 text

コンテナ実行時に、ポート公開を明示 69 コンテナ (分離された名前空間) ホスト上 port 80 ethX docker run -itd -P nginx -p 80:80 ⚫-P (--publish-all) は ハイポートに割り当て ⚫-p (--publish)は 割り当てポートを固定

Slide 70

Slide 70 text

70 3つの Docker 標準ネットワークモデル bridge (bridge) host (host) none (null) ブリッジ(bridge0 …) veth eth0 ethX Dockerでコンテナを実行すると、 プロセスの「ネットワーク」や「ホスト名」 もisolate(分離)した状態で起動。 docker network lsコマンドの実行で はじめから3つのネットワークが表示。

Slide 71

Slide 71 text

71 3つの Docker 標準ネットワークモデル bridge (bridge) host (host) none (null) ブリッジ(bridge0 …) veth eth0 ethX ホスト側のネットワークに直接接続 ブリッジのオーバーヘッドがない一方で、 セキュリティに対する考慮が必要 ホスト側のインタフェースを直接 使いたい場合、docker run のオプショ ンで --network=host を指定 port 8080 port 8080 コンテナでポートを開くと、 自動的にホスト側の公開 ポートを直接利用する

Slide 72

Slide 72 text

72 コンテナは複数のネットワーク(ブリッジ)に接続できる ブリッジ1(bridge) veth eth0 ethX 各ネットワーク内部では、動的なコンテナ名 (サービス)の名前解決機能(サービス・ディス カバリ)を標準提供 eth0 eth1 eth0 ブリッジ2(bridge) veth 192.168.0.1 172.18.0.2 172.18.0.3 172.19.0.2 172.19.0.3 172.19.0.1 172.19.0.0/16 172.180.0/16 サービス・ディスカバリ連携の負荷分散 Composeはプロジェクト単位で ブリッジ・ネットワークを自動的に 作成でき、ホスト側とのマッピングも 設定可能。

Slide 73

Slide 73 text

73 Docker Compose

Slide 74

Slide 74 text

アプリケーション コンテナ システム コンテナ コンテナ プロセス A プロセス B プロセス C コンテナ コンテナ コンテナ プロセス A プロセス B プロセス C 1機能1コンテナの考え方で、設計と運用が従来と異なる 一方、スケールのしやすさや耐障害性を持つ 仮想サーバのようにコンテナ全体を管理しやすい 一方、スケールのしづらさ、運用の大変さがある

Slide 75

Slide 75 text

アプリケーション コンテナ コンテナ コンテナ コンテナ プロセス A プロセス B プロセス C 1機能1コンテナの考え方で、設計と運用が従来と異なる 一方、スケールのしやすさや耐障害性を持つ docker run … docker run … docker run … docker run … docker run … docker run … docker run … docker run … docker run … docker run … docker run … docker run … docker run … docker run …

Slide 76

Slide 76 text

docker compose up ⚫ アプリケーション(サービス)の実行環境を YAMLで定義 ⚫ ネットワークとボリュームも扱える ⚫ docker コマンドと類似 利用者側のメリット: • compose ファイルがあれば、とにかく動く 環境の再現性が高い) 開発者側のメリット: • 1つのマシン上で、複数の環境を切り替えやすい

Slide 77

Slide 77 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 78

Slide 78 text

78 振り返り

Slide 79

Slide 79 text

Dockerの基本コンセプト • 重要な考え方 • コンテナは「使い捨て型」 • アプリケーションの素早い “Build, Ship(Share), Run” を実現するため • キーワード • コンテナ • イメージ • ボリューム • ネットワーク • Docker Compose 79

Slide 80

Slide 80 text

Dockerとは? 80 1 Dockerコンテナは 実行に必要な全てを パッケージ化して、 簡単に動かせる 2 Dockerイメージは 複数のイメージ・ レイヤとメタ情報の 積み重なり 3 コンテナのプロセスは デフォルトでisolate (隔離・分離)された 状態 ⚫ イメージ・レイヤ(image layer)は 読み込み専用 ⚫ 親子関係がある ⚫ イメージに対する変更はCopy on Write(CoW)処理が走る ⚫ コンテナ実行にはイメージが必要 で、Docker Hubから得られる ⚫ コンテナ実行時のみ、読み書きが 可能なレイヤを追加 ⚫ namespace(名前空間)でプロセ ス空間やファイルシステムやネッ トワーク等を分ける技術と、 cgroups(コントロール・グループ) でリソースの利用上限を指定 ⚫ コンテナはポートをデフォルトで開 かない ⚫ ネットワークはブリッジ、ホスト、 noneの3種類 ⚫ ボリュームはコンテナ間でファイル システムを共有できる。名前付き (named)とホスト・ボリューム ⚫ アプリケーションを簡単に開発し、 移動し、実行するためのプログラム とプラットフォームを提供するのが Docker ⚫ クライアント・サーバ型 https://docker.com プロセスを簡単にコンテナ化(isolate)し、 簡単かつ素早く開発・移動・実行できるプラットフォームが Docker Containerization 「プロセス・ファイルシステム・ネットワーク・等々」に対して Namespace・Cgroup Build Ship Run

Slide 81

Slide 81 text

81 Docker Compose ⚫ Docker Compose は複数のアプリケーションを定義・実行する仕組み ⚫ 「docker compose」コマンドを使う 1 Composeは アプリケーションの サービスをファイル で定義する 2 Dockerコマンドと 高い親和性がある ため、学習コストが 比較的に低い ⚫ docker compose CLI のコマン体 系は docker に準拠 ⚫ 例:「docker run -d」は 「docker compose up -d」 ⚫ Compose ファイル (YAML形式) で Docker コンテナのサービスを 定義できるため、 再利用性が高い ◼ コンテナの状態 ◼ イメージ ◼ ネットワーク ◼ ボリューム ◼ メタ情報

Slide 82

Slide 82 text

VMやオンプレで動かすシステムを コンテナ化する時に考慮すること

Slide 83

Slide 83 text

83 仮想化とコンテナ化の違い

Slide 84

Slide 84 text

84 https://www.docker.com/resources/what-container ハードウェア仮想化

Slide 85

Slide 85 text

85 Docker≠コンテナ型仮想化 ≠ アプリケーション・コンテナ https://www.docker.com/resources/what-container ハードウェア仮想化 システム・コンテナ

Slide 86

Slide 86 text

参考:プロセスと共有状態の比較 86 Linux ユーザ空間 Linux カーネル空間 仮想マシン内の Linuxカーネル空間 仮想マシン内の Linuxユーザ空間 ハードウェアの仮想化とプロセス Linux カーネル空間 PID名前空間が isolateされた状 態でも、ホストか ら見ると、ただの プロセス PID名前空間がisolateされ た中では、ホスト上の他の プロセスが一切見えない (自分自身のユーザ空間し か見えない) Linux ユーザ空間 Dockerコンテナとプロセス コンテナ(として名前 空間に隔離された中)に Kernel は存在しない nginx postfix systemd 物理サーバ上のプロセス ハードウェア Linux Kernel システムリソース 非共有 非共有 非共有 共有 非共有 非共有 共有 共有 共有

Slide 87

Slide 87 text

参考:Docker 周辺ツールとプロジェクトの関係性 87

Slide 88

Slide 88 text

参考:Docker 公開から現在までの流れ • 2013年 Docker が公開、オープンソース化および一般公開 • 2014年 コンテナランタイム libcontainer の公開 ( LXC 代替 ) • 2015年 コンテナランタイム runC 導入と、 OCI に寄贈 • 2016年 Swarm mode 導入、containerd を CNCF に寄贈 • 2017年 Docker Engine をオープンソースの Moby プロジェクト化 Docker CE / EE の2つのバージョン登場、k8s対応を発表 • 2018年 Solomon Hykes 氏が Docker 社を退社 • 2019年 Docker 社がエンタープライズ部門をミランティス社に売却 • 2020年 Docker Desktop 2.2 から WSL2 バックエンドのサポート

Slide 89

Slide 89 text

Docker 検討時の注意 • 前提として、Dockerは(いわゆる)「仮想化技術」とは異なる思想・技術背景 • 「コンテナ型仮想化」として表現されるが、単純比較できない • セキュリティ要件によっては、コンテナの利用より仮想化技術を選択すべき • クラウドの “リフト&シフト” 的にコンテナへの移植はすべきではない • 学習や変化を必ず伴う • メリットが見えなければ導入すべきではない • この機会にコンテナ化を検討するのは有用 • 技術(再)検証や手順の(再)作成 • デプロイを素早く行いたい • バッチ的な処理 • PoC 89 アプリケーションの“Build, Share, Run” を素早く簡単に

Slide 90

Slide 90 text

Docker Desktopを使ったコンテナ アプリケーション開発

Slide 91

Slide 91 text

91 Docker アプリケーション開発

Slide 92

Slide 92 text

Docker 導入のポイント • Docker を使えば、アプリケーションを手軽に開発・実行できる • Docker コンテナは特別な状態のプロセス • Docker コンテナを実行するには Docker イメージが必要 • Docker イメージは概念で、Linux ファイルシステムとメタ情報で構成 • Docker イメージは Dockerfile を使う • Docker Compose は複数のコンテナを同時に扱える便利ツール 92 開発者体験の向上 = 楽をしよう Developer Experience

Slide 93

Slide 93 text

開発手順 1. 適切な公式イメージを探す 2. 用途に合っているか見定める 3. 開発作業を進める 4. Dockerfile を書いてイメージを作る 5. 複数のイメージを扱う場合は compose.yaml を書く 6. デプロイ 93

Slide 94

Slide 94 text

私のパートのまとめ:Docker を導入する時に考えること • まずはコンテナ化にチャレンジ。ただし、導入が目的化しないように • Docker Desktop は勉強用やローカル開発に最適 • ただし、Docker Desktop はライセンスだけに注意 • コンテナとイメージの基礎を押さえるには、仮想サーバの概念を消す・別物 • コンテナ化の第一歩は Docker イメージを自分で作れるようにする • 出来合いの Docker イメージを使うべき • Dockerfile ベストプラクティスを参考にする • 迷ったら公式ドキュメントを読む • https://docs.docker.com

Slide 95

Slide 95 text

Docker Desktop で Docker を始めよう - コンテナ・Dockerを始めよう - VMやオンプレで動かすシステムをコンテナ化する時に考慮すること - Docker Desktopを使ったコンテナアプリケーション開発 Thank you!