Dockerをさわってみる③(Docker Compose)
はじめに
前回はこちらでdockerfileによるDockerイメージの作成と起動を行いました。
今回は、Dockerをさわってみる①で構築したWordPressの環境をDocker Composeを使って構築してみたいと思います。
Docker Composeとは
複数のDockerコンテナの構築や、管理、起動を行うことができるツールのことです。
前回は、Dockerfileを使ってコンテナの起動を行ってきましたが、コンテナが複数になってくると各コンテナでbuildコマンドやrunコマンドを実行することが面倒になってきます。
そこで、Docker-composeが登場します。複数のコンテナの構築を別々に行うのではなく、1つのYAMLファイルに複数のコンテナを定義し、Dockerコンテナを構築したり管理することができたりするようになります。
構成
Dockerをさわってみる①で構築した1台のEC2上で、WordPressのコンテナとMySQLのコンテナを2台起動します。
- インターネットからSSH(22番ポート)とHTTP(8080番ポート)のアクセスを許可しているEC2インスタンスがPublicサブネットに存在します。
- docker-composeのインストールは、上記記事で実施ししております。
ハンズオン
ここから実際にハンズオンを行います。
docker-compose.ymlの作成
docker-compose.ymlを作成します。
※公式のクイックスタートとほぼ同じ内容のymlですが、それとはすこーし異なります。
※ポート番号やvolumesが異なります。
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- ./wp_data:/var/www/html
ports:
- "8080:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
docker-compose.ymlには、以下の3つのセクションから構成されます。
- services
- volumes
- networks
今回は、servicesとvolumesのみ利用しています。
services
- dockerコンテナの論理名を記載します(db, wordpress)。各論理名の下に設定を記述していきます。
- imageで、ベースとなるdockerイメージを指定します。
MySQLは、mysql
のバージョン5.7を指定します。WordPressはwordpress
の最新版latest
を指定します。 - restartでDockerコンテナの再起動ポリシーを定義できます。
always
でコンテナ終了時に常に再起動するという動きになります。 - wordpressコンテナに、
depends_on
で依存関係を指定します。今回の場合、
- wordpressコンテナ起動前に、dbコンテナが先に起動します。
- 起動コマンド
docker-compose up wordpress
とすると、依存関係となっているdbコンテナも作成・起動を行います。
-
ports
で公開ポートを指定します。今回は、wordpressコンテナのポート80番をホスト側のポート8080番で公開します。(ホスト:コンテナ
) - environmentで環境変数を指定します。
WORDPRESS_DB_HOST: db:3306
でwordpressから見たdbのホストを指定します。MySQLは3306ポートを利用するので、ポート番号まで指定します。その他の変数についは割愛します。
volumesについては次の章で記載します。
volumes
各サービスには、volumesでデータの保存先を定義しています。volumeとは、コンテナが削除された後でもデータが永続化される領域のことです。
まず、wordpress
のvolumesが./wp_data:/var/www/html
で定義されています。
- volumesは
ホスト:コンテナ
で定義します。 - コンテナ内の/var/www/htmlがホスト側の./wp_data上にマウントされていることを意味します。
- ./はdocker-compose.ymlが存在するパスからの相対パスになります。
- つまり今回は、
/home/ec2-user/wordpress/wp_data
以下にWordPressのデータが存在することを意味します。
次に、db
のvolumesがdb_data:/var/lib/mysql
で定義されています。また、servicesセクションと同階層に存在するvolumesセクションに、db_data
が定義されています。
- servicesセクションと同階層のvolumesセクションで
db_data
なる名前のvolumeを定義しています。 - それを、サービスdb内のvolumesで使用しており、コンテナ内の
/var/lib/mysql
にバインドすることを意味します。 - servicesセクションと同階層に存在するvolumesに定義されたvolumeを名前付きvolumeといいます。
- 名前付きvolumeは複数のコンテナから複数のコンテナから参照できます。
- 実際のデータはホスト側の
/var/lib/docker/volumes
以下に保存されていました。
Dockerコンテナの起動と動作確認
- ec2-userでサーバーにログインし、適当なディレクトリを作り、そこに移動します。
$ mkdir wordpress
$ cd wordpress
$ pwd
/home/ec2-user/wordpress
- ここで、先ほど作成したdocker-compose.ymlをアップロードします。
- 以下のコマンドで、コンテナを起動します。
docker-compose up -d
Docker Composeではdocker-compose
コマンドを使用します。
upは、コンテナの構築、作成、起動を行うためのコマンドです。
-dオプションで、デタッチモードで起動します。(バックグラウンド実行)
詳細は公式ドキュメントを参照ください。
- コンテナの起動状態を確認するには
docker ps
でも可能ですが、以下で確認します。
$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------
wordpress_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
wordpress_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8080->80/tcp
-
http://{グローバルIPアドレス}:8080/ にアクセスします。
-
ここからはDockerをさわってみる①同様に設定を行えばブログサイトが構築できます。
-
コンテナをシャットダウンする際は以下のコマンドを実行します。
docker-compose down
volumeも削除したい場合は--volumesオプションを利用します。
docker-compose down --volumes
まとめ
今回は、Docker Composeを利用して、複数のコンテナを一括で構築・作成・起動を行いました。
docker-compose.ymlのみを記述するだけで、WordPressサイトを簡単に構築することができました。
次回はAWSのコンテナオーケストレーションサービスのECS / Fargateを利用してみたいと思います。
Discussion