概要
Docker は、アプリと実行に必要な環境をコンテナとしてまとめ、ローカル、CI、サーバーで同じ形に近づけやすくする仕組みです。多くの人が Docker を調べ始める理由は概念そのものではなく、「自分の PC では動くのにサーバーではエラーになる」という現実的な問題です。
この記事では、Docker のイメージとコンテナ、仮想マシンとの違い、Ubuntu での Docker Engine インストール、Windows/macOS で Docker Desktop を使う理由、Dockerfile と Docker Compose の最小例、入門者が hello-world から実際の開発環境へ進むときの注意点を整理します。
確認元:Docker 公式ドキュメント、Docker Engine/Desktop リリースノート、Docker Compose ドキュメント、Ubuntu パッケージ情報、Podman 公式サイト。実サーバーで操作する前には、必ず公式ドキュメントを最終確認してください。
この記事の内容
背景
デプロイ時の失敗は「ローカルでは動くのにサーバーでは動かない」という曖昧な形で現れます。原因は OS パッケージ、ランタイムバージョン、環境変数、ネットワークポート、ファイルパス、手作業で変えたサーバー状態の差分などです。
Docker では、アプリファイルと実行設定を含む イメージ を作り、そのイメージから コンテナ を起動します。開発、CI/CD、再現可能なテスト環境において、構築、起動、停止、置き換えを整理しやすくなります。
- 開発環境と実行環境を同じ形式で説明しやすい
- アプリ起動手順を自動化しやすい
- CI/CD で同じ形のイメージを繰り返しビルド・テストできる
- 複数サービスを Docker Compose でまとめて起動できる
確認した情報
| 確認元 | この記事での対応内容 |
|---|---|
| Docker 概念ドキュメント | イメージ、コンテナ、Registry、Dockerfile、Compose の基礎 |
| Docker Engine Ubuntu インストール文書 | 公式 APT リポジトリと docker-ce 系パッケージの手順 |
| Docker Compose 文書 | 現在一般的な docker compose CLI プラグイン形式 |
| Ubuntu パッケージ情報 | Ubuntu リポジトリの docker.io パッケージ |
| Podman 公式サイト | Linux/サーバー用途で比較できる代替案 |
Docker の概念とインストール
Docker とは
Docker はコンテナベースのアプリ実行プラットフォームです。コンテナは隔離された環境でアプリプロセスを動かしますが、完全な仮想マシンのようにアプリごとに独立した Guest OS を起動するわけではありません。
| 用語 | 意味 |
|---|---|
| Image | アプリファイル、ライブラリ、設定を含む読み取り専用テンプレート |
| Container | イメージから起動した実行インスタンス |
| Docker Engine | コンテナを作成・実行する中核ランタイム |
| Docker CLI | docker run、docker build、docker ps などを実行するツール |
| Registry | Docker Hub など、イメージを保存・配布する場所 |
| Docker Compose | YAML で複数コンテナサービスを定義して一緒に起動するツール |
コンテナと仮想マシンの違い
| 観点 | 仮想マシン | Docker コンテナ |
|---|---|---|
| 隔離方式 | Hypervisor 上で Guest OS を実行 | Host OS カーネルを共有し、プロセスを隔離 |
| 起動速度 | 一般に遅め | 一般に速め |
| リソース使用 | 重め | 多くのアプリ負荷では軽め |
| 典型用途 | OS レベル隔離、強い VM 境界 | アプリのパッケージング、デプロイ、開発環境統一 |
コンテナが常に仮想マシンより安全という意味ではありません。権限、マウント、公開ポート、イメージの信頼性、Docker socket の露出を確認する必要があります。
Ubuntu に Docker Engine をインストールする
Ubuntu では Docker 公式 APT リポジトリを追加して Docker Engine をインストールする手順が推奨されています。Ubuntu 標準リポジトリにも docker.io がありますが、公式の Engine、Buildx、Compose プラグインに合わせるなら Docker 公式リポジトリが分かりやすいです。
| インストール経路 | 意味 | 向いている場面 |
|---|---|---|
docker-ce |
Docker 公式リポジトリの Community Edition パッケージ | Docker 公式手順とプラグイン名に合わせたい場合 |
docker.io |
Ubuntu ディストリビューションの Docker パッケージ | 組織が Ubuntu パッケージ更新ポリシーを重視する場合 |
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
インストール後は次で確認します。
sudo docker run hello-world
sudo なしで Docker を実行する
sudo usermod -aG docker $USER
newgrp docker
docker run hello-world
個人開発機では便利ですが、docker グループは宿主機に対して強い権限を持ち得ます。本番サーバーでは権限ポリシーを確認してください。
Windows と macOS の Docker Desktop
Windows/macOS では通常 Docker Desktop を使います。Docker Engine、Docker CLI、Docker Compose、GUI 管理機能を含みます。ただし Linux コンテナを動かす場合、ネイティブ Linux サーバーと同じではなく、仮想化レイヤーを使います。
docker version
docker run hello-world
よく使う Docker コマンド
docker run -it ubuntu bash
docker ps
docker ps -a
docker images
docker stop <container_id>
docker rm <container_id>
docker rmi <image_id>
イメージとコンテナの流れ
Dockerfile を書く
↓
docker build でイメージを作る
↓
docker run でコンテナを起動する
↓
docker logs / docker exec で状態を見る
↓
docker stop / docker rm で片付ける
docker run -d --name sample-nginx -p 8080:80 nginx:stable
curl http://localhost:8080
docker stop sample-nginx
docker rm sample-nginx
簡単な Dockerfile 例
FROM nginx:stable
COPY ./index.html /usr/share/nginx/html/index.html
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Docker Test</title>
</head>
<body>
<h1>Hello Docker</h1>
</body>
</html>
docker build -t sample-nginx-page .
docker run -d --name sample-page -p 8080:80 sample-nginx-page
curl http://localhost:8080
docker stop sample-page
docker rm sample-page
Docker Compose 例
現在の Docker 環境では、古い単独バイナリ docker-compose ではなく docker compose が一般的です。
services:
postgres:
image: postgres:16
container_name: sample-postgres
ports:
- "5432:5432"
environment:
POSTGRES_DB: sampledb
POSTGRES_USER: sampleuser
POSTGRES_PASSWORD: "****"
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
docker compose up -d
docker compose down
# 注意:これは named volume も削除し、永続化された DB データも消します。
docker compose down -v
ベストプラクティス
公式または信頼できるイメージを使う
Docker Hub には多数のイメージがありますが、すべてが保守され、安全で、本番向きとは限りません。
イメージタグを明確に固定する
本番や本番に近い環境では latest に頼らず、postgres:16 のような明示的なタグを使います。
環境依存の設定を分離する
DB アドレス、ポート、実行モードなどは Compose の environment、.env、デプロイ環境の設定管理に分け、機密値は適切な Secret 方式を使います。
ボリュームとネットワークを意識する
データをコンテナ再作成後も残すなら、ボリュームや外部ストレージを使います。Compose ではサービス名で通信できることも理解しておきます。
本番前にセキュリティ設定を確認する
- コンテナユーザーと権限
- 宿主機ディレクトリのマウント範囲
- Docker socket の露出
- イメージ脆弱性スキャン
- 公開ポート
- ログと監視
必要に応じて Docker と Podman を比較する
| 観点 | Docker | Podman |
|---|---|---|
| 使いやすさ | Docker Desktop、Engine、Compose のエコシステムが大きい | Docker CLI に近い使用感 |
| Daemon モデル | Docker daemon が中心 | daemonless モデルで知られる |
| 向いている場面 | ローカル開発標準化、Compose ワークフロー、Docker Hub エコシステム | Rootless コンテナ、Linux サーバー中心の運用、特定のセキュリティポリシー |
よくあるエラーと調査
docker.io と docker-ce を混同する
どちらの更新ポリシーに従うのかを先に決めます。
判断なしにユーザーを docker グループへ追加する
権限エラーは解消しやすいですが、宿主機に対する強い権限を持つ可能性があります。
コンテナを手作業で保守する仮想マシンのように扱う
Dockerfile、Compose、環境変数、再作成できるイメージで管理します。
永続データをコンテナ内部だけに置く
データベースやアップロードファイルはボリュームまたは外部ストレージに置きます。
FAQ
Ubuntu で permission denied が出たら?
permission denied while trying to connect to the Docker daemon socket は、現在のユーザーに Docker daemon socket への権限がない場合によく出ます。
sudo usermod -aG docker $USER
newgrp docker
docker compose が使えない場合は?
docker compose version
sudo apt install docker-compose-plugin
Linux サーバーでは Docker Desktop が必要?
不要です。Linux サーバーでは通常 Docker Engine と Compose プラグインを直接使います。
インストール成功を確認するには?
docker version
docker run hello-world
結論
Docker の価値は、アプリの実行環境を構築、起動、停止、再作成できる単位にすることです。Ubuntu では Docker 公式リポジトリが Engine と Compose プラグインの分かりやすい導入経路で、Windows/macOS では Docker Desktop が一般的な入口です。ただし「インストールできた」だけで終わらせず、パッケージ元、権限、タグ、ボリューム、ポート公開、本番セキュリティも確認してください。
参考文献
- Docker Docs: What is Docker?
- Docker Docs: Install Docker Engine on Ubuntu
- Docker Docs: Linux post-installation steps
- Docker Docs: Docker Desktop
- Docker Docs: Docker Compose installation
- Ubuntu Packages: docker.io
- Podman Official Site