本記事では、Dockerコンテナの基本的な操作方法から、データの永続化と共有を実現するデータボリューム、そして複数のコンテナを効率的に管理するためのDocker Composeについて解説します。
コンテナの基本操作コマンド
Docker環境でコンテナを効率的に管理するために必要なコマンド群を紹介します。
実行中のコンテナ一覧表示
現在アクティブな状態のコンテナを確認するには、以下のコマンドを使用します。
docker ps
全てのコンテナ一覧表示
停止しているものも含め、全てのコンテナの状態を確認するには、以下のコマンドを実行します。
docker ps -a
コンテナの停止
指定したコンテナの実行を停止します。
docker stop [コンテナIDまたは名前]
コンテナの再起動
停止中のコンテナを起動するか、実行中のコンテナを再起動します。
docker restart [コンテナIDまたは名前]
停止中のコンテナの起動
以前に停止したコンテナを再び起動します。
docker start [コンテナIDまたは名前]
コンテナ内部へのアクセス
実行中のコンテナのシェルにインタラクティブに接続し、内部でコマンドを実行します。
docker exec -it [コンテナIDまたは名前] bash
コンテナの新規作成と実行
新しいコンテナを作成し、起動します。ポートマッピング、バックグラウンド実行、コンテナ名の指定など、様々なオプションがあります。
- ランダムなポートマッピング(-P): ホストOSの空きポートにコンテナの公開ポートを自動で割り当てます。
docker run -P nginx
- 特定のポートマッピング(-p 8080:80): ホストOSの指定ポート(例: 8080)をコンテナの指定ポート(例: 80)にマッピングします。
docker run -p 8080:80 nginx
- デタッチモードでの実行(-d): コンテナをバックグラウンドで実行し、ターミナルを占有しません。
docker run -d -p 8080:80 nginx
- コンテナ名の指定(--name): コンテナに分かりやすい名前を付けます。
docker run -d -p 8080:80 --name my-web-server nginx
コンテナの削除
不要になったコンテナを削除します。実行中のコンテナは削除できません。先に停止する必要があります。
docker rm [コンテナIDまたは名前]
データボリュームによる永続化と共有
Dockerコンテナのライフサイクルは一時的であり、コンテナが削除されると内部のデータも失われます。これを解決し、ホストOSとコンテナ間でのデータ共有を可能にするのが「データボリューム」です。
データボリュームの必要性
WebアプリケーションなどをDockerコンテナとしてデプロイする際、アプリケーションのデータ(ログ、ユーザーアップロードファイル、データベースデータなど)をコンテナの内部に保存すると、コンテナの再作成や更新時にデータが失われるリスクがあります。また、既存のプロジェクトファイルをコンテナにデプロイする際、カスタムイメージを作成する手間を省き、ホスト上のファイルを直接利用したい場合にもデータボリュームが役立ちます。
データボリュームの使用方法
データボリュームは、ホストOSの特定のディレクトリをコンテナ内のディレクトリに「マウント」することで実現します。これにより、両方のパスが同じストレージ領域を参照するようになります。
docker run -p [ホストポート]:[コンテナポート] -v [ホストOSのパス]:[コンテナ内のパス] [イメージ名]
具体的な例として、ホストOSのWebコンテンツディレクトリをTomcatコンテナのWebアプリケーションルートにマウントしてみます。
docker run -d -p 8080:8080 -v /srv/docker/my-webapp:/usr/local/tomcat/webapps/ROOT/ tomcat:9.0.86-jdk17-temurin
このコマンドでは、ホストOSの/srv/docker/my-webappディレクトリが、Tomcatコンテナ内の/usr/local/tomcat/webapps/ROOT/ディレクトリとして機能します。ホストOS側でファイルを更新すれば、コンテナ内のアプリケーションにも即座に反映されます。
データボリュームの利点
- 迅速な開発とデプロイ: カスタムイメージの再ビルドなしに、ホスト上のソースコードやコンテンツをコンテナに即座に反映できます。
- データの永続化: コンテナが削除されても、データはホストOSのボリュームに残り、安全に保持されます。
- コンテナ間のデータ共有: 複数のコンテナが同じホストボリュームをマウントすることで、容易にデータを共有できます。
- コンテナとデータの分離: アプリケーションとデータを分離することで、コンテナの再構築や更新が容易になります。
Docker Composeによる複数コンテナ管理
複数のコンテナで構成されるアプリケーション(例: Webサーバー、データベース、キャッシュサーバーなど)を管理する場合、それぞれのコンテナを個別にdocker runコマンドで起動するのは非常に手間がかかります。Docker Composeは、このような複雑な複数コンテナアプリケーションの定義と実行をシンプルにするためのツールです。
Docker Composeの導入背景
単一のdocker runコマンドでさえ多くのオプションを必要とする場合があるため、複数のコンテナを特定の順序や設定で起動・連携させるのは非常に複雑になります。このような問題を解決し、サービス間の依存関係やネットワーク設定などをYAMLファイルで一元的に定義・管理できるようにするためにDocker Composeが開発されました。
Docker Composeのインストール
Docker Composeは通常、Docker Desktopにバンドルされていますが、Linux環境などで別途インストールする場合は以下の手順を実行します。
# 最新版のDocker Composeをダウンロード
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 実行権限を付与
sudo chmod +x /usr/local/bin/docker-compose
# インストールを確認
docker-compose --version
バージョン情報が表示されれば、インストールは成功です。
docker-compose.ymlファイルによる定義
Docker Composeは、docker-compose.ymlというYAML形式の設定ファイルを使用します。このファイルに、アプリケーションを構成するサービス、ネットワーク、ボリュームなどを定義します。
以下の例では、同じWebアプリケーションを異なるポートで起動する2つのTomcatインスタンスを定義しています。
version: '3.8' # Docker Composeファイルのバージョン指定
services:
# 最初のWebアプリケーションインスタンス
webapp-instance-1:
image: tomcat:9.0.86-jdk17-temurin # 使用するDockerイメージ
container_name: tomcat-app-one # コンテナ名
volumes:
- /srv/docker/shared_web_content:/usr/local/tomcat/webapps/ROOT # ホストとコンテナのボリュームマウント
ports:
- "8081:8080" # ホストの8081ポートをコンテナの8080ポートにマッピング
# 2番目のWebアプリケーションインスタンス
webapp-instance-2:
image: tomcat:9.0.86-jdk17-temurin # 最初のインスタンスと同じイメージを使用
container_name: tomcat-app-two # 別のコンテナ名
volumes:
- /srv/docker/shared_web_content:/usr/local/tomcat/webapps/ROOT # 最初のインスタンスと同じボリュームを共有
ports:
- "8082:8080" # ホストの8082ポートをコンテナの8080ポートにマッピング
このdocker-compose.ymlファイルがあるディレクトリで、以下のコマンドを実行するだけで、定義された全てのサービスをまとめて起動できます。
docker-compose up
バックグラウンドで実行する場合は-dオプションを付けます。
docker-compose up -d
Docker Composeの主要コマンド
docker-compose.ymlファイルが存在するディレクトリで実行します。
- サービスの一括起動:
docker-compose up # フォアグラウンドで起動し、ログを表示
docker-compose up -d # バックグラウンド(デタッチモード)で起動
- サービスの状態確認:
docker-compose ps # Docker Composeで管理されているサービスの状態を表示
- サービスの再起動:
docker-compose restart # 全てのサービスを再起動
- サービスの停止:
docker-compose stop # 全てのサービスを停止(コンテナは削除されない)
- サービスの停止とリソースの削除:
docker-compose down # 全てのサービスを停止し、関連するコンテナ、ネットワーク、ボリュームなどを削除
- 停止したサービスの再開:
docker-compose start # 以前に停止したサービスを再開