Docker:使用来自主机的 --net=host 选项访问 docker 容器中的 mysql
Docker: Access mysql in docker container using --net=host option from host
我是 运行ning 2 docker 带有 --net=host 选项的容器,因此网络是透明的(docker 容器使用与主机相同的网络设备)。
docker network inspect host
[
{
"Name": "host",
"Id": "32ddf8f58d520e49a0b3f296d6d03134b24d7c503309e1c35e04c248010aa64b",
"Scope": "local",
"Driver": "host",
"IPAM": {
"Driver": "default",
"Options": null,
"Config": []
},
"Containers": {
"0e41eb0b07d2751db99a204a3a69a2446bf5b869150bc5741df670e56dbce670": {
"Name": "sleepy_goldstine",
"EndpointID": "cc8f2c4da055ae7e608c127552f67753c319aeb603234c418a0ebe8958c1025a",
"MacAddress": "",
"IPv4Address": "",
"IPv6Address": ""
},
"71de826121e7222020eec8be8b3a737f3297f8c3aa99d21f0f7016d6aca6f668": {
"Name": "tender_goodall",
"EndpointID": "2da0468dbaf1e6b877984cbeb6b2a775786259fec7e83eb373c1d25fe715e16f",
"MacAddress": "",
"IPv4Address": "",
"IPv6Address": ""
}
},
"Options": {}
}
]
我可以从外部访问 docker 容器中的多项服务。但是,有一件事不起作用,我开始用剪刀 运行...
在 docker 主机上有一个 mysql 数据库 运行ning 在端口 3306 上。没有问题。
Docker 容器 1 在端口 3307 上也有 mysqld 运行ning 并且 docker 容器 2 有 mysqld 运行宁在端口 3308
但是,使用
mysql -P 3307 -u 用户 -p 数据库名
我无法从主机访问 mysql 数据库。即使我在第一个 docker 实例中为 mysql 运行ning 提供端口,它也总是将我定向到主机上的 mysql 数据库。没有可能导致此类行为的 iptables 规则。关闭防火墙不会改变行为。
在 my.cnf 中,mysql 服务器绑定到 0.0.0.0 (127.0.0.1) 也不起作用。
所以我迷路了,希望有人看到解决方案。删除 --host=net 选项并使用端口公开不是一个选项,因为这会降低容器的网络性能。
编辑:忘记提及 docker 容器中的数据库可以访问并按设计工作。唯一不起作用的是来自主机 -> docker 的连接,因为即使使用 docker 容器中的端口,连接也将始终指向主机 -> 主机。
我想这与 Docker 网络无关。 MySQL 客户端倾向于在 MySQL 服务器公开的主机上使用 Unix 套接字。只需向客户端提供主机 IP 地址,-h 127.0.0.1
,强制其使用 TCP。
我是 运行ning 2 docker 带有 --net=host 选项的容器,因此网络是透明的(docker 容器使用与主机相同的网络设备)。
docker network inspect host
[
{
"Name": "host",
"Id": "32ddf8f58d520e49a0b3f296d6d03134b24d7c503309e1c35e04c248010aa64b",
"Scope": "local",
"Driver": "host",
"IPAM": {
"Driver": "default",
"Options": null,
"Config": []
},
"Containers": {
"0e41eb0b07d2751db99a204a3a69a2446bf5b869150bc5741df670e56dbce670": {
"Name": "sleepy_goldstine",
"EndpointID": "cc8f2c4da055ae7e608c127552f67753c319aeb603234c418a0ebe8958c1025a",
"MacAddress": "",
"IPv4Address": "",
"IPv6Address": ""
},
"71de826121e7222020eec8be8b3a737f3297f8c3aa99d21f0f7016d6aca6f668": {
"Name": "tender_goodall",
"EndpointID": "2da0468dbaf1e6b877984cbeb6b2a775786259fec7e83eb373c1d25fe715e16f",
"MacAddress": "",
"IPv4Address": "",
"IPv6Address": ""
}
},
"Options": {}
}
]
我可以从外部访问 docker 容器中的多项服务。但是,有一件事不起作用,我开始用剪刀 运行...
在 docker 主机上有一个 mysql 数据库 运行ning 在端口 3306 上。没有问题。
Docker 容器 1 在端口 3307 上也有 mysqld 运行ning 并且 docker 容器 2 有 mysqld 运行宁在端口 3308
但是,使用
mysql -P 3307 -u 用户 -p 数据库名
我无法从主机访问 mysql 数据库。即使我在第一个 docker 实例中为 mysql 运行ning 提供端口,它也总是将我定向到主机上的 mysql 数据库。没有可能导致此类行为的 iptables 规则。关闭防火墙不会改变行为。
在 my.cnf 中,mysql 服务器绑定到 0.0.0.0 (127.0.0.1) 也不起作用。
所以我迷路了,希望有人看到解决方案。删除 --host=net 选项并使用端口公开不是一个选项,因为这会降低容器的网络性能。
编辑:忘记提及 docker 容器中的数据库可以访问并按设计工作。唯一不起作用的是来自主机 -> docker 的连接,因为即使使用 docker 容器中的端口,连接也将始终指向主机 -> 主机。
我想这与 Docker 网络无关。 MySQL 客户端倾向于在 MySQL 服务器公开的主机上使用 Unix 套接字。只需向客户端提供主机 IP 地址,-h 127.0.0.1
,强制其使用 TCP。