docker 连接宿主机的 MySQL

本文地址:https://blog.lucien.ink/archives/505

在实际生产过程中,docker 内的服务有时需要连接宿主机的 MySQL,在这里记录一下踩过的坑。

0. 本文环境

Name Version
Docker 19.03.4, build 9013bf583a
OS Debian GNU/Linux 9

1. 宿主机的 IP

在容器内执行 ip route 命令,default via 后面跟着的 IP 就是宿主机的 IP。

root@debian: docker run --rm busybox ip route
default via 172.18.0.1 dev eth0
172.18.0.0/16 dev eth0 scope link  src 172.18.0.2

可以看到,此容器的本机 IP 为 172.18.0.2,宿主机的 IP 是 172.18.0.1

1.1 docker network 对 IP 的影响

在宿主机中运行 docker run --rm busybox ip route 获得的宿主机 IP 为 172.18.0.1,在指定了 network 的容器内 ping 不通。后来发现在不同的 network 下,容器的 IP 段是不一样的,在这里复现一下。

root@debian: docker network create test # 创建新的 network
d5c1f383ee4c397112660b18087c42fe8f3e000ced2949778b4adb4925e6882d
root@debian: docker run --rm --network test busybox ip route
default via 192.168.192.1 dev eth0
192.168.192.0/20 dev eth0 scope link  src 192.168.192.2

可以看到,在指定了 network 后,IP 段就从 172.18.0.0/16 变成了 192.168.192.0/20

1.2 查看 network 的信息

可以通过 docker network inspect <network name> 的命令来查看 network 的信息。

其中 Gateway 字段代表宿主机的地址。

root@debian: docker network inspect test
[{"Name": "test","Id": "d5c1f383ee4c397112660b18087c42fe8f3e000ced2949778b4adb4925e6882d","Created": "2020-08-25T23:44:15.827765119+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "192.168.192.0/20","Gateway": "192.168.192.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {},"Options": {},"Labels": {}}
]

2. 宿主机的防火墙

在能 ping 通宿主机的前提下,尝试通过 mysql -h 192.168.192.1 -u root -p 命令登录宿主机的 MySQL,结果 Timeout 了。

但是在容器内执行 curl 192.168.192.1 是有 response 的,证明是宿主机的 3306 端口没有放开,放开 3306 端口即可。

一般云服务器厂商自身还有一个防火墙,只要云服务器控制面板里的防火墙不放开 3306 端口的话,外界依然访问不了服务器的 3306 端口,所以可以大胆在服务器内放开 3306 端口,不必担心安全问题。

3. MySQL 的白名单

解决了防火墙的问题之后,在容器内再次尝试通过 mysql -h 192.168.192.1 -u root -p 连接宿主机的 MySQL,收到了来自 MySQL 的报错 Host '192.168.192.2' is not allowed to connect to this MySQL server,直接在 MySQL 中将 192.168.192.2 加入白名单即可。

如果是多个容器都需要连接宿主机的 MySQL 的话,可以参考 MySQL IP 白名单使用通配符 将 B 类子网 192.168.0.0 全都加入白名单,这样一来就一劳永逸了。

docker 连接宿主机的 MySQL相关推荐

  1. docker与宿主机共享内存通信

    docker与宿主机共享内存通信 docker中的进程要与宿主机使用共享内存通信,需要在启动容器的时候指定"–ipc=host"选项.然后再编写相应的共享内存的程序,一个跑在宿主机 ...

  2. 记录一次docker导致宿主机重启故障解决方法

    记录一次docker导致宿主机重启故障解决方法 参考文章: (1)记录一次docker导致宿主机重启故障解决方法 (2)https://www.cnblogs.com/caidingyu/p/1215 ...

  3. docker导致宿主机重启和Cgroup 驱动程序有关

    现象 某个宿主机突然登录不上了,重启后查看系统日志/var/log/messages和下面的日志类似 Jan 5 15:50:01 hanginx01 systemd: Started Session ...

  4. mac for docker访问宿主机服务

    pod访问mac主机网络 Docker For Mac的Docker Daemon是运行于虚拟机(xhyve)中的, 而不是像Linux上那样作为进程运行于宿主机,因此Docker For Mac没有 ...

  5. docker连接容器外部的mysql

    centos上面部署了docker容器 并且将原来的服务放到的docker的tomcat镜像上 但是现在服务服务连接mysql数据库 mysql.url=jdbc:mysql://localhost: ...

  6. docker 导致宿主机重启的解决方法

    宿主机操作系统为centos 7.4 在k8s运行一段时间报错: containerd: time="2019-12-19T21:50:49.070815105Z" level=i ...

  7. docker使用宿主机代理

    docker run -it --network=host --name="Host-Proxy-Test" ubuntu:16.04export ALL_PROXY='socks ...

  8. docker需要linux内核版本,docker与宿主机内核版本

    1. 楼主的问题1我也产生过,虽然问法不一样,起初我也是想,如果就是运行在centos的服务器上,是否还需要FROM cetnos.但是既然所有书上一开始都说了要pull centos(ubuntu) ...

  9. 【docker】宿主机安装kafka docker容器内clickhouse无法连接

    1. 概述 本地搭建了一套clickhouse连接kafka的环境,然后发现无法连接到kafka,环境如下 本机kafka 已启动docker ck 无法连接宿主机 9092 docker内部teln ...

最新文章

  1. PyCharm为什么这么牛?
  2. android easylink 搜索设备_手把手教你将数据从Android移动到iPhone步骤与技巧
  3. java抽象的理解_Java中抽象类的理解
  4. php 不能同时提交form
  5. 面试官问我会不会APP抓包,我..
  6. 第五章 列表、元组和字符串[DDT书本学习 小甲鱼]【6】
  7. C++虚继承(八) --- 虚继承与继承的差异
  8. qwidget多个窗口同步_【好人BUG】本机多组控制 一台电脑使用一个帐号登录多个(省钱) !...
  9. 设单链表中存放n个字符,试设计一个算法,使用栈推断该字符串是否中心对称...
  10. 论文学习1-DeepPath: A Reinforcement Learning Method for Knowledge Graph Reasoning
  11. android 跳转动画黑屏,Android8.0 适配解决页面跳转过程出现短暂黑屏的问题
  12. 每日站立会议 12.06
  13. 设置maven的阿里云代理
  14. 千锋中级Python视频百度云
  15. [六省联考2017]分手是祝愿
  16. linux中dpkg找不到命令_Linux中tree命令的使用
  17. Alexa工具条正确安装方法 Alexa工具条正确使用方法 Alexa工具条正确应用
  18. JavaScript网页游戏开发实战视频教程
  19. 【常用模块】电容触摸按键模块(原理讲解、STM32实例操作)
  20. UE4 相对坐标转世界坐标

热门文章

  1. KDZD400QH2S检测仪
  2. JavaSE-初级阶段项目-学生管理系统
  3. 我的专业我做主计算机演讲稿,我的管理我做主演讲稿
  4. 备案域名绑定服务器后 提示需要备案_最近有人问我:买了个域名,怎么用不了?域名究竟该怎么用?...
  5. 重点函数 | SELECTEDVALUE 用法介绍
  6. 各种好用的在线时钟、网页时钟汇总推荐集合
  7. 【转】【中级财管精华】递延年金现值公式的理解
  8. “error”:”get from image source failed: E405
  9. java 生成 zip格式 压缩文件
  10. php 忽略小数点,php使用floor去掉小数点的例子