不少人初时Docker时应该都遇到过这个问题,例如宿主机安装了mysql,但应用是Docker部署的,且需要连接mysql,那么就会遇到这个问题。

一般人会选择直接使用公网ip或服务器组内私网ip的方式,实际中这样做的也更多,因为一台服务器上一般只会有一个服务,但也不排除个别情况,今天就更别情况讲一讲。

Docker与宿主机的关系

docker网络图.png

如上图,docker与宿主机之间会有一块网卡,通常名为docker0。在宿主机中使用ifconfig命令可以查看。

docker0.png

宿主机的ip即为所有容器的网关,直接启动的容器都会在172.17.0.0/16这个网段上分配得到ip。

因此在Docker内就可以通过宿主机docker0的ip访问宿主机。

创建网卡

docker0的ip可以修改,但不能保证每台服务器都允许你修改,既然默认的网卡不行,那就再创建一块。

创建Network官方文档

docker network create -d bridge --subnet 192.168.10.0/24 local

这样就创建了一块网段为192.168.10.0/24的网卡,再次使用ifconfig就能看到这块网卡,ip一般为网段第一个地址即192.168.10.1

新网卡.png

使用--network指定网卡启动,这里我使用redis容磁测试。

docker run --name test-network --network local -d redis

启动后使用docker inspect {container id}查看ip。

容器ip.png

可以看到容器ip已经变为192.168.10.2,且网关即为我们的宿主机。

使用docker-compose

更多的时候我们并不会直接使用docker run,而是选择docker-compose的方式。

version: "3.0"
services:
  ...
networks:
  default:
    driver: bridge
    ipam:
      driver: default
      config:
      - subnet: 192.168.0.0/24

docker-compose会根据配置文件根节点的networks创建网卡,等同于docker network create
如果services没有指定网卡,那么docker-compose会创建一个默认网卡,名字为{项目名}-default,项目名可以用docker-compose -p xxx up指定,不指定的话则以当前文件夹名作为项目命。

默认网卡.png

上面的示例配置文件中就修改了默认网卡的网段为192.168.0.0/24,那么所有使用该配置文件编排的服务都可以使用192.168.0.1访问宿主机。

当然也可以使用已经创建好的网卡,例如上文创建的local:

version: "3.0"
services:
  ...
networks:
    default:
        external:
            name: local