V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dunhanson
V2EX  ›  程序员

Docker 生产环境自动化部署的问题

  •  
  •   dunhanson · 2019-06-27 17:37:22 +08:00 · 7449 次点击
    这是一个创建于 1984 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前项目的修改很少,所以都是我用原始的手动部署方式

    • 手动 build 镜像
    • 手动 push 到 docker hub
    • 手动在 portainer 中 pull 最新的镜像(每个节点操作一遍)
    • 手动在 portainer 中更新 update services

    现在不想这么整了,感觉好累、好繁琐。。。

    docker hub 已经改成自建的私库了,也准备用 jenkins 自动化部署

    我现在的想法是这样的,不知道有没有问题?

    • 每个 services 创建一个 jenkins 项目
    • jenkins build 镜像推送到私库(一个当前的版本,一个 latest )
    • 然后连接 Master 通过免密钥登陆其它节点服务器( jenkins 脚本内容-1 )
    • 执行 docker pull xxx.xxxx.com/xxx:latest ( jenkins 脚本内容-2 )
    • 接着执行 docker service update xxx ( jenkins 脚本内容-3 )

    那么有问题如何回滚?

    第 1 条附言  ·  2019-06-27 19:20:26 +08:00
    pull 最新的镜像,只有我说的方式吗?
    42 条回复    2019-06-29 17:08:50 +08:00
    aoTao
        1
    aoTao  
       2019-06-27 18:28:13 +08:00
    制作镜像的时候,给镜像以版本信息(commitID 或者版本号)多打一个 tag,回滚的时候用指定版本的镜像启动容器是不是可以解决问题?不确定是不是你的场景~
    xzYao
        2
    xzYao  
       2019-06-27 18:34:09 +08:00
    回滚代码,打新镜像,推上去。。。
    wangkai123
        3
    wangkai123  
       2019-06-27 18:36:04 +08:00
    portainer 有 webhook
    rootww21
        4
    rootww21  
       2019-06-27 18:36:37 +08:00
    jenkins 参数化构建根据代码版本发布,回滚时只需要选择上一个正式版打包
    cwlmxwb
        5
    cwlmxwb  
       2019-06-27 18:39:17 +08:00 via iPhone
    华为云流水线了解下
    luozic
        6
    luozic  
       2019-06-27 18:44:32 +08:00 via iPhone
    Jenkins 各家大的 ci cd 平台都有打包 部署 k8s 集成一条龙
    dunhanson
        7
    dunhanson  
    OP
       2019-06-27 19:16:51 +08:00
    @aoTao 想了想好像确实可行
    dunhanson
        8
    dunhanson  
    OP
       2019-06-27 19:17:19 +08:00
    哈哈哈 准备不用 portainer 部署了
    dunhanson
        9
    dunhanson  
    OP
       2019-06-27 19:19:09 +08:00
    @rootww21 @luozic 搜嘎
    dunhanson
        10
    dunhanson  
    OP
       2019-06-27 19:19:46 +08:00
    pull 镜像难道就只有我说的那种方式?没有其它的了?
    miyuki
        11
    miyuki  
       2019-06-27 19:55:23 +08:00
    rancher 1.x
    Lpl
        12
    Lpl  
       2019-06-27 19:59:56 +08:00 via iPhone
    哪有直接 pull latest 的。大家都是更新一个服务,就给这个服务打个最新的标签。你 latest 回退都没办法搞
    Lpl
        13
    Lpl  
       2019-06-27 20:03:50 +08:00
    我给你出个最简单的解决方案,也不用上编排工具。

    1. 自建一个 registry
    2. Jenkins 做自动构建并 Push Image 到 Registry 中
    3. Jenkins 自动做远程更新。
    这样子就不需要手动了,只需要手动改下要发布版本的 tag 就可以了。
    ssoor
        14
    ssoor  
       2019-06-27 20:17:56 +08:00
    gitlab 有个全家桶,

    gitlab , gitlab-runner

    建议楼主可以了解一下 ,

    我们公司就是用 gitlab 全家桶 + k8s 做的自动部署.

    gitlab // 源代码管理
    gitlab regisry // gitlab 自带有私有仓库, 开启即可
    gitlab-runner // ci - 自动编译, 构建镜像, 更新 k8s
    k8s // 自动扩缩容, 灰度切换, 快速回退

    整个流程跑起来还是比较流畅的, 就是对 gitlab CD 这块接触不多, 直接使用 gitlab-runner 部署. 楼主的话, 可以只用全家桶, k8s 可以不上.

    CD 这方面目前在调研 CD 系统,目前考虑用 spinnaker 来做 CD 或者基于 k8s 的 CRD 做自研.主要对于 CD 来说 spinnaker 太重了.
    suom
        15
    suom  
       2019-06-28 00:10:09 +08:00
    k8s 3 台机器起步,保障高可用的话双集群也要 6 台机器,对小公司来说成本太高。

    楼主思路其实蛮实用的。
    其实回滚也好解决,需要回滚时,改 jenkins 的脚本指定一下镜像版本号就行。毕竟回滚这种事情不经常出现。
    AlloVince
        16
    AlloVince  
       2019-06-28 00:14:14 +08:00
    涉及到自动化部署了,上 k8s 是迟早的事,回滚就是一行命令。

    可以参考我关于持续集成的文章

    https://avnpc.com/pages/drone-gitflow-kubernetes-for-cloud-native-ci
    viewsonic
        17
    viewsonic  
       2019-06-28 00:58:48 +08:00
    @AlloVince 我看你工作经历不少啊, 为什么华尔街新闻关闭了?
    abcdocker
        18
    abcdocker  
       2019-06-28 01:22:22 +08:00
    不考虑试用一下 k8s 吗? 直接了解一下 k8s,prometheus 还有 grafana。 逼格多高,满足 spring cloud,我们公司的 zuul 和 eurek 就跑在 k8s 上。

    abcdocker 运维博客
    https://i4t.com/?

    我这整理的都是生产环境,像 kubeadm 完全学不到啥东西,出了问题没法解决
    viewsonic
        19
    viewsonic  
       2019-06-28 01:49:08 +08:00
    @abcdocker 你的博客我收藏了,特别是 docker,正在认真研究...
    xmlf
        20
    xmlf  
       2019-06-28 06:23:49 +08:00 via Android
    @abcdocker 老哥,你的博客用的什么主题?
    mritd
        21
    mritd  
       2019-06-28 07:26:33 +08:00 via iPhone
    GitLab CI + k8s + harbor + traefik = ok
    anubu
        22
    anubu  
       2019-06-28 08:21:38 +08:00
    流程是这样的没错,回滚就是使用镜像标签,回滚基本是秒级的。这是制品回滚相对于代码回滚的优势。
    关于 Jenkins 远程操作部署主机,你这里使用 SSH 也是可以的。实际上,更倾向于使用 docker 命令来操作远程 docker 主机,加上双向 TLS 验证,还是比较安全的。
    上面说 k8s 的比较多,在这里应该不是重点,实际上把整个流程走通后,从部署到 docker 改为 k8s 也就是在 Jenkinsfile 里面把 docker 操作替换为 kubectl 操作就可以了。
    jss
        23
    jss  
       2019-06-28 08:28:56 +08:00 via iPhone
    新手:我每天都手动操作这一切,你们说的自动化部署,看的我一脸懵逼…
    airfling
        24
    airfling  
       2019-06-28 08:32:24 +08:00
    三四年前用 daocloud 的时候,那时候是用 jenkins 构建镜像到他们的服务器,他们有个界面可以方便配置和回滚,docker 相关操作的代码 github 上都有,你可以自己写一个
    artandlol
        25
    artandlol  
       2019-06-28 08:49:06 +08:00 via Android
    @cwlmxwb 这个去年才推出的吧。。
    wxb2dyj
        26
    wxb2dyj  
       2019-06-28 09:09:06 +08:00
    新手,最近也在折腾这个问题。参考的这篇博客 https://blog.51cto.com/ganbing/2085769,但没有走通。参看这两篇博客 http://www.debugger.wiki/article/html/1559455233686297 和 https://blog.csdn.net/weinichendian/article/details/81047778,只走通了 Github 的 public 类型项目,private 的也实现自动构建了,但还没有构建成功。
    akinoniku
        27
    akinoniku  
       2019-06-28 09:17:13 +08:00
    一步到位,GitOps 了解一下
    dunhanson
        28
    dunhanson  
    OP
       2019-06-28 10:00:21 +08:00
    @Lpl 你说的自动方式我也说了,不是特别明白的你意思
    dunhanson
        29
    dunhanson  
    OP
       2019-06-28 10:01:57 +08:00
    @ssoor 嗯 gitlab 确实需要去了解下,不过已经在学 K8S 了,只是还没厉害到生产环境使用的地步
    dunhanson
        30
    dunhanson  
    OP
       2019-06-28 10:02:20 +08:00
    @suom 以后会迁移 K8S 的
    dunhanson
        31
    dunhanson  
    OP
       2019-06-28 10:02:38 +08:00
    @AlloVince 正在学习 K8S
    dunhanson
        32
    dunhanson  
    OP
       2019-06-28 10:03:39 +08:00
    @abcdocker 正在学习 K8S
    dunhanson
        33
    dunhanson  
    OP
       2019-06-28 10:04:48 +08:00
    @anubu DOCKER 命令操作确实也是一个思路
    dunhanson
        34
    dunhanson  
    OP
       2019-06-28 10:05:52 +08:00
    @wxb2dyj 嗯嗯 可以参考一下的
    dunhanson
        35
    dunhanson  
    OP
       2019-06-28 10:06:50 +08:00
    @airfling 嗯嗯 了解的
    dunhanson
        36
    dunhanson  
    OP
       2019-06-28 10:07:12 +08:00
    @jss 哈哈哈 我也是新手
    bhaltair
        37
    bhaltair  
       2019-06-28 10:18:49 +08:00
    k8s ?
    abcdocker
        38
    abcdocker  
       2019-06-28 11:03:58 +08:00
    @viewsonic docker 没啥难的,lxc,cgroup。在会点命令就行了。
    abcdocker
        39
    abcdocker  
       2019-06-28 11:04:33 +08:00
    @xmlf 收费的主题,之前用过知更鸟的。发现大家都用,就改成一个收费正版主题了。
    abcdocker
        40
    abcdocker  
       2019-06-28 11:05:27 +08:00
    @jss 手动不累吗? jenkins 写脚本都比手动轻松,上线点一下,接着看皮皮虾,回滚点一下,继续看皮皮虾
    fivesmallq
        41
    fivesmallq  
       2019-06-28 14:35:41 +08:00
    我们目前就是通过 jenkins 执行的脚本

    ```
    def switchContainer(String server, String project) {
    sh "ssh ${server} mkdir -p /apps/${project}"
    sh "scp docker-compose.yml ${server}:/apps/${project}"
    sh "scp .env ${server}:/apps/${project}"
    sh "ssh ${server} docker network create --subnet=${env.docker_network_range} ${env.docker_network} || true"
    sh "ssh ${server} docker-compose -f /apps/${project}/docker-compose.yml pull"
    sh "ssh ${server} docker-compose -f /apps/${project}/docker-compose.yml down --remove-orphans -v"
    sh "ssh ${server} docker-compose -f /apps/${project}/docker-compose.yml up -d"
    sh "ssh ${server} docker image prune -f"
    }
    ```
    figael
        42
    figael  
       2019-06-29 17:08:50 +08:00
    1 )如果可以断线更新,直接用 docker-compose。
    2 )如果不能断线更新,在服务前加一层反向代理,如 nginx。在新版本实例就绪前,旧版本实例还可以继续对外服务。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2581 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:42 · PVG 18:42 · LAX 02:42 · JFK 05:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.