DockerでのLaravel .envの設定。コンテナ間通信はホスト名=コンテナ名でした

WSL2を導入してとうとうDockerが使えるようになりました! この記事に沿ってLaravelの開発環境を作っているところです。

Laravelが動くコンテナからDBのコンテナに接続するホスト名がわからなかったのでメモします。 結論としてはコンテナ間通信はコンテナ名を使用することでできます

環境

  • 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の仕組みの知識がふわふわしてるので勉強しないと。 とりあえず、ローカル開発環境は作ることができた。

参考

Placeholder image

すずろく/suzu6

札幌にいるWEBアプリのエンジニア。最近はテストをもっと書きたい。

@suzu6_py Amazon ほしいものリスト

 関連記事

 新着 or 更新記事