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

7. 重建 docker swarm

8. 启动 portainer

9. 重建config、重启程序

posted @ 2022-04-25 23:09  whyfate  阅读(546)  评论(0编辑  收藏  举报