エラノート エラノート

Docker入門|コンテナの基本からdocker-composeまで

Docker コンテナ 環境構築 docker-compose 初心者
広告スペース (article-top)

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を実行して、コンテナの動作を体験してみてください。開発環境の構築が格段に楽になります。

広告スペース (article-bottom)

あわせて読みたい