docker swarm 部署踩坑

233 阅读2分钟

 1、.env 的文件,不会自动加载,要写入环境变量。

vim ~/.bashrc

末尾加上,加载 .env 文件中的环境变量


vim ~/.bashrc

# 末尾加上,加载 .env 文件中的环境变量
if [ -f /home/bewtr/.env ]; then
    export $(cat /home/bewtr/.env | xargs)
fi
#重启生效
source ~/.bashrc

2、网络通讯的问题。

正常是 serviceA、serviceB注册到 nacos,gate-way 再从 nacos 获取服务轮询访问。

但遇到 service A 注册到nacos的服务IP不能访问,验证时进入 gate-way容器内去尝试访问,ip Ping的通,但端口没有开放。

通过 docker inspect net 查看网络,serviceA显示的ip,这个在 gate-way中是可以使用的。

解决方案:

注册指定的发现,设定指定网卡: 

注册指定的发现,设定指定网卡:
SPRING_CLOUD_NACOS_DISCOVERY_NETWORK_INTERFACE: eth0

这个可以获取到和 docker inspect的一样的IP。

2、使用docker-swarm的服务名,比如 admin-system
指定注册IP名称为这个,这样swarm内部DNS会自动解析。

3、更新服务方式

docker service update bewtr_admin-system --force

重要的是:--force,强制更新。

4、镜像不会自动拉取,需要提前手动更新。

docker pull 的方式

5、资源类

由于docker stack rm bewtr 删除的方式,会一起都删除。

像redis emqx 类型,部署完成不会动的情况下,就很容易被误操作,而且emqx中的有的删除重启会都是部分的配置,所以建议独立部署。

service 服务类型的使用 swarm集群的管理

6、部署服务健康检查

示例,health 注意保证服务启动完整,否则这里就会服务一直重启,可以考虑把这个时间拉长。

7、部署服务的更新配置

关注底下的参数,

stop_grace_period 是为了服务,停止了,还能正常处理 gate-way或是其他集群由于缓存,依旧路由过来的信息。一般gate-way获取nacos的心跳是 5 s。

parallelism 设置每次更新 1 个服务,保证期间有正常可用的服务

delay 设置是为了服务保证真的启动了,这个时间依赖服务启动时间

其他的参数参考即可。

    stop_grace_period: 100s 
    deploy:  
      replicas: 2  # 部署 1 个副本
      update_config:
        parallelism: 1  # 每次更新 1 个副本
        delay: 100s  # 每次更新间隔 100 秒
        order: start-first  # 先启动新容器,再停止旧容器
        failure_action: rollback
      rollback_config:
        parallelism: 1  # 回滚时每次处理 1 个副本
        delay: 100s  # 回滚时每次间隔 10 秒
        order: stop-first  # 回滚时先停止新容器,再启动旧容器