【 docker入門 】 docker-compose でwordpress環境を解説しながら構築

docker入門 第四弾です。今回は docker-compose を使います。
第一弾から第三弾まででdockerコマンドを使って色々やってきました。
前回までのdocker入門
今回は、docker-composeというツールでwordpressの環境を作りながら docker-compose.yml の書き方を解説します。
docker-compose とは
毎度お世話になっているDocker ドキュメント日本語化プロジェクトによると
Compose とは、複数のコンテナを定義し実行する Docker アプリケーションのためのツールです。Compose においては YAML ファイルを使ってアプリケーションサービスの設定を行います。コマンドを1つ実行するだけで、設定内容に基づいたアプリケーションサービスの生成、起動を行います。
Docker ドキュメント日本語化プロジェクト Docker Compose 概要
とのこと。
今までの記事では、コンテナを1つ作成する度に$ docker run コマンドを実行しなければいけませんでした。
しかし、実際にサービスを動かすにはプロセスごとにコンテナを複数台作成する必要が出てきます。
ひとつづつコンテナ作成するのは面倒ですよね。。ということでdocker-composeを使って定義したコンテナを一つのコマンドで作成してしまいましょうという感じです。

今回作る環境
今回は、docker hubで公開されているイメージを使ってwordpressを構築します。

そしてディレクトリ構成は以下の通りです。
$ tree .
.
├── docker-compose.yml
└── environments
    ├── db.env
    └── wp.envメインは、docker-compose.ymlでここにwordpressとdbの設定を書いていきます。
environments配下には、ユーザー名やパスワードなどの情報を記載してコンテナの環境変数として設定します。
docker-compose.ymlに直接書くこともできますが、別ファイルに分離することでgitignoreでリモートリポジトリの管理から除外できます。
docker-compose .ymlの作成
先に完成品を
version: '3.8'
services:
## dbコンテナの定義
   db:
   ## 使用するイメージを指定
     image: mysql:5.7
     ## ローカルPCのマウントポイントを指定
     volumes:
       - db_data:/var/lib/mysql
     ## dockerホスト起動時に再起動するかを設定
     restart: always
     ## 環境変数ファイルの読み込み
     env_file:
      - ./environments/db.env
## wordpressコンテナの定義
   wordpress:
     ## 依存関係の指定(dbコンテナが起動したら起動する)
     depends_on:
       - db
     image: wordpress:latest
     ## ポートのマッピングを指定
     ports:
       - "8000:80"
     restart: always
     env_file:
      - ./environments/wp.env
volumes:
    ## db_dataというボリュームを作成
    db_data:
最上位のインデントをそれぞれざっくり説明します。
versionキー
docker-compose.ymlのバージョンを指定するところです。
docker-composeはバージョンによって記述の仕方が多少変わることがあります。
現在の最新は、3.8のようです。(2022/2/18:Compose file version 3 reference)
servicesキー
起動するコンテナについての定義を書いていく場所です。
serviceキーの中でさらにネストして各コンテナの定義を記述していきます。
今回は、dbというコンテナとwordpressというコンテナがネストされています。
servicesキー内のオプション
今回docker-compose.ymlで使われているものは以下の通りです。
| image | コンテナのイメージを指定します。 | 
| volumes | コンテナのボリュームを指定します。このセクションに記述されたvolumeは記述されているコンテナからしか参照できません。 | 
| restart | dockerホストが起動した時に、コンテナを再起動するかどうかの設定 | 
| depends_on | コンテナの依存関係を記述します。 このオプションが記述されたコンテナは、depends_onで指定されたコンテナが起動した後に起動します。 今回、wordpressが起動するためはdbが起動している必要があるので記述しています。 | 
| ports | コンテナのポートマッピングを指定します。 | 
| env_file | 別ファイルに切り出した環境変数を読み込むためにパスを指定します。 | 
volumesキー
複数のコンテナから参照可能な永続記憶領域を定義できます。
明示的に削除されるまではコンテナが削除されても消えません。
volumeはserviceキーのコンテナ定義の中でも設定することができますがそのコンテナからしか参照することができません。
今回は、db_dataというボリュームを作成してdbコンテナから参照しています。
networksキー
独自ネットワークを作成する場合に使用します。
ddocker-composeでは、このキーを設定しなくても独自のネットワークが作成されます。
docker-compseが管理していない外部のネットワークと接続する場合などに使われます。
docker-compose コマンドでコンテナの起動
docker-compose.ymlの準備ができたらコンテナを起動します。
コマンドの実行場所に注意
$ docker-compose コマンドを実行する時はdocker-compose.ymlと同じディレクトリにいる必要があります。
実行時にdocker-compose.ymlを参照しているため、ファイルが見つからず以下のようなエラーになってしまいます。
$ docker-compose images
Can't find a suitable configuration file in this directory or any
        parent. Are you in the right directory?
        Supported filenames: docker-compose.yml, docker-compose.yaml, compose.yml, compose.yaml$ docker-compose up -d localhostの8000ポートにアクセスできればOKです!

終了する時は以下のコマンドで終了します。
$ docker-compose down
Stopping sample-wp_wordpress_1 ... done
Stopping sample-wp_db_1        ... done
Removing sample-wp_wordpress_1 ... done
Removing sample-wp_db_1        ... done
Removing network sample-wp_defaultその他使いそうなコマンド
docker-compose ps
$ docker-compose upで起動しているコンテナの一覧を表示します。
docker-compose.ymlを参照しているため、カレントディレクトリにdocker-compose.ymlがないと実行できません。
$ docker-compose ps
        Name                       Command               State                  Ports
-----------------------------------------------------------------------------------------------------
sample-wp_db_1          docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp
sample-wp_wordpress_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:8000->80/tcp,:::8000->80/tcpdocker-compose images
$ docker-compose up で起動しているコンテナのイメージを表示します。
$ docker-compose images
      Container         Repository    Tag       Image Id       Size
---------------------------------------------------------------------
sample-wp_db_1          mysql        5.7      4181d485f650   448.2 MB
sample-wp_wordpress_1   wordpress    latest   4af01dc1f7fb   622.9 MB












