なぜ今、Dockerが必要なのか?
「私の環境では動いたのに、本番環境ではエラーが出た…」
「新しい開発メンバーが入るたびに、環境構築に丸一日かかってしまう…」
このような開発現場の共通の悩みを解決するのが、Dockerとコンテナ技術です。Dockerは、アプリケーションとその実行に必要なすべての環境(ライブラリ、設定ファイルなど)を「コンテナ」と呼ばれる独立したパッケージに隔離することで、どのPCやサーバーでも一貫した動作を保証します。
この記事では、Docker初心者の方に向けて、基本概念からWebアプリケーションを動かすまでの具体的なハンズオンを通じて、Dockerの強力なパワーを体験していただきます。
1. Dockerの基本概念を理解する
Dockerを使い始める前に、特に重要な3つのキーワードを押さえておきましょう。
1-1. コンテナ (Container)
アプリケーションの実行環境全体をパッケージ化した、軽量で独立した実行ユニットです。ホストOSから隔離されているため、異なるコンテナが互いに影響を与え合うことはありません。コンテナは、仮想マシン(VM)とは異なり、ホストOSのカーネルを共有するため、数秒で起動する圧倒的なスピードが魅力です。
1-2. イメージ (Image)
コンテナを作成するための設計図であり、アプリケーションのコード、ランタイム、設定などが含まれる読み取り専用のテンプレートです。イメージは、複数の層(レイヤー)で構成されており、変更があった層だけをダウンロードするため、効率的な配布が可能です。
1-3. Dockerfile
イメージを作成するための手順(ベースOSの指定、パッケージのインストール、ファイルコピーなど)を記述するテキストファイルです。このファイルをチーム内で共有することで、誰でも完全に同じ環境を構築できます。
【内部リンク】 Dockerの歴史や仮想マシンとの詳細な違いについては、「DockerとVMの徹底比較:どちらを選ぶべきか」をご覧ください。
2. Docker入門ハンズオン:最初のコンテナを起動する
まずは、Dockerが正しくインストールされているかを確認し、最もシンプルなコンテナを起動してみましょう。
Step 1: Dockerのインストールとバージョン確認
Docker Desktop(Windows/macOS)またはDocker Engine(Linux)をインストールした後、ターミナルで以下のコマンドを実行します。
Bash
docker --version
バージョン情報が表示されない場合は、Docker公式サイトから最新版をダウンロードしてインストールしてください。
Step 2: Hello Worldコンテナを実行
docker runコマンドは、イメージをダウンロードし(ローカルになければDocker Hubから取得)、コンテナを作成して実行する、Dockerで最も基本となるコマンドです。
Bash
docker run hello-world
実行すると、Dockerが正しく機能していることを示すメッセージが表示され、コンテナはすぐに終了します。
Step 3: Nginx Webサーバーを動かす
次に、実用的な例として、Webサーバーの定番であるNginxをコンテナで起動し、ブラウザからアクセスしてみましょう。
Bash
docker run -d -p 8080:80 --name my-webserver nginx
| オプション | 意味 |
-d | デタッチモード。コンテナをバックグラウンドで実行します。 |
-p 8080:80 | ポートマッピング。ホストOSの8080番ポートをコンテナの80番ポートに接続します。 |
--name | コンテナに任意の名前を付けます。 |
nginx | 使用するイメージ名です。 |
ブラウザで http://localhost:8080 にアクセスし、「Welcome to nginx!」が表示されることを確認してください。
Step 4: コンテナの管理
起動中のコンテナを確認し、停止・削除する方法です。
Bash
# 起動中のコンテナ一覧を表示
docker ps
# コンテナのログを確認(エラー解析などに必須)
docker logs my-webserver
# コンテナを停止
docker stop my-webserver
# 停止したコンテナを削除
docker rm my-webserver
3. Dockerfileでカスタムイメージを作成する(アプリケーションのコンテナ化)
外部から取得したイメージだけでなく、自分のアプリケーションを実行するためのカスタムイメージを作成する手順です。カスタムイメージの作成は、アプリケーションを配布・デプロイする上での基本となります。
Step 1: プロジェクトファイルの準備
以下の内容でファイルを作成します。今回はPythonとFlaskを使います。
/my_flask_app
├── Dockerfile
├── app.py
└── requirements.txt
requirements.txt:Flaskを記述。app.py: ポート5000で動作する簡単なFlaskアプリを記述。
Step 2: Dockerfileを記述する
Dockerfileの各命令はレイヤーとして積み重なります。頻繁に変更されない命令(依存関係のインストールなど)を先に記述することで、ビルド時間を短縮できます。
Dockerfile
# Dockerfile
# ベースイメージの指定: 軽量な slim バージョンを選択
FROM python:3.10-slim
# 作業ディレクトリの設定
WORKDIR /app
# 依存関係のコピーとインストール(ここを先に実行しキャッシュを効かせる)
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
# アプリケーションコードをコピー
COPY . /app/
# コンテナ起動時に実行するコマンド(ENTRYPOINTとCMDの組み合わせもよく使われます)
CMD ["python", "app.py"]
Step 3: イメージのビルドと実行
Dockerfileがあるディレクトリで実行します。
Bash
# イメージをビルドし、「my-flask-app」というタグを付ける
docker build -t my-flask-app .
# コンテナを実行 (ホストの8000番をコンテナの5000番にマッピング)
docker run -d -p 8000:5000 --name flask-app my-flask-app
http://localhost:8000 にアクセスして、アプリケーションが動いているか確認しましょう。
4. Docker Compose:複数コンテナの環境を一括管理
実際の開発では、Webサーバーとデータベース(例: PostgreSQL, MySQL)など、複数のコンテナを同時に連携させる必要があります。これを実現するのがDocker Composeです。複雑な設定を一つのファイルに集約できます。
Docker Composeの基本構成
ここでは、Webアプリとデータベースのデータをホスト側に保存する(データ永続化)ためのvolumes設定も含めます。
YAML
# docker-compose.yml (WebアプリとDBの連携例)
version: '3.8'
services:
web:
build: . # Dockerfileを使用してWebアプリのイメージをビルド
ports:
- "8000:5000"
depends_on:
- db # dbサービスが起動してからwebサービスを起動する
db:
image: postgres:latest # 公式のPostgreSQLイメージを使用
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
# ボリューム設定: db-dataという名前の永続化領域にデータを保存
volumes:
- db-data:/var/lib/postgresql/data
# ボリュームを定義(データの永続化に必須)
volumes:
db-data:
コマンド
Bash
# サービスの起動(WebアプリとDBが同時に立ち上がり、ネットワークも自動構築される)
docker compose up -d --build
# サービスの一括停止・削除 (ボリュームのデータは残る)
docker compose down
# ボリュームのデータも含めて完全に削除
docker compose down -v
まとめ:Dockerで開発効率を劇的に改善しよう
Dockerは、開発環境の構築にかかる時間と労力を最小限に抑え、再現性の高い安定した環境をチーム全体に提供します。
今回ご紹介した基本のコマンド、Dockerfile、そしてDocker Composeを使いこなせば、あなたの開発プロセスは劇的に改善されるはずです。今日からコンテナ化を進め、開発の品質とスピードを両立させましょう!
コメントを残す