👻

Dockerをさわってみる③(Docker Compose)

5 min read

はじめに

前回はこちらで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が異なります。

docker-compose.yml
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

  1. dockerコンテナの論理名を記載します(db, wordpress)。各論理名の下に設定を記述していきます。
  2. imageで、ベースとなるdockerイメージを指定します。
    MySQLは、mysqlのバージョン5.7を指定します。WordPressはwordpressの最新版latestを指定します。
  3. restartでDockerコンテナの再起動ポリシーを定義できます。alwaysでコンテナ終了時に常に再起動するという動きになります。
  4. wordpressコンテナに、depends_onで依存関係を指定します。今回の場合、
  • wordpressコンテナ起動前に、dbコンテナが先に起動します。
  • 起動コマンドdocker-compose up wordpressとすると、依存関係となっているdbコンテナも作成・起動を行います。
  1. portsで公開ポートを指定します。今回は、wordpressコンテナのポート80番をホスト側のポート8080番で公開します。(ホスト:コンテナ)
  2. 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オプションで、デタッチモードで起動します。(バックグラウンド実行)
詳細は公式ドキュメントを参照ください。

https://docs.docker.jp/compose/reference/up.html
  • コンテナの起動状態を確認するには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

ログインするとコメントできます