使用docker时,如果想从局域网访问容器,比较常用的方式是将容器的网络模式设置为host模式,或者使用端口映射。但如果想部署多个应用并使用相同的端口,前面这两种方式就不适用了。
使用docker的macvlan网络可以解决这个问题。
宿主机所在网络需要有一个交换机作为网关,并且局域网网段有富余的IP。
可以在linux命令行执行lsmod | grep macvlan
查看当前内核是否加载了该驱动;如果没有查到,可以通过modprobe macvlan
来载入。
使用如下命令创建一个macvlan网络:
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.10 -o parent=eth0 macvlan
参数 | 作用 |
---|---|
--subnet | 指定网段,这里需要和宿主机eth0所在LAN保持一致 |
--gateway | 指定网关,需要使用宿主机eht0的IP作为网关 |
parent | 父网卡,指定宿主机的网卡 |
创建完成后使用docker network ls
查看:
docker network ls
NETWORK ID NAME DRIVER SCOPE
a71929db3c97 bridge bridge local
92f0af272616 host host local
f551a7dc8266 macvlan macvlan local
db500edb2d7b none null local
docker run --net=macvlan --ip=192.168.1.12 --name test -itd alpine:3.6
然后进入容器docker exec -it test /bin/sh
,通过ifconfig
可以查看容器的网卡信息。
在容器里ping网关192.168.1.10是无法ping通的,这是由于macvlan模式设计的时候为了安全禁止了宿主机和容器直接通信,ping的回包无法到达容器。
要实现宿主机和容器互通,需要在宿主机上再创建一个macvlan网络设备,将这个设备作为bridge,再修改路由使宿主机访问容器时指向该设备。
建立一个名为macbridge的macvlan设备,并分配ip:
ip link add macbridge link eth0 type macvlan mode bridge
ip addr add 192.168.1.11 dev macbridge
ip link set macbridge up
创建完成后通过ifconfig
可以看到新增的设备。然后添加路由(如果有多个容器则需要加多条):
ip route add 192.168.1.12 dev macbridge
完成后通过宿主机就可以ping通容器test了。
该容器可以被LAN中其他宿主机访问了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。