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