/
カテゴリー

問題文

問題文は以下の通りでした。

DockerでシュッとWordpressを構築しようとしています。どうしてもdocker-compose.ymlで指定したホスト名でデータベースに接続したいのですが、うまく立ち上がりません。原因を特定して修正してください。

初期状態とゴール

初期状態

~/wordpress/docker-compose.ymlを用いてdocker-compose upするとwordpressのコンテナがデータベース接続エラーのログを残して立ち上がらない。

終了状態

curl localhost:8000 -Lで正常に200レスポンスが返ってくる。

解説

任意のホスト名でコンテナの名前解決を行うにはエイリアスの設定が必要です。

     networks:
       default:
         aliases:
           - database

今回の問題では下記のようにymlを編集すればhostname:で設定したホスト名でデータベースに接続可能です。

version: '3.3'

services:
   db: # DO NOT CHANGE THIS LINE
     image: mysql:5.7
     hostname: database # DO NOT CHANGE THIS LINE
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: 8MvAMcDAirP8
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: DDzk6ERU33Rc
     networks:
       default:
         aliases:
           - database

   wp:
     depends_on:
       - db
     image: wordpress:latest
     hostname: wordpress
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: database:3306 # DO NOT CHANGE THIS LINE
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: DDzk6ERU33Rc
       WORDPRESS_DB_NAME: wordpress
volumes:
    db_data:

採点基準

  1. 終了状態を満たしている: 100%
    ※回答文が明らかに不適切な場合は0点となります。

講評

解答について

想定回答以外の方法でも、終了条件を満たしている場合は満点となります。下記2つ紹介します。

別解1

linksを使う解法です。
この方法は古く、将来的に廃止される可能性があるので推奨されていないようです。
https://docs.docker.jp/compose/networking.html#links

version: '3.3'

services:
   db: # DO NOT CHANGE THIS LINE
     image: mysql:5.7
     hostname: database # DO NOT CHANGE THIS LINE
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: 8MvAMcDAirP8
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: DDzk6ERU33Rc

   wp:
     depends_on:
       - db
     image: wordpress:latest
     hostname: wordpress
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: database:3306 # DO NOT CHANGE THIS LINE
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: DDzk6ERU33Rc
       WORDPRESS_DB_NAME: wordpress
     links:
       - "db:database"
volumes:
    db_data:

別解2

container_nameを使う解法です。

version: '3.3'

services:
   db: # DO NOT CHANGE THIS LINE
     container_name: database
     image: mysql:5.7
     hostname: database # DO NOT CHANGE THIS LINE
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: 8MvAMcDAirP8
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: DDzk6ERU33Rc

   wp:
     depends_on:
       - db
     image: wordpress:latest
     hostname: wordpress
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: database:3306 # DO NOT CHANGE THIS LINE
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: DDzk6ERU33Rc
       WORDPRESS_DB_NAME: wordpress
volumes:
    db_data:

終わりに

いかがでしたか?
回答にあたっての制約が現実的なケースとはやや離れていたとは思いますが、楽しんでいただけたなら幸いです。
問題を解いていただきありがとうございました!