WSL2を導入してとうとうDockerが使えるようになりました! この記事に沿ってLaravelの開発環境を作っているところです。
Laravelが動くコンテナからDBのコンテナに接続するホスト名がわからなかったのでメモします。 結論としてはコンテナ間通信はコンテナ名を使用することでできます。
2021/11/16 追記
WindowsでのDocker環境の構築方法は次の記事にまとめました。
WSL2とDocker Desktop on WindowsでDocker環境を構築する
環境
- Windows 10 Home x64
- OS ビルド: 19041.450
- Docker version 19.03.12
- docker-compose version 1.26.2
docker-compose.yml
と手順はこちらを参考にしました。
これでMySQLとphpが動くコンテナができます。
version: '3'
services:
php:
container_name: php
build: ./docker/php
volumes:
- ./server:/var/www
db:
image: mysql:5.7
container_name: db-host
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: laravel
MYSQL_USER: docker
MYSQL_PASSWORD: docker
TZ: 'Asia/Tokyo'
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ./docker/db/data:/var/lib/mysql
- ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
- ./docker/db/sql:/docker-entrypoint-initdb.d
ports:
- 3306:3306
ローカルPCからmysqlに接続する
db
のポートフォワーディングを3306にしているため、ローカルPCのSQLクライアントからは
- host: localhost (or 127.0.0.1)
- port: 3306 で接続できました。
phpコンテナからmysqlに接続する
ローカルPCからと同じくlocalhostでポートを指定すれば接続できるのかと勘違いしてました。 DockerではDockerネットワークを作成してコンテナ名で通信が可能なようです。
詳しいことはこちらを見てください。 あまり理解できてないです…
Dockerネットワークを確認するdocker network ls
をローカルPCで実行した結果です。
この中のlaradoc_default
が名前解決しているっぽいです。
>docker network ls
NETWORK ID NAME DRIVER SCOPE
f26fe47a0096 bridge bridge local
8b3e919809cd host host local
ca6f7a9282e5 laradoc_default bridge local
3f97d25e5c4a none null local
dbのコンテナの/etc/hosts
を見てみるとこうなっている。
root@728c68c615ef:/var/www/laravel# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.19.0.2 728c68c615ef
phpコンテナからmysqlに接続する
phpコンテナの.envは以下の設定で接続できました。
DB_HOST
をコンテナ名にしてあります。
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=docker
DB_PASSWORD=docker
rootではなくユーザdockerに権限を与えるGRANT ALL ON laravel.* TO docker;
を実行してあります。
Dockerの仕組みの知識がふわふわしてるので勉強しないと。 とりあえず、ローカル開発環境は作ることができた。
参考
- Docker入門(第五回)〜コンテナ間通信〜 - さくらのナレッジ
- 参考にした記事。