こんにちは、Mashです。
本業でDockerを触る機会がありまして、自分の知識整理のためと、せっかくならということで初学者さんに向けて記事を作成しています。
今回はDocker入門第4回です。
前回記事までで、Dockerコンテナの起動停止やオリジナルイメージの作成、DockerHubを利用したイメージの共有方法などを実機で確認してきました。
ただ、ここまで1つのコンテナをガチャガチャ触っていただけで、実践利用するイメージが掴めない という方も多くいらっしゃるかと思います。
今回は少しジャンプアップします。
複数コンテナを同時に起動し、コンテナ同士が連携することで一つのシステム(題材としてWordPress環境)を一気に構築する方法を学習します。
- コンテナ1つではなく、複数コンテナを同時に起動できるようになる
- 複数のコンテナを連携させて、Webシステムを構築できるようになる
※本シリーズはDocker初心者向けではありますが、前提として多少のLinux知識が必要となります。ご了承ください。
これまでの記事で得た知識を思い出しながらがんばってついてきてください。
それではいきましょう!
複数コンテナをコントロールするDocker Compose
前述の通り、今回は複数コンテナを同時に起動して1つのシステムを瞬時に構築する方法をご紹介します。
ここで登場するのが Docker Compose です。
What is Docker Compose?
Docker Composeは、複数のコンテナに関する設定を1つの定義ファイルにまとめて記載しておくことで、コマンド1つ実行すると瞬時にアプリケーションサービスが立ち上がる便利なツールです。
Dockerfileの応用編 といったところでしょうか。
ちなみにDocker Composeのイメージキャラクター?はタコです。笑
複数のコンテナを操っている という意味でしょう。

原則、1コンテナにつき1プロセス
Docker Composeが必要となる = 複数コンテナを起動する必要があるのには理由があります。
それはDockerを利用する際のベストプラクティスのひとつに「1コンテナにつき起動するプロセスは1つにすること」という原則があるからです。

技術的には1コンテナ内にnginx、php、mysqlなど複数のプロセスを起動することは可能です。
しかし1つのコンテナ内で様々なコンポーネントを動かしてしまうと本番サービスとして展開した際、アプリケーションコード修正やコンポーネントのバージョンアップをしたい場合に取り回しが効かなくなってしまいます。
メンテナンス時の影響範囲を最小化するため、また「軽量で起動が速い」「環境の複製が容易」というコンテナのメリットを活かすために、極力1つのコンテナで起動するプロセスは1つにしたほうがよい というベストプラクティスは覚えておきましょう。
Docker ComposeでWordpress環境を構築
それでは実機確認パートです。
ありきたりですがDockerコンテナでWordpress環境を構築していきます。
Docker Composeのインストール
Docker Composeは別途インストールが必要です。
ドキュメントを参照いただきつつ、各環境に応じてご準備ください。
なお、私のDockerホスト環境はUbuntu 20.04です。
# Docker Composeバイナリをダウンロード
# 最新バージョンはドキュメントをご確認ください
$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/do
cker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# ダウンロードしたファイルに実行権限を付与
$ sudo chmod +x /usr/local/bin/docker-compose
# 稼働確認
$ docker-compose --version
docker-compose version 1.27.4, build 40524192
Docker Composeの導入手順は以上です。
WordPress環境を構築
ツールの準備が整いましたので本番です。
docker-compose.ymlファイルの作成
Docker Composeを使うためには、「docker-compose.yml」という設計図を作成する必要があります。
# まずはいつもどおり今回実施する作業をわかりやすくするためお掃除
$ docker rm -f $(docker ps -a -q)
$ docker image rm
# 練習用ディレクトリの作成
$ mkdir dockercompose-test01
$ cd dockercompose-test01
# docker-compose.ymlの作成
$ touch docker-compose.yml
docker-compose.yml の中身はこんなかんじ。いったんコピペで作成してください。
version: '3' networks: default: external: name: bridge mash-network: driver: bridge volumes: db_data: services: db: image: mysql container_name: db hostname: db volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: wordpress MYSQL_USER: mash MYSQL_PASSWORD: mash_password networks: - mash-network wordpress: depends_on: - db image: wordpress container_name: wordpress hostname: wordpress ports: - 80:80 restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: mash WORDPRESS_DB_PASSWORD: mash_password networks: - mash-network phpmyadmin: depends_on: - db image: phpmyadmin container_name: phpmyadmin hostname: phpmyadmin ports: - 8080:80 restart: always networks: - mash-network
設計書が完成しましたのでコンテナを立ち上げてみましょう。
docker-compose upコマンドでコンテナを起動
これまで実行していた $ docker run コマンドではなく、docker-compose up コマンドを実行します。
# 設計書(docker-compose.ymlファイル)通りにコンテナ環境を起動
# -d はデタッチドオプション
$ docker-compose up -d
Creating network "dockercompose-test01_mash-network" with driver "bridge"
Pulling db (mysql:)...
latest: Pulling from library/mysql
(中略)
Status: Downloaded newer image for mysql:latest
Pulling wordpress (wordpress:)...
latest: Pulling from library/wordpress
(中略)
Status: Downloaded newer image for wordpress:latest
Pulling phpmyadmin (phpmyadmin:)...
latest: Pulling from library/phpmyadmin
(中略)
Status: Downloaded newer image for phpmyadmin:latest
Creating db ... done
Creating wordpress ... done
Creating phpmyadmin ... done
処理がおわりましたらコンテナの起動状況を確認してみましょう。
上から、
- phpMyAdmin
- WordPress
- MySQL
の3つのコンテナが起動していることがわかります。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3fe15ddadc7e phpmyadmin "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:8080->80/tcp phpmyadmin
906308b16258 wordpress "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp wordpress
4b1ccd092302 mysql "docker-entrypoint.s…" About a minute ago Up About a minute 3306/tcp, 33060/tcp db
コンテナの稼働確認
WordPressコンテナは80番ポートを外部公開する設定になっていますので、ブラウザからアクセス可能です。
Dockerホストにブラウザでアクセスしてみます。
私の環境はブラウザを起動するPCとDockerホストが別マシンのためIPアドレスを指定しています。
PC上にDockerを構成しているかたは http://localhost/ で接続可能です。
本シリーズはWordPressの講座ではないのですが、Dockerの稼働確認に必要ですのでもう少しお付き合いください!
言語は日本語を選択して [次へ] ボタンをクリックします。

