Daily-It

개발, AI, 인프라, 자동화와 일상 IT 제품 후기를 직접 써보며 정리하는 기술 블로그입니다.

Docker の概念と Ubuntu インストールガイド:コンテナ、Compose、よくある落とし穴

概要

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 rundocker builddocker 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.iodocker-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 が一般的な入口です。ただし「インストールできた」だけで終わらせず、パッケージ元、権限、タグ、ボリューム、ポート公開、本番セキュリティも確認してください。

参考文献

韓国語原文:この記事は韓国語原文をもとに、日本語読者向けに用語、確認手順、注意点を整理しています。韓国語原文を見る