Docker: 使用 --net=host 选项从宿主机访问 Docker 容器中的 MySQL。

4

我正在运行两个带有--net=host选项的Docker容器,因此网络是透明的(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主机上,有一个运行在3306端口上的mysql数据库,没有问题。Docker容器1也运行在3307端口上的mysqld,Docker容器2运行在3308端口上的mysqld。但是,使用"mysql -P 3307 -u user -p dbname"命令时,我无法从主机访问mysql数据库。即使我提供了在第一个docker实例中运行的mysql端口,它始终将我重定向到主机上的mysql数据库。没有任何iptables规则可以导致这种行为。关闭防火墙也无法改变这种行为。在my.cnf中,mysql服务器绑定到0.0.0.0(127.0.0.1)也不起作用。所以我迷失了方向,希望有人能找到解决方法。删除--host=net选项并使用端口暴露不是一个选择,因为这会降低容器之间的网络性能。编辑:忘记提到docker容器内的数据库可访问且按设计工作。唯一不起作用的是主机->docker的连接,因为连接总是被重定向到主机->主机,即使使用docker容器的端口也是如此。
1个回答

5
我猜这与Docker网络无关。MySQL客户端倾向于使用由MySQL服务器暴露在主机上的Unix套接字。只需向客户端提供主机IP地址-h 127.0.0.1,强制其使用TCP即可。

你是我的英雄!问题解决了! - Blacksheep
@Blacksheep 很高兴能帮到你 :-) 我在使用SSH隧道连接MySQL端口到本地主机时遇到过这个问题,一直想知道为什么它不起作用。请注意,如果您提供localhost,它将无法正常工作。这里有一个关于如何配置MySQL客户端以更符合预期方式操作的问题。这里还有一个相关的MySQL bug - saaj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接