現代のアプリケーション開発とデプロイにおいて、コンテナ技術は必須のスキルとなっています。コンテナは、アプリケーションとその実行に必要なすべての環境(ライブラリ、設定ファイルなど)を一つにパッケージ化し、どこでも一貫して実行できるようにする技術です。この章では、コンテナ技術のデファクトスタンダードであるDockerに焦点を当て、その基礎と操作方法を解説します。
1. 仮想環境とコンテナの違い
コンテナ技術を理解する上で、従来の**仮想マシン(VM)**との違いを明確にすることが重要です。
仮想マシン(VM):
ホストOS上にハイパーバイザーを介して、ゲストOS全体(カーネルを含む)をエミュレートし、その上にアプリケーションを実行します。
メリットは完全なOSレベルの分離ですが、OS自体の起動や動作に大きなリソース(CPU、メモリ)を消費し、起動に時間がかかります。
コンテナ(Docker):
ホストOSのカーネルを共有し、その上にアプリケーションの実行環境(ライブラリ、バイナリなど)だけを分離してパッケージ化します。
OSカーネルを共有するため、VMよりもはるかに軽量で高速に動作し、リソース消費も抑えられます。
コンテナは、**「手軽で高速な軽量仮想環境」**を提供し、「自分のPCで動いたのに、本番環境で動かない」という問題を解消します。
2. Dockerの基本概念
Dockerを扱う上で不可欠な、3つの基本要素を理解しましょう。
Docker Image(イメージ):
アプリケーションを実行するために必要なすべての情報(コード、ランタイム、システムツール、ライブラリ、設定)を読み取り専用でパッケージ化したものです。
コンテナを作成するための設計図であり、一度作成すればどこでも同じコンテナを起動できます。
Docker Container(コンテナ):
イメージを基に作成された、アプリケーションの**実行可能なインスタンス(実体)**です。
コンテナ内はホストOSから分離されており、独立したファイルシステム、ネットワーク、プロセス空間を持ちます。
起動、停止、削除が迅速に行えます。
Dockerfile:
イメージを作成するための手順を記述したテキストファイルです。
ベースとなるOSの指定、ファイルのコピー、必要なパッケージのインストール、実行コマンドの設定などを、特定の命令群(
FROM,COPY,RUN,CMDなど)を使って記述します。
3. Dockerの基本操作
コマンドラインでの主要なDocker操作を習得します。
イメージの取得:
Bash
docker pull <イメージ名>:<タグ> # 例: docker pull nginx:latestコンテナの実行(起動):
Bash
docker run -d -p <ホストポート>:<コンテナポート> --name <コンテナ名> <イメージ名> # 例: docker run -d -p 8080:80 --name my-web nginx # -d: デタッチモード(バックグラウンド実行) # -p: ポートフォワーディング(ホストとコンテナのポートを紐付ける)コンテナの一覧表示:
Bash
docker ps # 実行中のコンテナ一覧 docker ps -a # 停止中のコンテナも含む全コンテナ一覧コンテナの停止と削除:
Bash
docker stop <コンテナ名またはID> docker rm <コンテナ名またはID>コンテナ内へのアクセス:
Bash
docker exec -it <コンテナ名またはID> /bin/bash # 実行中のコンテナ内でシェル(bash)を起動し、操作する
4. Dockerイメージの作成 (Dockerfile)
アプリケーションをコンテナ化するためのイメージ作成手順を学びます。
Dockerfileの作成: プロジェクトのルートディレクトリに
Dockerfileという名前のファイルを作成します。基本的な記述例:
Dockerfile
# ベースイメージの指定 (アプリケーションの実行環境) FROM python:3.10-slim # 作業ディレクトリの設定 WORKDIR /app # アプリケーションコードをコンテナ内にコピー COPY . /app # 必要なパッケージのインストール (例: Pythonの依存ライブラリ) RUN pip install --no-cache-dir -r requirements.txt # 外部に公開するポートの指定 EXPOSE 8000 # コンテナが起動したときに実行されるコマンド CMD ["python", "app.py"]イメージのビルド(作成): Dockerfileがあるディレクトリで以下のコマンドを実行します。
Bash
docker build -t <イメージ名>:<タグ> . # -t: イメージに名前とタグを付ける # .: ビルドコンテキスト(Dockerfileを探す場所)作成したイメージの実行:
Bash
docker run -d -p 8000:8000 <イメージ名>:<タグ>
この一連のプロセスにより、開発環境、テスト環境、本番環境のすべてで、まったく同じ実行環境を確実に構築・デプロイすることが可能になります。