Docker:使用来自主机的--net = host选项访问docker容器中的mysql

时间:2016-04-08 07:22:51

标签: mysql docker

我正在使用--net = host选项运行2个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 个答案:

答案 0 :(得分:2)

我猜这与Docker网络无关。 MySQL客户端只是倾向于在MySQL服务器公开的主机上使用Unix套接字。只需向客户端-h 127.0.0.1提供主机IP地址,以强制它使用TCP。