【初心者向け】docker-composeで複数コンテナをまとめて管理する方法 【後編】

はじめに

前回、docker-composeを使って、環境構築および構成情報をファイルとして作成しコンテナ起動までを行いました。
関連記事

はじめに これまでDockerで仮想環境を作成して開発環境を簡単に構築する方法をまとめてきましたが、実際のサービスとしてプログラミング開発を行うとなった場合にコンテナ一つで進めるのはまれです。 例えば、このブログは[…]

docker-compose_アイキャッチ

今回は複数のserviceを定義して、複数のコンテナを同時に起動する方法についてまとめていきます。

動作環境

 Windows10

 Docker Desktop

Dockerについて

そもそものDockerについて、またインストール方法は以下の記事で紹介しています。

関連記事

はじめに プログラミングを行う際に実行環境を構築する必要がありますが、普段利用しているローカルPCに直接インストールしてしまっては、トライアンドエラーを繰り返すうちに不要なアプリケーションが積み重なり動作が不安定にな[…]

begindocker_アイキャッチ
また、DockerはWindows TerminalのPowerShellで行います。
こちらの記事でWindows Terminalのインストール方法も紹介していますので良ければ参照してください。
関連記事

はじめに Windows環境でLinuxのコマンドが利用できるWSL2についてインストールおよび利用方法を説明します。 Linuxコマンドが使えるようになると、様々なプログラミング言語や開発に利用できますので非常に[…]

beginwsl_アイキャッチ

docker-composeで複数サービスを起動する例

docker-composeを用いて複数のサービスを構成する例として、本ブログでも利用しているWordPressを上げたいと思います。

WordPressはブログなどを扱うCMSでWEBアプリケーションの一種です。そのため、WordPressを構成するミドルウェアとして、WEBサーバー、アプリケーションサーバー、DBサーバーが必要になります。

WEBサーバーはブラウザからアクセスされた際にアプリケーションサーバーへ内容を転送して処理を行ってもらい、その結果をまたブラウザへ返す役割があります。Apachenginxなどが代表的です。

アプリケーションサーバーではWordPressを構成するプログラムコードが格納されています。WordPressはPHPで動いています。

最後にDBサーバーはMySQLMongoDBなど様々な種類があります。

今回は、WordPressとMySQLが提供している公式イメージを利用してそれぞれサービスを起動したいと思います。

フォルダ構成

今回の例では以下のようなファイル構成となっています。

