🙃
Docker containerからhostのMySQLに接続する
container同士やhostからmysql containerの接続は簡単ですが、逆にcontainerからhostにアクセスする時に色々詰まったので、書き残しておきます。
環境
- 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