【Docker入門#04】複数コンテナを連携させよう【Docker Compose】

Docker入門04 tech

こんにちは、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のイメージキャラクター?はタコです。笑

複数のコンテナを操っている という意味でしょう。

docker composeで作るWordPressのローカル環境|ケンジ|note

原則、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 の中身はこんなかんじ。いったんコピペで作成してください。

本当は今回記事の中で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で管理し、開発環境構築をさらに自動化

といった具合に利用されます。

最強のLaravel開発環境をDockerを使って構築する【新編集版】 - Qiita
お急ぎの方は 使い方 からお読みください。 概要 Docker, Docker Compose を使って、nginx, php-fpm, MySQLの実行環境(LEMP)を構築して、最強のLaravel開発環境を構築する記事です...

もちろん学習初期は設計書(Dockerfileやdocker-compose.yml)を作成するのに時間がかかってしまうため費用対効果がでませんが、一度習得できれば設計書を配ることで誰でも、どのようなPC環境でも同じ環境が再現できます。しかもDockerだから起動も爆速。チームに大きく貢献できます。

ちなみにこのように環境をコードで管理する概念のことを Infrastructure as Code(IaC)と呼びます。昨今流行り、というか習得必須のスキルですね。

さて、次回は今回使用したdocker-composeの中身の解説となります。

Docker環境内のネットワーク構成や、ボリューム(永続保存領域)の考え方などを確認コマンド例を交えながら紐解いていきます。

少し難しくつまらない内容かもしれませんが、エラー発生時のデバッグや、Dockerをより応用するために必要な知識になりますので、ぜひ楽しみにしていただければと思います。

それでは今回は以上です。

それじゃあまたね。

タイトルとURLをコピーしました