Docker内如何访问宿主机
不少人初时Docker
时应该都遇到过这个问题,例如宿主机安装了mysql,但应用是Docker
部署的,且需要连接mysql
,那么就会遇到这个问题。
一般人会选择直接使用公网ip或服务器组内私网ip的方式,实际中这样做的也更多,因为一台服务器上一般只会有一个服务,但也不排除个别情况,今天就更别情况讲一讲。
Docker与宿主机的关系
如上图,docker
与宿主机之间会有一块网卡,通常名为docker0
。在宿主机中使用ifconfig
命令可以查看。
宿主机的ip即为所有容器的网关,直接启动的容器都会在172.17.0.0/16
这个网段上分配得到ip。
因此在Docker
内就可以通过宿主机docker0
的ip访问宿主机。
创建网卡
docker0
的ip可以修改,但不能保证每台服务器都允许你修改,既然默认的网卡不行,那就再创建一块。
docker network create -d bridge --subnet 192.168.10.0/24 local
这样就创建了一块网段为192.168.10.0/24
的网卡,再次使用ifconfig
就能看到这块网卡,ip一般为网段第一个地址即192.168.10.1
。
使用--network
指定网卡启动,这里我使用redis
容磁测试。
docker run --name test-network --network local -d redis
启动后使用docker inspect {container id}
查看ip。
可以看到容器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
指定,不指定的话则以当前文件夹名作为项目命。
上面的示例配置文件中就修改了默认网卡的网段为192.168.0.0/24
,那么所有使用该配置文件编排的服务都可以使用192.168.0.1
访问宿主机。
当然也可以使用已经创建好的网卡,例如上文创建的local
:
version: "3.0"
services:
...
networks:
default:
external:
name: local
Or you can contact me by Email