目次
Dockerチュートリアル:コンテナの実行からComposeによるデプロイまで
Dockerは、アプリケーションとその実行に必要なもの(実行環境、ライブラリ、設定)をひとまとめにするツールです。まとめたものを**イメージ(image)と呼び、実行したものがコンテナ(container)**です。同じイメージなら、あなたのノートパソコンでも、同僚のコンピューターでも、クラウドサーバーでも、同じように動作します。
- 開発元
- Docker, Inc.
- 初回リリース
- 2013年
- 開発言語
- Go
- ライセンス
- Docker Engineはオープンソースソフトウェア(Apache License 2.0)、Docker Desktopは商用ソフトウェアで、個人および小規模企業は無料です
- 公式サイト
- www.docker.com
- 公式ドキュメント
- docs.docker.com
このDockerチュートリアルでは、基本概念から始めて、自分でDockerfileを書き、Docker Composeで複数のサービスを管理し、最後にWebサイトをクラウドホストへデプロイできるところまで学びます。
公式リソース
| リソース | URL | 用途 |
|---|---|---|
| 公式サイト | www.docker.com | 製品紹介、Docker Desktopのダウンロード、料金プラン |
| 公式ドキュメント | docs.docker.com | コマンドと設定の詳細なリファレンス |
| インストールガイド | Get Docker | 各OS向けの公式インストール手順 |
| Docker Hub | hub.docker.com | イメージの検索とダウンロード、自分のイメージのプッシュ |
| Docker Engineのソースコード | github.com/moby/moby | Docker Engineのオープンソースプロジェクト(Moby) |
| Docker CLIのソースコード | github.com/docker/cli | dockerコマンドのソースコード |
| Docker Composeのソースコード | github.com/docker/compose | docker composeのソースコードとリリース |
| バージョン情報 | Engine、Desktop | 各バージョンの新機能と変更点 |
DockerおよびクジラのロゴはDocker, Inc.の商標です。このチュートリアルは非公式の学習リソースであり、Docker, Inc.とは関係ありません。
このチュートリアルで使用するバージョン
チュートリアル内のすべてのコマンドは、2026年10月に実際に実行しています。黒い背景のターミナルブロックは実際の実行結果です(ダウンロードの進行状況など、学習に関係のない内容だけを削除しています)。コンテナID、時刻、ファイルサイズなどの数値は、あなたの環境ではチュートリアルと異なりますが、問題ありません。
| ソフトウェア | このチュートリアルで確認したバージョン | 最低要件と説明 |
|---|---|---|
| Docker Engine | 29.9.0 | 25以上を推奨します。それ以前のバージョンでもほとんどのコマンドを使用できますが、一部の出力形式が異なります |
| Docker Compose | v5.6.0 | docker compose(プラグイン版)を使用します。v2.20以上で、このチュートリアルのcompose.yamlを実行できます。旧版のdocker-compose(v1)はサポート終了です |
| Docker Buildx | v0.38.0 | Docker Engine 23以降では、ビルドにBuildKitがデフォルトで使用されます。RUN --mountなどの構文にはBuildKitが必要です |
| Docker Desktop(Windows、macOS) | 4.95 | Docker EngineとComposeが付属します。下記のシステム要件を参照してください |
Composeのバージョン番号はv2からv5へ直接進みました(古いComposeファイル形式の「version 2 / 3」との混同を避けるため、v3とv4を飛ばしています)。コマンドの使い方はv2と同じです。
システム要件
| システム | 要件 |
|---|---|
| Windows | Windows 10 22H2(ビルド19045)またはWindows 11 23H2(ビルド22631)以降の64ビット版。WSL 2.1.5以上、BIOSでの仮想化有効化が必要です。メモリは8 GB以上必要です |
| macOS | 最新の主要バージョン3つ。Apple SiliconまたはIntel。メモリは4 GB以上必要です |
| Linux | このチュートリアルではUbuntu(24.04 / 26.04)、x86_64またはarm64を使用します。その他の主要ディストリビューションにもDocker Engineをインストールできます |
サンプルで使用するイメージのバージョン
| イメージ | バージョン | 用途 |
|---|---|---|
nginx | 1.30(stable) | Webサーバー、リバースプロキシ |
node | 24(LTS) | Node.jsの例 |
python | 3.14 | Pythonの例 |
postgres | 18 | PostgreSQLデータベース |
mysql | 8.4(LTS) | MySQL、WordPress |
redis | 8 | Redisキャッシュ |
wordpress | 7 | WordPressの実践例 |
alpine / ubuntu | 3.23 / 26.04 | 練習用のベースイメージ |
caddy | 2 | HTTPS自動化リバースプロキシ、デプロイ |
golang + distroless/static-debian13 | 1.27 | マルチステージビルド、マルチプラットフォームイメージ |
registry | 3 | ローカルRegistry(プッシュの練習) |
phpmyadmin / adminer | latest | データベース管理インターフェース |
例ではできるだけ固定バージョン(postgres:18など)を指定しています。手順どおりに進めれば、チュートリアルと同じ結果を得られます。
学べること
- Docker、イメージ、コンテナの関係
- Windows、macOS、LinuxへのDockerのインストール
docker runでのコンテナ実行と、コンテナのライフサイクル管理- Dockerfileを書いて、自分のプログラムをイメージにパッケージ化する方法
- Volumeでデータを保存し、ネットワークでコンテナ同士を接続する方法
- Docker Composeで複数のサービスを一度に起動する方法
- DockerでPython、Node.js、Nginx、MySQL、PostgreSQL、Redis、WordPressを実行する方法
- ディスク容量の整理、セキュリティ設定、RootlessとPodman、マルチプラットフォームイメージ
- GitHub Actionsでクラウドホストへのビルドとデプロイを自動化する方法
- Dockerの内部の仕組み(namespace、cgroup、overlayfs)
- エラーが発生したら、よくあるエラーメッセージ一覧で原因を確認できます。よく使うコマンドの全オプションは「コマンドリファレンス」を参照してください
対象読者
- Dockerを初めて使う開発者
- 「自分のコンピューターでは動く」という問題によく直面するチーム
- サーバーを手作業で設定せずに、プロジェクトをクラウドへデプロイしたい人
ターミナル(コマンドライン)でコマンドを入力できれば始められます。Linuxやサーバー管理の事前知識は必要ありません。
このチュートリアルの読み方
- 白い背景のコードブロックは、入力するコマンドまたはファイルの内容です。右上の「コピー」をクリックするとコピーできます。
- 黒い背景でTerminalと表示されたブロックは実行結果です。
$で始まる行が入力したコマンドで、その下が出力です。「コピー」をクリックするとコマンドだけがコピーされます。 - Linux / macOS、Windows PowerShell、Windows CMDのタブがあるコマンドでは、使用するシステムを選ぶと、ページ全体の表示が同じ形式に切り替わります。
- 各章の冒頭に所要時間、前提となる章、学習目標を記載しています。章末にはまとめ、解答付きの練習問題、よくある質問があります。
- スクリーンショットのWeb画面は、実際に操作して撮影したものです。Docker DesktopとDocker Hubの一部の画面はDocker公式ドキュメント(Apache License 2.0)から引用しており、キャプションに記載しています。
まず試してみる
Dockerをインストールしたら、ターミナルで次のコマンドを入力します。
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4f55086f7dd0: Pull complete
Digest: sha256:5e23090353324d887c48ad5e5c56d294eab81588df9605b07d1afe895f9cc8f8
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
Hello from Docker!と表示されれば、正常に動作しています。次はDockerとはから始めましょう。
よくある質問
Dockerをまったく使ったことがない人にも向いていますか?
はい。インストールから最初のコンテナまで、各手順に実際の実行結果を掲載しています。手順どおりに進めれば、同じ結果を得られます。
チュートリアルのコマンドはWindowsでも使えますか?
はい。異なる書き方が必要な箇所($(pwd) などのパス)には、Linux/macOS、PowerShell、CMDの3種類のタブを用意しています。WSLではLinuxの書き方をそのまま使えます。
サンプルコードをダウンロードできますか?
各章の冒頭にある「サンプルコード」リンクから、その章のプロジェクト一式を開けます。
基礎編
- Docker とは
Docker とは何か、なぜ必要なのかをわかりやすく解説します。イメージ、コンテナ、Registry の基本概念や Docker の構成、コンテナと仮想マシンの違いも学べます。
- Docker のインストール
Windows(WSL 2)、macOS、Linux(Ubuntu 26.04 / 24.04)に Docker をインストールし、仮想化と WSL の設定を確認して、docker version と hello-world で動作を確かめます。よくあるエラーと解決方法も紹介します。
- Docker Desktop の画面ガイド
Docker Desktop の画面を順に解説します。左側メニュー、Containers一覧、コンテナ詳細画面の各タブ、Composeプロジェクト、Images、イメージの検索とダウンロード、ステータスバー、各操作に対応するdockerコマンドを紹介します。
- 最初のコンテナ
nginx を使って Docker コンテナを起動し、docker run でイメージを取得してブラウザーでページを開きます。docker ps、logs、exec で確認し、stop / start / rm で管理する方法と、Docker Desktop で同じ操作を行う方法を紹介します。
- イメージ
Docker イメージの命名規則(registry、repository、tag、digest)を理解し、docker pull、images、tag、rmi、history、inspect、save / load の使い方を学びます。slim と alpine のサイズを比較し、Docker 29 の新しい docker images 出力形式とイメージのレイヤー構造も紹介します。
- コンテナのライフサイクル
実際の出力を見ながら、Docker コンテナの状態(created、running、paused、exited)、起動直後に終了する理由、stop と kill の違い、docker stop が 10 秒待つ理由、終了コードの意味、--restart 再起動ポリシーの動作を理解します。
- docker run の引数
docker run のよく使う引数をまとめて解説します。-d、-it、-p、-v、-e、--name、--rm、--network、--restart、--memory、--cpus、--user、--entrypoint、--read-only の実行コマンドと出力を紹介します。
- ログの確認とデバッグ
コンテナに問題が起きたときの調査方法を解説します。実際の出力を使って、docker logs でのログ確認(stdout と stderr の違いを含む)、docker exec によるコンテナ内での操作、docker inspect による設定確認、docker cp によるファイルコピー、docker stats / top / diff による状態確認を学びます。起動直後に終了する場合、ポートの競合、exec format error など、よくある問題の調査方法も紹介します。
イメージと Dockerfile
- Dockerfile 入門
Node.js の例を使って Dockerfile の書き方を学びます。docker build の出力で FROM、WORKDIR、COPY、RUN、CMD の役割やビルドキャッシュ、.dockerignore の効果を理解します。
- docker init による自動生成
docker init はいくつかの質問に答えるだけで Dockerfile、compose.yaml、.dockerignore、README.Docker.md を自動生成します。Node.js プロジェクトでの対話の流れ、生成ファイルの解説、docker build --check で見つかるテンプレートの警告、postgres:18 で動作しない PostgreSQL の例を確認します。
- Dockerfile 命令一覧
Dockerfile の主要な命令と実行結果を解説します。FROM、RUN、COPY、ADD、WORKDIR、ENV、ARG、EXPOSE、USER、VOLUME、HEALTHCHECK、CMD、ENTRYPOINT を取り上げ、CMD と ENTRYPOINT、COPY と ADD、ARG と ENV の違い、PID 1 と docker stop が 10 秒待つ理由を小さな実験で比較します。
- ビルドキャッシュと最適化
docker build の出力を使って、ビルドキャッシュ(CACHED)の仕組みと無効化のルールを理解します。手順の順序、apt-get の後片付け、.dockerignore、軽量なベースイメージ、キャッシュマウント、キャッシュの削除を解説します。
- マルチステージビルド
マルチステージビルドでコンパイル環境と実行環境を分離します。同じ Go プログラムで単一ステージは 1.43 GB、distroless を使った場合は 20.2 MB になることを実測します。Node.js のフロントエンドとバックエンド、Java の Dockerfile 例、--target で特定のステージだけをビルドする方法も紹介します。
- Docker Hub への push
docker login、docker tag、docker push を使って Docker Hub や GitHub Container Registry にイメージをアップロードする方法を学びます。registry:3 によるローカル Registry の構築、push と pull の実演、未ログイン時のエラー、バージョンタグの付け方も紹介します。
データとネットワーク
- Volume とデータの保存
コンテナを削除するとデータは消えてしまうのでしょうか? Docker Volume と bind mount を実際に操作し、コンテナ削除後もデータを保持する方法、匿名 Volume の仕組み、-v と --mount の存在しないパスの扱いの違い、Volume のバックアップと復元、PostgreSQL 18 イメージの新しいデータディレクトリ(古い書き方では起動に失敗)を学びます。
- ネットワークとコンテナ間通信
実際の出力を見ながら Docker ネットワークを理解しましょう。デフォルト bridge で名前解決できない理由、カスタムネットワークの内蔵 DNS、アプリからデータベースへの接続、複数ネットワークへの接続、ネットワークエイリアス、127.0.0.1 のみをリッスンするプログラムに接続できない理由、コンテナからホストに接続する host.docker.internal を説明します。
- 環境変数と .env
`-e`、`--env-file`、Dockerfile の `ENV`、Compose の `environment`・`env_file`・`.env` の違いを確認し、secrets でパスワードを安全に渡す方法を学びます。
Docker Compose
- Docker Compose 入門
Docker Compose 入門:1つの compose.yaml で Web サイト、PostgreSQL、Adminer を同時に起動します。docker compose up、ps、logs、stop、down の実行例、Adminer へのログイン(PostgreSQL を選択)、SQL の実行、down と down -v がデータに与える影響をスクリーンショット付きで解説します。
- compose.yaml の構文
Docker Compose 設定ファイル compose.yaml の構文を詳しく解説します。services、image、build、ports、volumes、environment、env_file、depends_on と healthcheck、restart、networks、profiles、compose.override.yaml のマージ、docker compose config による最終設定の確認方法を紹介します。
- docker compose コマンド
docker compose の主要コマンドと実際の出力を紹介します。up、down、ps、logs、exec、run などの使い方や、設定変更後に restart では反映されず up -d が必要な理由を解説します。
- 実践:WordPress の構築
Docker Compose で WordPress 7 と MySQL 8.4 を構築する手順を紹介します。ヘルスチェック、データの永続化、アップロード上限、phpMyAdmin、バックアップと復元、イメージの更新方法を、実行結果と画面写真付きで解説します。
実践例
- Python アプリ
Python の Web サイトを Docker イメージにまとめ、Flask と gunicorn、開発モードのホットリロード、FastAPI と uvicorn、Django の collectstatic と STATIC_ROOT エラー、uv と uv.lock によるビルド、イメージサイズの比較を実例で紹介します。
- Node.js アプリ
Node.js プロジェクトの Dockerfile の書き方と実測を紹介します。npm ci、本番用依存関係のみのインストール、node ユーザーでの実行、docker stop が10秒待つ理由(PID 1 と SIGTERM の実測)、TypeScript のマルチステージビルド、Next.js standalone による 968MB から 295MB への削減、開発時のホットリロードと compose watch を解説します。
- Nginxとリバースプロキシ
DockerのNginxで静的サイトを公開し、SPA、キャッシュ、gzipの設定、nginx -tによる構文チェック、テンプレートと環境変数、バックエンドコンテナへのリバースプロキシを学びます。実測に基づくproxy_passの末尾スラッシュ、単一ファイルのマウントが反映されない問題、502エラーの原因、CaddyによるHTTPS自動化も紹介します。
- MySQL
DockerでMySQL 8.4を起動し、実際の出力を交えて解説します。環境変数、初期化SQL、日本語のutf8mb4、コンテナ内・ホスト・他のコンテナからの接続、localhostと127.0.0.1の違い、Composeのヘルスチェックの落とし穴、mysqldumpによるバックアップと復元、パスワード変数を変更しても反映されない理由を取り上げます。
- PostgreSQL
DockerでPostgreSQL 18を起動し、実際の出力を確認します。18で変更されたデータディレクトリ、Composeの設定、pg_isreadyのヘルスチェックの注意点、psqlの基本コマンド、コンテナ内でパスワードなしでログインできる理由、pg_dumpによるバックアップと復元、16から18へのアップグレードを扱います。
- Redis
DockerでRedis 8を起動し、redis-cliの基本操作、パスワード設定とNOAUTHエラー、RDBのdocker stopとdocker rm -fの違い、AOF永続化、maxmemoryの削除ポリシーの検証、FlaskカウンターとのCompose連携、ヘルスチェックにgrep PONGが必要な理由を実際の出力とともに確認します。
運用と応用
- ディスク容量の整理
Docker がディスク容量を使いすぎていませんか?docker system df で原因を特定し、各種 prune コマンドで安全に整理します。Docker 29 の実測結果、コンテナログの上限設定も紹介します。
- セキュリティのベストプラクティス
Dockerコンテナのセキュリティ入門と実践。非rootでの実行、イメージバージョンの固定、ARG/ENV/COPYによりシークレットがイメージレイヤーに残る仕組み(実際に取り出して確認)、BuildKit secret、データベースを公開しない方法、--read-only、--cap-drop、no-new-privileges、PIDとメモリの上限、docker.sockがroot相当の権限を持つリスク、Trivyによる脆弱性スキャンと修正を解説します。
- Rootless と Podman
Docker が root 権限と同等なのはなぜでしょうか。Rootless モードではコンテナ内の root がホスト上の一般ユーザーに対応し、ホストの /etc/shadow を読めないことを検証します。常駐デーモンが不要な Podman の使い方、Dockerfile のビルド、Docker との違いと選び方も紹介します。
- 多平台イメージ
Apple Silicon Mac でビルドしたイメージをサーバーで実行すると exec format error が出るのはなぜでしょうか。CPU アーキテクチャと多平台イメージを理解し、docker buildx と Go のクロスコンパイルで linux/amd64 と linux/arm64 を一度にビルドし、docker images --tree で確認して Registry にプッシュし、manifest を調べる方法と QEMU が必要になる場合を解説します。
- GitHub Actions による自動ビルド
コードのプッシュやバージョンタグの作成をきっかけに、マルチプラットフォームの Docker イメージを自動でビルドして GitHub Container Registry(ghcr.io)へプッシュし、SSH 経由でサーバーに自動デプロイします。workflow ファイル全体、各部分の説明、metadata-action によるタグのルール、ビルドキャッシュ、Docker Hub の設定方法を紹介し、actionlint で workflow を検証します。
- クラウドサーバーへのデプロイ
DockerアプリをLinuxクラウドサーバーにゼロからデプロイします。イメージのビルドとRegistryへのプッシュ、ComposeとCaddy(HTTPS)+Node.js+PostgreSQL 18による実行、バージョン更新とロールバック、自動バックアップ、公開前のチェックリストまでを解説します。
- 内部原理
コンテナとは何でしょうか?Dockerホストで実際に確認します。コンテナはnamespaceで隔離され、cgroupでリソースを制限され、overlayfsをファイルシステムとして使うLinuxプロセスです。コンテナ内外のPID、lsnsでのnamespace確認、cgroupからの--memoryと--cpusの設定値の読み取り、upperdir内のコンテナが書き込んだファイル、capabilitiesとseccompを実際に確認します。
- よくあるエラーメッセージ集
Docker のエラーメッセージから原因を探します。Cannot connect to the Docker daemon、permission denied docker.sock、port is already allocated など、25 種類のエラーを Docker 29 の実際の出力、原因、解決方法とともに紹介します。
- Docker コマンドチートシート
日常よく使う Docker コマンドを1ページにまとめました。コンテナ、イメージ、ビルド、Volume、ネットワーク、Docker Compose、クリーンアップ、システム情報を簡潔に解説します。
コマンドリファレンス
- docker build
docker build の主なオプション(-t、-f、--build-arg、--target、--no-cache、--pull、--platform、--progress、--secret、--check、-q)を、Docker 29 の実行例とともに解説します。
- docker exec
docker exec の主なオプション(-it、-u、-w、-e、-d、--env-file、--privileged)を解説します。コンテナのシェルへの接続、ユーザーや作業ディレクトリの指定、環境変数の設定、バックグラウンド実行、コンテナ停止時のエラーを Docker 29 の例で紹介します。
- docker ps
docker ps の全オプション(-a、-q、-f/--filter、--format、-s、-n、-l、--no-trunc)を解説。Docker 29での実行例を使い、全コンテナやIDのみの表示、状態・名前・ラベルによる絞り込み、出力項目のカスタマイズ、コンテナサイズの確認、停止済みコンテナの一括削除を紹介します。
- docker logs
docker logs の全オプションを解説します(-f、-n/--tail、-t、--since、--until、--details)。Docker 29での実行例を使い、末尾の行や時刻、直近のログ、stdoutとstderrの確認、grep検索、ログの追跡方法を紹介します。
- docker cp
docker cp の使い方を解説します。コンテナとホスト間のファイルやフォルダーのコピー、パスのルール、ファイルがない場合のエラー、Windows でのデータベースのバックアップと復元を学びます。
- docker inspect
docker inspect の引数と -f/--format のテンプレート、Docker 29 での実行例を紹介します。状態や IP アドレス、環境変数、再起動ポリシーなどを確認できます。
- docker volume
docker volume の create、ls、inspect、rm、prune サブコマンドを解説します。Docker 29での実行例を使って、Volume の作成とデータの書き込み、孤立した匿名 Volume の特定、ラベルの追加と絞り込み、prune と prune -a の違いを学びます。
- docker network
docker network の create、ls、inspect、connect、disconnect、rm、prune の各サブコマンドとオプションを解説します。Docker 29 の実行例で、カスタムネットワークの名前解決、--network-alias、サブネットの指定、1つのコンテナを複数のネットワークに接続する方法、使用中のネットワークを削除したときのエラーを紹介します。
- docker compose up
docker compose up の全オプション(-d、--build、--wait、--force-recreate、--no-deps、--scale、--remove-orphans、--abort-on-container-exit、--exit-code-from、--pull、-V、--watch など)を、Docker Compose v5 の実行例付きで解説します。
- docker compose down
docker compose down のオプション(-v/--volumes、--rmi local|all、--remove-orphans、-t/--timeout)を解説。Docker Compose v5 の実行例で、down ではボリュームが保持され、down -v でデータが削除されること、down・stop・rm の違いを確認します。
更新日 2026年10月14日