默认情况下 docker 使用 Bridge网络模式 容器运行在一个docker 172开头的子网 通过 iptables dnat 通过宿主与外部主机通信
也可以通过 docker macvlan bridge 使容器获取物理子网
1.宿主开启转发
/etc/sysctl.conf
net.ipv6.conf.all.forwarding = 1
net.ipv4.ip_forward=1
2.创建dokcer macvlan
查看docker当前的network
sudo docker network ls
创建macvlan物理子网
ipv6使用ula地址
sudo docker network create -d macvlan --subnet=192.168.11.0/24 --gateway=192.168.11.1 --ipv6=true --subnet=fd72:c7e3:b338:b914::/64 --gateway=fd72:c7e3:b338:b914::1-o parent=enp1s0 -o macvlan_mode=bridge phynet
3.配置docker homeassistant
sudo docker search homeassistant
sudo docker pull homeassistant/home-assistant
在宿主创建配置目录 添加组件和配置 configuration.yaml 都在这个目录
即便删除容器 只要这个目录还是存在的 每次重新创建心的容器 原来的配置依然存在
sudo mkdir -p /etc/homeassistant/config
创建容器
sudo docker run -d --name=ha -v /etc/homeassistant/config:/config -e TZ=Asia/Shanghai --ip=192.168.11.222 --ip6=fd72:c7e3:b338:b914:5b5b:f3a9:7052:c12b --dns=192.168.11.11 --network phynet --restart=always homeassistant/home-assistant:latest
4.宿主访问容器
docker 宿主无法访问 通过macvlan创建的地址 这是被限制的 因此需要为宿主创建一个新的ip地址绕过docker的限制
在宿主配置新的接口docker-br 这个接口专门用来访问上述通过macvlan创建容器 从而绕过限制
ip link add docker-br link enp1s0 type macvlan mode bridge
ip addr add 192.168.11.111 dev docker-br
ip -6 addr add fd72:c7e3:b338:b914::11:1111 dev docker-br
ip link set docker-br up
ip -4 route add 192.168.11.11 dev docker-br
ip -6 route add fd72:c7e3:b338:b914:5b5b:f3a9:7052:c12b dev docker-br
如果容器的ipv6地址通过 slaac 自配置的而不是上述设置静态ipfd72:c7e3:b338:b914:5b5b:f3a9:7052:c12b 需要获取容器的slaac地址然后替换到路由表