🙃

Docker containerからhostのMySQLに接続する

2021/12/15に公開

container同士やhostからmysql containerの接続は簡単ですが、逆にcontainerからhostにアクセスする時に色々詰まったので、書き残しておきます。

参考記事 https://xyk.hatenablog.com/entry/2013/11/08/142548

参考記事 https://sam-ngu.medium.com/connecting-to-docker-host-mysql-from-docker-container-linux-ubuntu-766e526542fd

環境

  • Ubuntu 20
  • MySQL 5.7
  • Docker 20.10.11

docker-compose.yml

version: '3'
services:
  app:
   # 省略
   networks:
     app_net: 
	ipv4_address: 172.28.1.5 # <- 固定IPに指定
   extra_hosts: 
      - "host.docker.internal:host-gateway" # <- containerの中からアクセスできるようにhostのIPを渡す
	
#ネットワーク設定
networks:
  app_net: # <-ここはどんな名前でも大丈夫
    driver: bridge
    name: app_net
    ipam:
      config:
        - subnet: 172.28.1.0/24

MySQLの設定

デフォルトではmysqlは外部接続はできないようになっているみたいです、なのでそこを有効化する必要があります。

その前にnetstatを使ったネットワークのステータスをチェックしておきます。

$ netstat -ant

Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 172.0.0.1:3306            0.0.0.0:*               LISTEN

/etc/mysql/mysql.conf.d/mysqld.cnfの中のbind-addressオプションをbind-address=172.0.0.1からbind-address=0.0.0.0に変更します。
そしてMySQLを再起動 /etc/init.d/mysql restart

もう一回チェックすると

$ netstat -ant

Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN

MySQLに新しいユーザー追加

まずユーザーリストをチェックします。

mysql> select user, host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
6 rows in set (0.00 sec)

mysqlにルートユーザーでログインして👇を実行します。


CREATE USER 'root'@'172.%' IDENTIFIED BY '';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

※ パスワードを指定したい場合は追加で👇


SET PASSWORD FOR 'root'@'172.%' = PASSWORD('password');

ユーザーリスト表示


mysql> select user, host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| root          | 172.%     |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
6 rows in set (0.00 sec)

container起動

container起動して中に入って cat /etc/hostsをするとhostのIPが追加されていれば大丈夫です。

$ cat /etc/hosts

172.17.0.1   host.docker.internal
👆ホストのip

注:containerの中でホストのDBを接続する時にDB_HOSTをhost.docker.internalに指定する必要があります。

firewallを忘れずに!!

これで結構はまりました!ubuntuの場合は ufw allow from 172.28.1.5 to any port 3306を叩いてcontainerのIPを許可してあげる必要がありました!

ufw statusでチェックしてみる

$ ufw status

To                         Action      From
--                         ------      ----
3306                       ALLOW       172.28.1.5

Discussion