docker 环境下 ip 冲突处理
问题
医疗场景下大多是自建机房与网络,不同的医院对IP的规划有不同的套路,正好就碰上一个客户用的172的网段,一个院区的网断就跟docker0 和 docker_gwbridge冲突了。
解决
我们的程序用的是docker swarm,通过portainer进行管理。
1. 保存docker swarm 的 config
因为用到了 docker swarm 的config 作为配置,所以需要保存下来(secret 同理);
#! /bin/bash
# 备份脚本
for config in `sudo docker config ls -q`;do
filename=$(sudo docker config inspect $config | grep Name | sed -e 's/"Name": "//g' -e 's/",//g' -e 's/ //g')
sudo docker config inspect $config | grep Data | sed -e 's/."Data": "//' -e 's/"//g' -e 's/ //g' | base64 -d >configs/$filename
echo "${filename} 已导出"
done
echo "全部完成"
#! /bin/bash
# 还原脚本
for config in `ls configs`;do
sudo docker config create $config configs/$config
done
2. 在portainer里面删除所有的stack
因为用portainer部署的程序,所以portainer数据库中记录了已部署的stack的信息,如果直接用docker stack rm
删除,到时候portainer部署的时候会报stack已存在;
3. 删除所有的config
既可以在portainer中进行删除,也可以用命令,portainer本身没保存这个数据。
4. 删除 portainer 的stack
5. 移除 docker swarm
`sudo docker swarm leave --force`
6. 修改docker ip
6.1 修改 docker0
在 /etc/docker/daemon.json
中添加
{
"bip": "51.17.0.1/16"
}
然后重启docker服务sudo systemctl restart docker
6.2 修改 docker_gwbridge
docker_gwbridge 会在 init 或者 join 一个docker swarm 集群的时候创建,所以我们只需要在之前创建即可,若已经重建过集群需先删除sudo docker network rm docker_gwbridge
。
然后重新创建一个想要的ip段的 docker_gwbridge
sudo docker network create --subnet 51.18.0.1/16 --opt com.docker.network.bridge.enable_ip_masquerade=true --opt com.docker.network.bridge.enable_icc=false --opt com.docker.network.bridge.name=docker_gwbridge docker_gwbridge