- 启用Open vSwitch 。路径:控制面板-网络-网络界面-管理-Open vSwitch 设置
- ssh登录,ip addr 查看ovs_开头的IP,如ovs_eth0,如果存在可以确认开通成功
- 创建网络
docker network create -d macvlan --subnet=192.168.123.0/24 --ip-range=192.168.123.48/28 --gateway=192.168.123.1 -o parent=ovs_eth1 macv
创建容器
#通过macvlan 启动docker,使用命令行可以指定IP,可视化界面中可以选择网络但是无法指定IP,下次启动时可能会变,所以还是通过命令行指定为好
docker run -d --name=nginx-1 --net=macv --ip=192.168.123.49 -v /volume1/docker/nginx:/etc/nginx/conf.d nginx:latest
启动容器后,macvlan可以和局域网内的其他机器互相访问,但是就是无法访问宿主机,这个时候需要执行如下命令:
## vi /usr/local/bin/macvlan_start.sh
# 创建一个名称为macv_bridge的网桥
ip link add macv_bridge link ovs_eth1 type macvlan mode bridge
# 给macv_bridge指定一个IP
ip addr add 192.168.123.47 dev macv_bridge
# 启动 macv_bridge
ip link set macv_bridge up
# 创建路由连接子网
ip route add 192.168.123.48/28 dev macv_bridge
如果要恢复网络需要执行相反的命令:
## vi /usr/local/bin/macvlan_stop.sh
# 删除路由
ip route del 192.168.123.48/28 dev macv_bridge || true
# 停用网桥
ip link set macv_bridge down || true
# 删除网桥IP
ip addr del 192.168.123.47/32 dev macv_bridge || true
# 删除网桥
ip link del macv_bridge || true
# 以上两个文件加执行权限
chmod +x /usr/local/bin/macvlan_start.sh
chmod +x /usr/local/bin/macvlan_stop.sh
想要每次开机自动执行,需要编辑成一个服务:
vi /usr/local/lib/systemd/system/macvlan.service
[Unit]
Description=Macvlan shim to allow docker to route to host
# After=pkgctl-Docker.service
# BindsTo=pkgctl-Docker.service
ReloadPropagatedFrom=pkgctl-Docker.service
PartOf=pkgctl-Docker.service
[Service]
Type=oneshot
ExecStart=/bin/bash /usr/local/bin/macvlan_start.sh
ExecStop=/bin/bash /usr/local/bin/macvlan_stop.sh
RemainAfterExit=yes
Restart=no
[Install]
WantedBy=pkgctl-Docker.service
systemctl daemon-reload
# 设置服务自动启动
systemctl enable macvlan
以后只要macvlan.service在运行中,就会检测docker服务运行状态。当docker服务启动完成后,macvlan.service服务会执行start脚本。当docker服务关闭后,macvlan.service服务会执行stop脚本。