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

Docker Desktop で Docker を始めよう

Docker Desktop で Docker を始めよう

2025年1月17日(金) 発表資料
初心者向け:Dockerで始めるコンテナ技術入門 - connpass
https://dockerjapan.connpass.com/event/339971/

Masahito Zembutsu

January 16, 2025
Tweet

More Decks by Masahito Zembutsu

Other Decks in Technology

Transcript

  1. Docker Desktop で Docker を始めよう Docker Captain 前佛 雅人 (@zembutsu)

    2025年1月17日(金) Getting Started with Docker: A Complete Guide to Docker Desktop
  2. “ペット vs 家畜” • 「スケールアウトのパターン スケールアップではない」 6 Architectures for open

    and scalable clouds, February 14, 2012 http://www.slideshare.net/randybias/architectures-for-open-and-scalable-clouds スケールアップ: サーバはペットのように スケールアウト: サーバは家畜のように
  3. Docker はソフトウェア アプリケーション開発・移動・実行 BUILD SHIP RUN ⚫Docker Engine ⚫Docker Desktop

    とツール群 素早い プラットフォーム ⚫開発・実行環境の共有 PaaS ⚫開発やデプロイ自動化 Docker Hub (公式レジストリ) 使い捨て型
  4. 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
  5. 13 サービスを 提供したい 開発 環境 テスト 環境 準備 環境 本番

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

    環境 都度、環境構築 課題 異なるOS環境 課題 都度、プロビジョニング 課題 動かない 課題 時間がかかる 課題 遅い 課題 面倒 課題 アプリを 動かしたい コンテナ 開発 テスト 準備 本番
  7. 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ファイルシステムを
  8. 18 デプロイ 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); ?>
  9. イメージはどこから? Docker Hub で Docker イメージを保管・共有 • Docker コンテナは Docker

    イメージを使ってアプリケーションを実行 • ローカルにイメージが無い場合、 Docker Hub 等からダウンロードできる 20 Docker コンテナ Docker イメージ Docker エンジン 実行 Docker Hub (公式レジストリ) ※ Docker 社が運営 docker pull 例: 「docker run nginx」を実行すると、Docker Hub の公式 nginx イメージをダウンロードし、Docker コンテナとして実行 公式イメージ
  10. 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イメージ取得
  11. 補足:Docker 公式イメージ • Docker Hub は “GitHub” のような存在 • Docker

    Hub https://hub.docker.com 上で公開されているイメージ • 検索すると のマークが「公式」 • 自由に使えるオープンソースのものが中心 • 一般公開されたイメージも多数検索結果に出る 22 official image
  12. Docker と Docker Desktop のアーキテクチャ 24 Docker Desktop Docker Engine

    docker CLI クライアント サーバ Linux カーネル 制御 Docker API Docker イメージ Docker Hub docker push docker pull Docker コンテナ namespaces cgroups
  13. 26 集中管理ビュー • セキュリティや信頼性の問題に対処するための次のステップを示す統合ダッシュ ボード • ソフトウェアサプライチェーン全体での統合 推奨ワークフロー • 古いベースイメージ、品質ゲート、コピーレフトライセンス、セキュリティ問題を

    評価 • 修正ガイダンス 継続的な改善 • Docker Desktop、CLI、scout.docker.comで詳細なイメージ分析 • 開発から本番環境まで、より良い意思決定を支援するフィードバックを提供 本番環境に到達する前に セキュリティ問題に対処
  14. 27 Docker Build Cloud は、ローカル リソースの制限、エミュレーションの遅 さ、チーム全体でのビルドのコラボレーションの欠如など、イメージ ビル ドが遅い一般的な原因に対処します。 クラウドベースのビルダーを使用すると、開発者は古いマシンで作業している

    場合でも、より速くビルドできます。 AMD および ARM ビルダーのペアにより、開発者はエミュレータの構成や再構 築に時間を費やすことなく、マルチ アーキテクチャ ビルドを実行できます。 共有キャッシュを使用すると、同じリポジトリで作業するチームが重複作業を 回避して待ち時間を短縮できます。 これらの時間の節約が積み重なると、開発者は次のスプリントまたはエピック の作業に戻る時間が与えられ、市場投入までの時間が短縮されます。 クラウド機能でビルドを高速化 より高速なビルド 開発者あたり 1 日あたりの節約量
  15. Docker Desktop を使った開発 28 Docker コンテナ Docker イメージ Linux カーネル

    Docker エンジン macOS Windows WSL 2 Docker Desktop for macOS Docker Desktop for windows
  16. 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 デプロイ先
  17. 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 再起動
  18. Dockerの基本コンセプト • 重要な考え方 • コンテナは「使い捨て型」 • アプリケーションの素早い “Build, Ship(Share), Run”

    を実現するため • キーワード • コンテナ • イメージ • ボリューム • ネットワーク • Docker Compose 32
  19. 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ファイルシステムを
  20. 38 (物理または仮想) ユーザ空間 システム空間 Linux カーネル + システム・ライブラリ(libc)等 コンピュータ CPU

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

    メモリ 記憶装置 オペレーティングシステム (OS)の領域 プログラム 設定ファイル ソースコード データ コンテナは 特別な状態の プロセスのこと isolate(隔離) プロセス isolate(隔離) プロセス
  22. 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 ホスト上には存在
  23. コンテナは特別なプロセスの状態 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 ・ディスク・クォータ、等
  24. Dockerイメージはイメージ・レイヤの積み重ね 47 利用者からは 1つに見える 親 子 関 係 派生も 共有

    利用者からは 1つに見える プログラムやライブラリと メタ情報(実行するプログラムやポートなど) だから高速に移動できる・開発を高速化できる リソースを有効に使える “lightweight” な性質
  25. コンテナの起動・停止・削除 • 「docker run」は 「docker pull」と 「docker create」の 組み合わせ •

    コンテナの作成とは、 読み書き可能な イメージレイヤの作成 • コンテナの削除とは、 そのコンテナ用のイメージ レイヤを削除 52 Docker コンテナ Docker イメージ Linux カーネル Docker エンジン 概念としての コンテナ作成 特別な状態で プロセスを起動 出来る場所
  26. 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
  27. Dockerfile Dockerfile にイメージ構築に必要な全ての命令を書く • Dockerイメージは読み込み専用のイメージレイヤ群で構成 • 各イメージ・レイヤが Dockerfile の命令に相当する •

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

    記述例 57 FROM ubuntu:20.04 COPY . /app RUN make /app ← “ubuntu:20.04”のイメージから、レイヤを作成 ← “.” ディレクトリを、コンテナの “/app” にコピー ← コンテナ内で “meke /app” を実行 レイヤは親子関係を持ち、依存・参照
  29. 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
  30. FROM scratch COPY hello / CMD ["/hello"] Dockerイメージの理解を目指すチュートリアル - Qiita

    https://qiita.com/zembutsu/items/24558f9d0d254e33088f “hello-world” Docker イメージの Dockerfile
  31. 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 ) ×
  32. Docker ボリューム • ボリュームとは、コンテナ内における特別なディレクトリやファイル • Docker のイメージ・レイヤとは独立した存在 • Docker ボリュームの中身は

    Docker イメージに入れられない • コンテナのライフサイクルと切り離された設計思想 • コンテナを削除しても、ボリュームは残り続ける • ボリュームはコンテナ間でディレクトリやファイルを共有できる • さらに、ホスト側のディレクトリやファイルも、コンテナで共有できる(bind mount) 62
  33. 63 ボリューム コンテナA専用 ファイル階層 File System … / /bin /etc

    /var コンテナからはUFSを通してデータ領域が見える ストレージ・ドライバのオーバヘッドを受けない 複数のコンテナでボリュームを共有できる volume /data / ボリューム Volume /var/lib/docker/volumes/ HOST Root File System コンテナは「ボリューム」と呼ぶ領域(ディレクトリまたはファイル)をマウントできる ディレクトリはストレージドライバによって異なる
  34. 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
  35. 65 ボリュームは3分類 バインドマウント ホストをマウント 名前付き ホスト上のディレクトリ /docker/data /data volume IDのみ

    volume ボリュームの実体は、ホスト上のディレクトリ /var/lib/docker/volumes ボリュームはコンテナ間でデータを共有できる volume /data /data /etc bind mount named volume anonymous volume
  36. 67 3つの Docker 標準ネットワークモデル bridge (bridge) host (host) none (null)

    ブリッジ(bridge0 …) veth eth0 ethX NAT (iptables) + docker-proxy ホストと ネットワーク 共通 疎通しない コンテナはパブリックなIPアドレスを持ない ホスト側のポート番号を重複して、コンテナ のポート利用(マッピング)はできない 動的なネットワークの追加・変更・削除
  37. コンテナ実行時に、ポート公開を明示 69 コンテナ (分離された名前空間) ホスト上 port 80 ethX docker run

    -itd -P nginx -p 80:80 ⚫-P (--publish-all) は ハイポートに割り当て ⚫-p (--publish)は 割り当てポートを固定
  38. 70 3つの Docker 標準ネットワークモデル bridge (bridge) host (host) none (null)

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

    ブリッジ(bridge0 …) veth eth0 ethX ホスト側のネットワークに直接接続 ブリッジのオーバーヘッドがない一方で、 セキュリティに対する考慮が必要 ホスト側のインタフェースを直接 使いたい場合、docker run のオプショ ンで --network=host を指定 port 8080 port 8080 コンテナでポートを開くと、 自動的にホスト側の公開 ポートを直接利用する
  40. 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はプロジェクト単位で ブリッジ・ネットワークを自動的に 作成でき、ホスト側とのマッピングも 設定可能。
  41. アプリケーション コンテナ システム コンテナ コンテナ プロセス A プロセス B プロセス

    C コンテナ コンテナ コンテナ プロセス A プロセス B プロセス C 1機能1コンテナの考え方で、設計と運用が従来と異なる 一方、スケールのしやすさや耐障害性を持つ 仮想サーバのようにコンテナ全体を管理しやすい 一方、スケールのしづらさ、運用の大変さがある
  42. アプリケーション コンテナ コンテナ コンテナ コンテナ プロセス 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 …
  43. docker compose up ⚫ アプリケーション(サービス)の実行環境を YAMLで定義 ⚫ ネットワークとボリュームも扱える ⚫ docker

    コマンドと類似 利用者側のメリット: • compose ファイルがあれば、とにかく動く 環境の再現性が高い) 開発者側のメリット: • 1つのマシン上で、複数の環境を切り替えやすい
  44. サービス “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
  45. Dockerの基本コンセプト • 重要な考え方 • コンテナは「使い捨て型」 • アプリケーションの素早い “Build, Ship(Share), Run”

    を実現するため • キーワード • コンテナ • イメージ • ボリューム • ネットワーク • Docker Compose 79
  46. 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
  47. 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 コンテナのサービスを 定義できるため、 再利用性が高い ◼ コンテナの状態 ◼ イメージ ◼ ネットワーク ◼ ボリューム ◼ メタ情報
  48. 参考:プロセスと共有状態の比較 86 Linux ユーザ空間 Linux カーネル空間 仮想マシン内の Linuxカーネル空間 仮想マシン内の Linuxユーザ空間

    ハードウェアの仮想化とプロセス Linux カーネル空間 PID名前空間が isolateされた状 態でも、ホストか ら見ると、ただの プロセス PID名前空間がisolateされ た中では、ホスト上の他の プロセスが一切見えない (自分自身のユーザ空間し か見えない) Linux ユーザ空間 Dockerコンテナとプロセス コンテナ(として名前 空間に隔離された中)に Kernel は存在しない nginx postfix systemd 物理サーバ上のプロセス ハードウェア Linux Kernel システムリソース 非共有 非共有 非共有 共有 非共有 非共有 共有 共有 共有
  49. 参考: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 バックエンドのサポート
  50. Docker 検討時の注意 • 前提として、Dockerは(いわゆる)「仮想化技術」とは異なる思想・技術背景 • 「コンテナ型仮想化」として表現されるが、単純比較できない • セキュリティ要件によっては、コンテナの利用より仮想化技術を選択すべき • クラウドの

    “リフト&シフト” 的にコンテナへの移植はすべきではない • 学習や変化を必ず伴う • メリットが見えなければ導入すべきではない • この機会にコンテナ化を検討するのは有用 • 技術(再)検証や手順の(再)作成 • デプロイを素早く行いたい • バッチ的な処理 • PoC 89 アプリケーションの“Build, Share, Run” を素早く簡単に
  51. Docker 導入のポイント • Docker を使えば、アプリケーションを手軽に開発・実行できる • Docker コンテナは特別な状態のプロセス • Docker

    コンテナを実行するには Docker イメージが必要 • Docker イメージは概念で、Linux ファイルシステムとメタ情報で構成 • Docker イメージは Dockerfile を使う • Docker Compose は複数のコンテナを同時に扱える便利ツール 92 開発者体験の向上 = 楽をしよう Developer Experience
  52. 私のパートのまとめ:Docker を導入する時に考えること • まずはコンテナ化にチャレンジ。ただし、導入が目的化しないように • Docker Desktop は勉強用やローカル開発に最適 • ただし、Docker

    Desktop はライセンスだけに注意 • コンテナとイメージの基礎を押さえるには、仮想サーバの概念を消す・別物 • コンテナ化の第一歩は Docker イメージを自分で作れるようにする • 出来合いの Docker イメージを使うべき • Dockerfile ベストプラクティスを参考にする • 迷ったら公式ドキュメントを読む • https://docs.docker.com