每次在docker容器中,mysql连接主机都会更改,为什么?

时间:2018-10-25 08:38:24

标签: mysql docker

在docker容器中,我尝试登录主机mysql服务器。首先,主机IP更改了,所以让我感到困惑。但是第二次登录成功。任何人都可以解释这种奇怪的情况吗?

我登录的IP是192.168.100.164,但错误信息显示了ip 172.18.0.4,它是容器localhost。

enter image description here

更多信息:

root@b67c39311dbb:~/project# netstat -nr
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         172.18.0.1      0.0.0.0         UG        0 0          0 eth0
172.18.0.0      0.0.0.0         255.255.0.0     U         0 0          0 eth0
root@b67c39311dbb:~/project# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.4  netmask 255.255.0.0  broadcast 172.18.255.255
        ether 02:42:ac:12:00:04  txqueuelen 0  (Ethernet)
        RX packets 2099  bytes 2414555 (2.4 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1752  bytes 132863 (132.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 35  bytes 3216 (3.2 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 35  bytes 3216 (3.2 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

3 个答案:

答案 0 :(得分:0)

在启动--add-host="localhost:192.168.100.164"时尝试添加docker run。但这对我来说不是一个好习惯。您应该将mysql数据库移动到另一个容器,并在它们之间创建一个网络

答案 1 :(得分:0)

是的,当我们启动docker容器时,它获得了自己的容器IP。您需要使用docker容器映射主机端口。然后,当您尝试连接主机端口时,它将重定向到myssql docker容器。请查看https://docs.docker.com/config/containers/container-networking/

答案 2 :(得分:0)

我建议您创建一个Docker桥接网络,然后按照Alexey的建议使用--add-host创建容器。

在一个简单的脚本中:

DOCKER_NET_NAME='the_docker_network_name'
DOCKER_GATEWAY='172.100.0.1'

docker network create \
    --driver bridge \
    --subnet=172.100.0.0/16 \
    --gateway=$DOCKER_GATEWAY \
    $DOCKER_NET_NAME

docker run -d \
    --add-host db.onthehost:$DOCKER_GATEWAY \
    --restart=always \
    --network=$DOCKER_NET_NAME \
    --name=magicContainerName \
    yourImage:latest

编辑:创建一个网络还将简化容器之间的通信(如果您打算将来使用它),因为您将能够使用容器名称而不是其IP。