一、容器与宿主机使用同一网段IP地址

前言:一台服务器需要通过docker运行N个centos容器模拟多个服务器做资源隔离,通过docker网络设置,容器直接使用物理网卡的信息获取IP地址,达到外部能直接访问容器的资源。如宿主机的IP为192.168.0.1,容器运行后容器的IP为192.168.0.2192.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.101ens33
容器一192.168.17.10macvlan
容器二192.168.17.11macvlan

建立一个名为qiangmacvlan接口,并分配一个ip:

名字ip接口
qiang192.168.17.20macvlan

命令:

# 添加
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