一、容器与宿主机使用同一网段IP地址
前言:一台服务器需要通过docker运行N个centos容器模拟多个服务器做资源隔离,通过docker网络设置,容器直接使用物理网卡的信息获取IP地址,达到外部能直接访问容器的资源。如宿主机的IP为
192.168.0.1
,容器运行后容器的IP为192.168.0.2
、192.168.0.3
等等。
步骤:
# 网卡名ens33 宿主机IP192.168.17.101 宿主机网关192.168.17.2 创建的网络名centos
docker network create -d macvlan --subnet=192.168.17.0/24 --gateway=192.168.17.2 -o parent=ens33 centos
# 查看网络信息
docker network ls
---------------------------------------------------------------------
NETWORK ID NAME DRIVER SCOPE
60ea247673ed centos macvlan local
---------------------------------------------------------------------
# 查看网络详细信息
docker network inspect centos
# 启动容器
docker-compose up -d
---------------------------------------------------------------------
version: '3'
services:
centos-10:
restart: always
image: 192.168.17.198/xiaoqiangzai/centos:1804
container_name: centos-10
privileged: true
command: /usr/sbin/init
ports:
- '10:22'
volumes:
- ./data:/home
networks:
default:
ipv4_address: 192.168.17.10
networks:
default:
external:
name: centos
---------------------------------------------------------------------
version: '3'
services:
centos-11:
restart: always
image: 192.168.17.198/xiaoqiangzai/centos:1804
container_name: centos-11
privileged: true
command: /usr/sbin/init
ports:
- '11:22'
volumes:
- ./data:/home
networks:
default:
ipv4_address: 192.168.17.11
networks:
default:
external:
name: centos
---------------------------------------------------------------------
# 连接
ssh root@192.168.17.10
ssh root@192.168.17.11
二、MACVLAN网络模式下容器与宿主机互通
一般在macvlan模式下同网段的其他机器可以和容器互通,但宿主不能和容器互通,这是在macvlan模式设计的时候为了安全而禁止了宿主机和容器直接通信。
如果想要实现互通,有个曲线救国的方法,就是macvlan与macvlan之间可以互通,只需要在宿主机再创建一个macvlan网络,然后修改路由,让数据经过这个macvlan达到互通的目的。
假设现有网段为192.168.17.0/24
的网络:
名字 | ip | 接口 |
---|---|---|
宿主机 | 192.168.17.101 | ens33 |
容器一 | 192.168.17.10 | macvlan |
容器二 | 192.168.17.11 | macvlan |
建立一个名为qiang
的macvlan
接口,并分配一个ip:
名字 | ip | 接口 |
---|---|---|
qiang | 192.168.17.20 | macvlan |
命令:
# 添加
ip link add qiang link ens33 type macvlan mode bridge
ip addr add 192.168.17.20 dev qiang
ip link set qiang up
# 删除
ip link delete qiang
修改路由,让宿主机(192.168.17.101)
到容器(192.168.17.10)
的数据经过qiang
:
ip route add 192.168.17.10 dev qiang
修改路由,让宿主机(192.168.17.101)
到容器(192.168.17.11)
的数据经过qiang
:
ip route add 192.168.17.11 dev qiang
删除路由:
ip route del 192.168.17.10
ip route del 192.168.17.11