つづいて、サイト名、WordPressの管理者ユーザ名とパスワード、メールアドレスを指定します。
重要ではないのでテキトーで大丈夫です。笑
一通り入力できたら [WordPress をインストール] ボタンをクリックします。

↓このような管理者ログイン画面が表示されたらWordPressの初期セットアップは完了です。

URLの「wp-login.php」の部分を削除してもう一度ブラウザアクセスしてみてください。
WordPressを触られたことが無い方もいらっしゃるかと思いますが、こちらの画面はWordPressサイトの初期画面です。無事に動いているようです!

続いて、phpMyAdminコンテナも一緒に立ち上げたので接続確認してみましょう。
こちらは8080番ポートで外部公開しています。

phpMyAdminのログイン画面が表示できましたら、ログインしてみましょう。

パスワード何入れればええねん
というみなさん。ログインアカウント情報は、実はdocker-compose.ymlの中で定義されています。
読み進める前に一度だけdocker-composeファイルを見直してみてください。
正解は、、、
[services] → [db] セクションのこちらになります。
MYSQL_ROOT_PASSWORD: root_password
このように環境変数「MYSQL_ROOT_PASSWORD」でrootパスワードを定義しています。
パスワード「root_password」でログインしてみましょう。

こちらも問題なしですねー。
MySQLとphpMyAdminはそれぞれ別々のコンテナでプロセスが起動していますが、うまく連携できています。
これはコンテナ同士が通信できているということです。
docker-compose downコマンドでコンテナを停止
docker-compose up コマンドで起動したコンテナを停止したい場合は下記コマンドを実行します。
# コンテナを停止
$ docker-compose down
Stopping phpmyadmin ... done
Stopping wordpress ... done
Stopping db ... done
Removing phpmyadmin ... done
Removing wordpress ... done
Removing db ... done
Removing network dockercompose-test01_mash-network
# コンテナ稼働状況を確認
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
-> 結果なしでOK。
上記 docker-compose down コマンドですが、厳密にはコンテナ停止+削除まで行っています。
もう一度環境を立ち上げたい場合は再度 $ docker-compose up -d です。
まとめ
みなさん無事にWordPress環境が動きましたでしょうか。
今回はDocker Composeを使って、複数コンテナで構成されるアプリケーションシステムを一挙に構築管理する手法を学習しました。
今回はかなりシンプルな構成でしたが、下記引用させていただいたブログのように、実際の現場では
- docker-compose.ymlの中でさらにDockerfileを指定してオリジナルイメージをビルド
- docker-compose.ymlやDockerfileだけでなくアプリケーションのソースコードも併せてGitHubで管理し、開発環境構築をさらに自動化
といった具合に利用されます。

もちろん学習初期は設計書(Dockerfileやdocker-compose.yml)を作成するのに時間がかかってしまうため費用対効果がでませんが、一度習得できれば設計書を配ることで誰でも、どのようなPC環境でも同じ環境が再現できます。しかもDockerだから起動も爆速。チームに大きく貢献できます。
ちなみにこのように環境をコードで管理する概念のことを Infrastructure as Code(IaC)と呼びます。昨今流行り、というか習得必須のスキルですね。
さて、次回は今回使用したdocker-composeの中身の解説となります。
Docker環境内のネットワーク構成や、ボリューム(永続保存領域)の考え方などを確認コマンド例を交えながら紐解いていきます。
少し難しくつまらない内容かもしれませんが、エラー発生時のデバッグや、Dockerをより応用するために必要な知識になりますので、ぜひ楽しみにしていただければと思います。
それでは今回は以上です。
それじゃあまたね。