docker-compose-wp/
|-- docker-compose.yml
`-- db_data/

docker-compose.ymlを作成する

今回は、WordPress、MySQLともに公式イメージをそのまま利用するためDockerfileは作成していません。

docker-compose.ymlの内容は以下のようになります。

version: "3"

services:
    mysql:
    image: mysql:8.0.31
    volumes:
        - ./db_data:/var/lib/mysql
    restart: always
    environment:
        MYSQL_ROOT_PASSWORD: wordpress
        MYSQL_DATABASE: wordpress
        MYSQL_USER: wordpress
        MYSQL_PASSWORD: wordpress

    wordpress:
    depends_on:
        - mysql
    image: wordpress:php8.1-apache
    ports:
        - "80:80"
    restart: always
    environment:
        WORDPRESS_DB_HOST: mysql:3306
        WORDPRESS_DB_USER: wordpress
        WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:

前回説明した部分は省略して、新しいところのみを解説します。

まずmysqlserviceについて、

image:で取得するdocker imageを指定します。前回はDockerfileから作成したので、build:でしたがイメージをそのまま持ってくる場合はimage:となります。

今回はMySQLの8.0.31のイメージを選択しています。

enviroment:はコンテナに与える環境変数を定義することができます。例えば10行目の「MYSQL_ROOT_PASSWORD: wordpress」は環境変数MYSQL_ROOT_PASSWORD:にwordpressという文字列を設定するという意味になります。

MYSQLコンテナでは、DB構築に必要な情報を環境設定に保持するのでこのように設定しています。また、別のコンテナからDBに接続する際もこの情報を利用する必要があります。

次にwordpressserviceについてですが、

depends_on:で起動順序を定義しています。WordPressはDBに接続する必要があるため、起動順序としては、MySQL⇒WordPressとなります。そのため、先に起動する必要があるservice名を定義します。

ただし、これはコンテナが起動する順番を決めているだけでMySQLが完全に起動してからWordPressが起動するわけではありません。

image: wordpress:php8.1-apacheでWordPressの公式イメージのうち、PHPのバージョンが8.1でかつApacheがインストールされているイメージを選択しています。
続いて、ports:ですが、これはポートフォワーディングを行うための設定です。内容としてはローカルPCのポート80番にアクセスした際に、WordPressのコンテナのポート80番へ転送するということになります。
これを行わないと、ローカルPCのブラウザでの確認ができなくなります。
WordPress側のenviroment:です。WordPressからMySQLへ接続する際に必要な環境変数を定義しています。ここの内容はMySQLのenviroment:と合わせる必要があります。
なお、WORDPRESS_DB_HOSTについてはmysql:3306としています。本来別のサーバーに構築されたMySQLに接続しようとすると、そのサーバー名やIPで接続する必要があるのですが、docker-composeの場合は、service名でアクセスすることができます。

最後に、volumes:でMySQLのデータ部分をコンテナの外に保存できるようにしています。何度か書いていますが、コンテナは基本的に使い捨てのため、永続的に保存したいデータについてはコンテナの外に保存する必要があります。

コンテナの起動

それでは作成したdocker-compose.ymlからコンテナを起動します。

今回は、Dockerfileによるbuildが必要ないのでイメージ作成のコマンドdocker-compose buildは不要です。

docker-compose up -d

コンテナが起動したか確認してみましょう。

docker-compose ps
NAME                            COMMAND                  SERVICE             STATUS              PORTS
docker-compose-wp-mysql-1       "docker-entrypoint.s…"   mysql               running             3306/tcp, 33060/tcp
docker-compose-wp-wordpress-1   "docker-entrypoint.s…"   wordpress           running             0.0.0.0:80->80/tcp

mysqlとwordpressのコンテナが起動していることが確認できました。

WordPressの起動確認

コンテナが起動できたことを確認したら、ブラウザで以下のURLにアクセスしましょう。

http://localhost/

下記の画像のようにWordPressの初期設定画面が表示されるかと思います。

docker-compose_wp_init

もしかしたら、下記の画像が表示される可能性があります。

docker-compose_error_db_connection

これは、DBサーバーであるMySQLが完全に起動していないうちからアクセスしたため発生しています。

上のdocker-compose.ymlの構成説明でもあったようにdepends_on:で起動順序を定義しても完全に起動するのを待つわけではないことがわかります。

また、volumes:で指定したフォルダ./db_dataにもMySQLのファイルができていることが確認できます。

docker-compose_mysql_file

 

まとめ

docker-composeを使って複数のサービスの環境構築をファイルとして保存およびイメージ作成、コンテナ作成方法についてまとめました。
やはりある程度の機能やサービスを提供するためには複数のミドルウェアを用いる必要が出てきます。ですが、docker-composeを使うことである程度規模の開発も対応できますね。
Dockerの操作についてより詳しく知りたい方は以下のような書籍を参考にしてみてください。
たった1日で基本が身に付く! Docker/Kubernetes超入門
著者:伊藤 裕一 (著)
出版社:技術評論社
本書は、次世代のアプリケーションアーキテクチャとして注目されている「マイクロサービス」の技術基盤となるコンテナ技術「Docker」とコンテナオーケストレーション技術「Kubernetes」を取り上げ、Dockerの基本的な利用法、DockerfileやComposeの設計、コンテナのデータ永続化やCI/CD、Kubernetesによる複数コンテナの自動管理までを、一気に学習します。出典:Amazon
さわって学ぶクラウドインフラ docker基礎からのコンテナ構築

著者:大澤 文孝 (著), 浅居 尚 (著) 
出版社:日経BP
本書では、Dockerのインストール方法に始まり、基本的なWebサーバーを起動させるところから、永続化、ネットワーク、コンテナイメージへと順番に学ぶことができます。さらに、複数のコンテナを使うことを想定し、「Docker Compose」や「Kubernetes」についても学習できます。Kubernetesは学習ツールとして「Minikube」を用い、最終的に「Amazon EKS」でコンテナを実行するはじめの一歩までを説明します。出典:Amazon
Docker実践ガイド 第2版 impress top gearシリーズ

著者:古賀 政純 (著)
出版社:インプレス
IT現場で役立つ、Dockerの導入、運用ノウハウを凝縮。Dockerが利用される環境や背景を説明し、導入前のシステム設計、Dockerの基本的な利用方法、Dockerfileによる自動化の手法、管理・監視ツールについて、実際に操作をしながら解説します。出典:Amazon