🌊

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

2021/05/22に公開

株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら弊社HPからご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。

  • プロジェクトでRailsエンジニアが足りなくて困っている
  • Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
  • オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら弊社HPからご連絡いただけますと幸いです。

前提

本記事は表題の通り、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