問題文
問題文は以下の通りでした。
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:
採点基準
- 終了状態を満たしている: 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:
終わりに
いかがでしたか?
回答にあたっての制約が現実的なケースとはやや離れていたとは思いますが、楽しんでいただけたなら幸いです。
問題を解いていただきありがとうございました!