1. 仮想化環境における Docker と VM の差異
従来の仮想マシン(VM)と比較して、コンテナ技術が選ばれる主な理由はリソース効率にあります。VM は各インスタンスに独立したゲスト OS を搭載する必要があるのに対し、コンテナはホストマシンのカーネルを利用します。したがって、複数のアプリケーションをデプロイする場合、コンテナは起動オーバーヘッドが小さく、秒単位での立ち上がりが可能です。
以下の表に両者の主要な特性をまとめました。
| 比較項目 | Docker (コンテナ) | VM (仮想マシン) |
|---|---|---|
| 仮想化レベル | OS レベル | ハードウェアレベル |
| 起動速度 | 高速(秒単位の起動) | 低速(分単位になる場合も) |
| 性能インパクト | 物理に近い(約 95% 以上) | やや低下(約 5〜20% のオーバーヘッド) |
| 隔離性 | プロセスレベル(Namespace) | 強固なハードウェア分割 |
| セキュリティ強度 | 標準レベル | 高い(カーネル分離により堅牢) |
| ポートフォリオ移行性 | 高い | 高い |
2. Docker の構成要素
- イメージ (Image): アプリケーション実行に必要なファイルセットをテンプレート化したものです。「Tomcat」イメージがあれば、それをもとにコンテナを生成できます。
- コンテナ (Container): イメージを実行している状態です。リソースが隔離された、独立した環境として機能します。
- レジストリ (Registry): イメージを保存・管理する場所です。Docker Hub や私設レポジトリなどが該当します。
3. Linux(CentOS) 上での環境構築
既存のバージョンとの競合を避けるため、旧バージョンを削除してから新規インストールを行う手順を示します。
3.1 既存パッケージのクリーンアップ
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-engine
3.2 リポジトリの追加設定
sudo yum install -y yum-utils
# 公式またはミラーサイトへの設定
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3.3 インストールと起動
# パッケージ更新
sudo yum makecache fast
# エンジン、CLI、コンテナランタイムのインストール
sudo yum install docker-ce docker-ce-cli containerd.io -y
# サービス有効化と起動
sudo systemctl enable docker
sudo systemctl start docker
3.4 検証方法
インストールが正しく完了したか確認するために、バージョン表示やテストイメージの取得を行います。
docker version
docker run hello-world
初回実行時は「hello-world」イメージがローカルに存在しないため、レジストリから自動ダウンロードされ、ステータスが正常であれば「Hello from Docker」というメッセージが表示されます。これは Docker クライアントがデーモンと通信し、イメージを取得してコンテナを生成し、その出力を受け取っていることを示しています。
3.5 運用開始前の設定
日本国内などでダウンロード速度を向上させるため、ミラーサーバーを設定することが一般的です。/etc/docker/daemon.json に以下のように登録します。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
4. Docker の動作原理概要
Docker はクライアント - サーバーモデルで動作します。主にホスト上で Docker ダーモンがバックグラウンドで実行されており、コマンドラインや API から発行される要求がソケットを通じてサービス側に送信されます。
5. 主要コマンド集
5.1 イメージ操作
- 検索:
docker search キーワード(例:docker search nginx --filter=Stars=500) - プル:
docker pull イメージ名(例:docker pull redis:latest)- イメージは階層構造で展開され、変更のない層はキャッシュとして再利用されます。
- リスト表示:
docker imagesまたはdocker images -a(すべて表示) - 削除:
docker rmi イメージ名(強制削除には-fオプションを使用)
5.2 コントローラのライフサイクル管理
コンテナの生成から終了までのフローについて説明します。
# 対話型セッションで起動(インタラクティブ実行)
docker run -it centos:7 /bin/bash
# バックグラウンド実行(例:Web サーバなど)
docker run -d -P nginx
# 作成済みコンテナの表示
docker ps # 実行中のみ
docker ps -a # 全ステータス表示
# スタート/ストップ
docker start [CONTAINER_ID]
docker stop [CONTAINER_ID]
docker kill [CONTAINER_ID]
注記:デタッチモードでの注意点
-d オプションでバックグラウンド起動した際、コンテナ内でアクティブなフロントエンドプロセスがない場合、自動的に終了します。例えば単純な echo コマンドでは、処理終了とともにコンテナも止まります。常駐させるためには、永続的なプロセス(例:sleep infinity や Web サーバのプロセス)が必要になります。
5.3 メタデータと監視
- ログ確認:
docker logs -f -n 50 [CONTAINER_ID](直近 50 行をリアルタイム追跡) - プロセス確認:
docker top [CONTAINER_ID] - リソース使用量:
docker stats(リアルタイムの CPU、メモリ、I/O 監視) - 詳細情報:
docker inspect [CONTAINER_ID](JSON 形式の設定情報)
5.4 コンテナ内部へアクセス
- docker exec: 新しいシェルセッションを開始して進入(推薦される方法)。新しい PID ネームスペースを作成しません。
- docker attach: 現在進行中のプロセスの標準入出力に直接接続。終了するとコンテナからも切断されます。
docker exec -it [CONTAINER_ID] /bin/bash
5.5 ネットワークとボリューム
ホストとコンテナ間の連携をスムーズにするための重要なパラメータです。
docker run -d \
--name my-app \
-p 8080:80 \
-v /host/path:/app/logs:ro \
-e TZ=Asia/Shanghai \
my-image:tag
--net host: ホストのネットワークを直接使用(ポートマッピング不要だが、ポート競合リスクあり)。-v: ボリュームマウント。外部ディレクトリをコンテナ内のパスに紐付けます。
6. 実践的な導入サンプル
6.1 Nginx のデプロイ
簡易的な Web サーバのテストケースです。
docker run -d --name nginx-test -p 8081:80 nginx:alpine
ブラウザでホストの 8081 ポートにアクセスすることで表示を確認できます。指定したタグが存在しない場合は自動的にプルされます。
6.2 Tomcat のカスタマイズ
標準の Tomcat イメージは最小限に設計されているため、デフォルトの状態では webapps ディレクトリが空の場合があります。独自の WAR ファイル配置のために、コンテナ起動時にマウントポイントを用意するか、カスタムイメージを作成します。
docker run -d -p 8888:8080 --name tomcat-custom tomcat:9-jdk11
この環境で、webapps.dist の内容をベースにカスタマイズを進めることができます。
6.3 Elasticsearch のリソース調整
検索エンジン用コンテナはメモリ消費が多いため、JVM 設定を制限する必要があります。
docker run -d \
--name es-node \
-e discovery.type=single-node \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
elasticsearch:7.x
Elasticsearch は通常多数のリクエストを捌くため、適切なメモリ割り当てとディスクのマウントが重要です。
7. GUI 管理ツール:Portainer
Docker エンジンの操作を視覚的に行うためのツールです。特に中小規模のインフラ管理において便利です。
docker volume create portainer_data
docker run -d -p 9000:9000 \
--name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce
ブラウザでポート 9000 にアクセスすると、Web UI によるコンテナやイメージの管理が可能になります。
8. イメージの仕組みと階層構造
Docker イメージは、いくつかの読み取り専用レイヤ(層)が結合されたものとして扱われます。
8.1 結合ファイルシステム (Union FS)
異なるレイヤーを重ね合わせる技術です。OS カーネル、言語ランタイム、アプリケーションコードなどがそれぞれ別々の層を持ちます。共通するベース層(例:Ubuntu や Alpine)は重複したデータを保存せず、共有することでストレージ節約を実現します。
8.2 bootfs と rootfs の役割
- bootfs: ブートローダーとカーネルを含む最も下のレイヤー。
- rootfs: 実際の OS ファイルシステム(/bin, /etc など)を含む層。ここが「Linux ディストリビューション」の実体となります。
VM が数 GB になるのに対し、コンテナが数百 MB で済むのは、bootfs がホストと共有され、rootfs も必要最小限に圧縮されているためです。
8.3 プル時の挙動
イメージをダウンロードする際、既にローカルにある層(Layer)はスキップされ、必要な層だけが転送されます。これにより、ネットワーク帯域と時間の節約が図れます。
9. イメージの作成とコミット
実行中のコンテナの変更点を新たなイメージとして保存する機能です。
docker commit \
-m "Add configuration changes" \
-a "Admin Name" \
[CONTAINER_ID] \
my-custom-image:version1
docker commit は、一度起動したコンテナの設定変更やファイル添加を固定したい場合に有効ですが、本番環境向けの CI/CD パイプラインでは、通常は Dockerfile を利用して再構築するのが推奨されます。ただし、特定のトラブルシューティングや学習目的においては強力な手段となります。