😺

Docker環境のDB(MySQL)コンテナに接続する方法

2021/01/24に公開

やりたいこと

Dockerで作成したDB(MySQL)コンテナに入ってデータベースをいじりたい。

ソースコード

長いので折りたたんでいます。

docker-compose.yml
docker-compose.yml
#docker-compose.ymlのバージョン
version: "3.8"
#docker volumeの設定
volumes:
  docker-volume:

#services以下に各コンテナの設定を書く
services:
  #Webサーバーのコンテナ
  web:
    image: nginx:1.18
    ports:
      - "8000:80"
    depends_on:
      - app
    volumes:
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - .:/var/www/html
  #アプリケーションのコンテナ
  app:
    build: ./docker/php
    volumes:
      - .:/var/www/html
  #データベースのコンテナ
  db:
    image: mysql:5.7
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: db_name
      MYSQL_USER: db_user
      MYSQL_PASSWORD: db_password
      MYSQL_ROOT_PASSWORD: root
      TZ: "Asia/Tokyo"
    volumes:
      - docker-volume:/var/lib/mysql
  # phpMyadominのコンテナ作成
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    depends_on:
      - db
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOSTS=db
      - PMA_USER=db_user
      - PMA_PASSWORD=db_password
    ports:
      - "8080:80"
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions

.env
.env
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:8EM1Yt7LJjZSRaEjtdhXCVShJEI0GGo6FG6IZHXCuis=
APP_DEBUG=true
APP_URL=http://localhost:8000

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=db_name
DB_USERNAME=db_user
DB_PASSWORD=db_password

BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=cookie
SESSION_LIFETIME=120

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

試したこと

rootのパスワードを使っても接続できない。

terminal
$ docker-compose exec db bash
root@74539701c71c:/# mysql -u user -p
Enter password: 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

ちなみに$ docker-compose psでホストとポート番号を確認すると...

         Name                   Command           State           Ports         
--------------------------------------------------------------------------------
laravel_todo_api_app_1   docker-php-entrypoint    Up      9000/tcp              
                         php-fpm                                                
laravel_todo_api_db_1    docker-entrypoint.sh     Up      0.0.0.0:3306->3306/tcp
                         mysqld                           , 33060/tcp           
laravel_todo_api_phpmy   /docker-entrypoint.sh    Up      0.0.0.0:8080->80/tcp  
admin_1                  apac ...                                               
laravel_todo_api_web_1   /docker-entrypoint.sh    Up      0.0.0.0:8000->80/tcp  
                         ngin ...                                               

解決法

$ mysql -h 127.0.0.1 -P 3306 -u root -p

ホストはlocalhostと指定するとローカルマシンのmysqlソケットを探しに行くのでエラーになる。
ポート番号の指定は大文字で-P

参考

参考にさせていただきました。ありがとうございました。
【Docker】コンテナ内のデータベース閲覧(ローカル,EC2)
docker内のMySQLに接続したい

Discussion