Docker入門|コンテナの基本からdocker-composeまで
Dockerは、アプリケーションを「コンテナ」という単位で動かすためのツールです。「自分のPCでは動くのに、他の人のPCでは動かない」という問題を解決できます。この記事ではDockerの基本概念からdocker-composeまでを初心者向けに解説します。
コンテナとは何か
コンテナとは、アプリケーションとその動作に必要なライブラリや設定をひとまとめにした「箱」のようなものです。この箱の中にはアプリが動くために必要なものがすべて入っているため、どの環境でも同じように動作します。
仮想マシンとの違い
仮想マシン(VM)もアプリの実行環境を分離する技術ですが、コンテナとは仕組みが異なります。
仮想マシン:
ホストOS → ハイパーバイザー → ゲストOS → アプリ
(OSごと仮想化するため重い)
コンテナ:
ホストOS → Dockerエンジン → コンテナ → アプリ
(OSのカーネルを共有するため軽い)
仮想マシンはOS全体を仮想化するため起動に数分かかりますが、コンテナはOSのカーネルを共有するため数秒で起動します。メモリやディスクの消費も少なく済みます。
Dockerを使うメリット
Dockerを使う主なメリットは以下の通りです。
- 環境の再現性: チームメンバー全員が同じ環境で開発できる
- セットアップの簡略化: 長い手順書の代わりにDockerfileで環境を定義できる
- 環境の分離: プロジェクトごとに異なるバージョンのツールを使い分けられる
- 本番環境との一致: 開発環境と本番環境を同じ構成にできる
Dockerのインストール
Windows / macOS の場合
Docker Desktop(https://www.docker.com/products/docker-desktop/)をダウンロードしてインストールします。Docker DesktopにはDockerエンジンとGUIツールが含まれています。
インストール確認
# Dockerのバージョンを確認
docker --version
# Docker version 27.x.x と表示されればOK
# 正常に動作するか確認
docker run hello-world
# "Hello from Docker!" と表示されれば成功
Linuxの場合
Linuxではパッケージマネージャーからインストールします。
# Ubuntu の例
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
# 一般ユーザーでdockerコマンドを実行できるようにする
sudo usermod -aG docker $USER
基本的なDockerコマンド
docker run でコンテナを起動する
docker runはイメージからコンテナを作成して起動するコマンドです。
# Pythonの対話環境を起動
docker run -it python:3.12 python
# Nginxのウェブサーバーを起動(バックグラウンド)
docker run -d -p 8080:80 nginx
# ブラウザで http://localhost:8080 にアクセスすると表示される
-itはターミナルで対話的に操作するためのオプション、-dはバックグラウンドで実行するオプション、-pはポートの転送設定です。
コンテナの管理
# 実行中のコンテナ一覧
docker ps
# 停止中も含めた全コンテナ一覧
docker ps -a
# コンテナを停止
docker stop コンテナID
# コンテナを削除
docker rm コンテナID
# 停止中のコンテナをすべて削除
docker container prune
イメージの管理
イメージとは、コンテナを作るための「設計図」にあたるものです。Docker Hub(https://hub.docker.com/)で公開されているイメージを利用できます。
# イメージをダウンロード
docker pull python:3.12
# ダウンロード済みのイメージ一覧
docker images
# イメージを削除
docker rmi python:3.12
Dockerfileでオリジナルのイメージを作る
Dockerfileは、独自のイメージを作るための設定ファイルです。ベースとなるイメージの上に、自分のアプリに必要な設定を追加していきます。
Dockerfileの基本構文
# ベースイメージを指定
FROM python:3.12-slim
# 作業ディレクトリを設定
WORKDIR /app
# ファイルをコンテナにコピー
COPY requirements.txt .
# コマンドを実行(パッケージのインストール)
RUN pip install --no-cache-dir -r requirements.txt
# アプリケーションのコードをコピー
COPY . .
# コンテナ起動時に実行するコマンド
CMD ["python", "app.py"]
イメージのビルドと実行
# Dockerfileからイメージをビルド
docker build -t my-python-app .
# ビルドしたイメージからコンテナを起動
docker run -p 5000:5000 my-python-app
-tオプションでイメージに名前(タグ)をつけられます。末尾の.はDockerfileがあるディレクトリを指定しています。
実用的なDockerfileの例
FlaskアプリケーションのDockerfileを例に見てみましょう。
FROM python:3.12-slim
WORKDIR /app
# 依存パッケージを先にインストール(キャッシュを活用)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# 環境変数を設定
ENV FLASK_APP=app.py
ENV FLASK_ENV=production
# ポートを公開
EXPOSE 5000
CMD ["flask", "run", "--host=0.0.0.0"]
COPY requirements.txt .を先に実行してからアプリのコードをコピーしているのは、依存パッケージが変わらない限りキャッシュが使われてビルドが高速化されるためです。
docker-composeで複数コンテナを管理する
実際のアプリケーションでは、Webサーバーとデータベースなど複数のコンテナを組み合わせて使うことが一般的です。docker-composeは複数コンテナの定義と起動を一つのファイルで管理できるツールです。
docker-compose.ymlの基本
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/app
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
この設定では、FlaskアプリのコンテナとPostgreSQLのコンテナを定義しています。depends_onで起動順序を制御し、volumesでデータを永続化しています。
docker-composeの基本コマンド
# コンテナを起動(バックグラウンド)
docker compose up -d
# コンテナの状態を確認
docker compose ps
# ログを表示
docker compose logs
# 特定のサービスのログを表示
docker compose logs web
# コンテナを停止
docker compose down
# コンテナとボリュームを削除(データも消える)
docker compose down -v
開発時に便利な設定
開発中は、ファイルの変更をリアルタイムでコンテナに反映させたい場合があります。volumesを使ってホストのディレクトリをコンテナにマウントします。
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/app # ホストの現在のディレクトリをコンテナの/appにマウント
environment:
- FLASK_ENV=development
これにより、ローカルでコードを編集するとコンテナ内にも即座に反映されます。
よくあるトラブルと対策
ポートが既に使用されている
# エラー: Bind for 0.0.0.0:8080 failed: port is already allocated
# 使用中のポートを確認
docker ps
# 別のポートを指定して起動
docker run -d -p 8081:80 nginx
コンテナの中に入って調査する
# 実行中のコンテナに入る
docker exec -it コンテナID /bin/bash
# コンテナの中でコマンドを実行
ls /app
cat /etc/os-release
exit
ディスク容量の確認と整理
Docker を使い続けると不要なイメージやコンテナが溜まります。
# Dockerが使用しているディスク容量を確認
docker system df
# 不要なデータをすべて削除
docker system prune -a
まとめ
Dockerは「コンテナ」という仕組みでアプリケーションの実行環境をパッケージ化するツールです。docker runでコンテナを起動し、Dockerfileで独自のイメージを作り、docker-composeで複数コンテナを管理できます。まずはdocker run hello-worldを実行して、コンテナの動作を体験してみてください。開発環境の構築が格段に楽になります。