🌊

docker-composeで立ち上げたDockerコンテナのMySQLにログインする

2021/05/22に公開

株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。
本記事は表題の通り、docker-composeで立ち上げたDockerコンテナのMySQLにログインする際の方法をまとめました。

環境

macOS Big Sur v11.2.3
Docker v20.10.5
docker-compose v1.29.0

接続する方法

DockerコンテナのMySQLにログインするのは、以下の2つの方法があります。

  1. MySQLが入っているDockerコンテナにログインして、そこからMySQLへログインする
  2. ローカルからポート番号やホストを指定して、直接MySQLへログインする(ローカルにHomebrewなどでMySQLがインストールされていなければならない)

それぞれ説明していきます。

1. DockerコンテナへログインしてMySQLへログインする

docker-compose.ymlで立ち上げるMySQLのコンテナの設定は以下のようにします。

docker-compose.yml
version: '3'

services:
  db:
    image: mysql:8.0
    platform: linux/x86_64
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    ports:
      - '3306:3306'
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql_data:/var/lib/mysql
volumes:
  mysql_data:

上記の設定で以下のコマンドを実行し、docker-composeでDockerコンテナを立ち上げます。

ターミナル
docker-compose up

上記のコマンドでDockerコンテナが立ち上がったら、以下のコマンドでMySQLのDokcerコンテナにログインすることができます。

ターミナル
docker-compose exec {サービス名} /bin/bash

{サービス名}となっているところは、docker-compose.ymlで指定しているMySQLコンテナのservice名となります。先程のdocker-compose.ymlの設定だとdbになります。
上記のコマンドでログインすることができると以下のような表示がされます。

root@700b78b7f874:/# 

こうなったらログインできているので、ここからMySQLへログインします。

Dockerコンテナ内のターミナル
mysql -u root

docker-compose.ymlでMYSQL_ALLOW_EMPTY_PASSWORD: 'yes'を指定しているため、rootユーザーのパスワードを入力しなくてもMySQLにログインすることができるようになっています。
このオプションを設定していない場合、docker-compose.ymlのenvironmentsオプションでMYSQL_ALLOW_EMPTY_PASSWORD: passwordのような形でパスワードを設定し、MySQLに接続する際には以下のコマンドでパスワードを入力する形となります。

Dockerコンテナ内のターミナル
mysql -u root -p
Enter password: {設定したパスワード}

2. ローカルから直接MySQLへログインする

この方法で接続するにはローカルにHomebrewか何かでMySQLをインストールしておかなければなりません。
この記事では、ローカルにMySQLがインストールされているという前提で話を進めます。

docker-compose.ymlで立ち上げるMySQLのコンテナの設定は以下のようにします。

docker-compose.yml
version: '3'

services:
  db:
    image: mysql:8.0
    platform: linux/x86_64
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    ports:
      - '4306:3306'
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql_data:/var/lib/mysql
volumes:
  mysql_data:

ここで重要なのは、docker-compose.ymlでportsオプションを使って、わざわざポート番号を変更していることです。ローカルにインストールしているMySQLもポートが3306となっているため、ローカルのMySQLとDocekrコンテナのMySQLのポートが衝突してしまい、ローカルのMySQLに接続されてしまい意図しない挙動となってしまう問題が起きる可能性があるからです。
(もちろん、ローカルのMySQLを起動してなかったり、ポート番号を変更していたらその問題は起こりません。)

上記の設定で以下のコマンドを実行し、Dockerコンテナを立ち上げます。

ターミナル
docker-compose up

上記のコマンドでDockerコンテナが立ち上がったら、以下のコマンドでMySQLのDokcerコンテナに直接ログインすることができます。
ここでも、MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'となっているため、パスワードは入力しなくてもログインすることができます。

ターミナル
mysql -u root -h 127.0.0.1 --port 4306

以上です。

Discussion