状況
web
というrubyのimageを元にして作られたコンテナからdb
というMySQLのコンテナにmysql -u root -p
のコマンドを試したところ
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")
となってログインできなかった。
環境
version: '3'
volumes:
db-data:
services:
web:
build: .
ports:
- '3000:3000'
volumes:
- '.:/opt'
environment:
- DB_USER=root
- DB_NAME=${DB_NAME}
- DB_PASSWORD=${DB_PASSWORD}
- DB_HOST=db
tty: true
stdin_open: true
depends_on:
- db
links:
- db
db:
image: mysql:5.7
restart: always
volumes:
- 'db-data:/var/lib/mysql'
environment:
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
ports:
- "3306:3306"
解決策
web
とdb
のコンテナが違うIPアドレスで起動していた。その為-h
オプションでhostを指定する。
コンテナのIPアドレスを表示
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
結果
/rails-docker-mysql_web_1 - 172.30.0.3
/rails-docker-mysql_db_1 - 172.30.0.2
以下のコマンドでMySQLにログインできた
mysql -h 172.30.0.2 -P 3306 --protocol=tcp -u root -p
追記
dbのサービス名でアクセス出来ます。
docker compose run --rm db bash -c "mysql -u root -p -h db"