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

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

  •  
  •   dunhanson · 81 天前 · 3596 次点击
    这是一个创建于 81 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    1. 自建一个 registry
    2. Jenkins 做自动构建并 Push Image 到 Registry 中
    3. Jenkins 自动做远程更新。
    这样子就不需要手动了,只需要手动改下要发布版本的 tag 就可以了。
        14
    ssoor   81 天前
    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 太重了.
        15
    suom   81 天前
    k8s 3 台机器起步,保障高可用的话双集群也要 6 台机器,对小公司来说成本太高。

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

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

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

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

    我这整理的都是生产环境,像 kubeadm 完全学不到啥东西,出了问题没法解决
        19
    viewsonic   81 天前
    @abcdocker 你的博客我收藏了,特别是 docker,正在认真研究...
        20
    xmlf   81 天前 via Android
    @abcdocker 老哥,你的博客用的什么主题?
        21
    mritd   81 天前 via iPhone
    GitLab CI + k8s + harbor + traefik = ok
        22
    anubu   81 天前
    流程是这样的没错,回滚就是使用镜像标签,回滚基本是秒级的。这是制品回滚相对于代码回滚的优势。
    关于 Jenkins 远程操作部署主机,你这里使用 SSH 也是可以的。实际上,更倾向于使用 docker 命令来操作远程 docker 主机,加上双向 TLS 验证,还是比较安全的。
    上面说 k8s 的比较多,在这里应该不是重点,实际上把整个流程走通后,从部署到 docker 改为 k8s 也就是在 Jenkinsfile 里面把 docker 操作替换为 kubectl 操作就可以了。
        23
    jss   81 天前 via iPhone
    新手:我每天都手动操作这一切,你们说的自动化部署,看的我一脸懵逼…
        24
    airfling   81 天前
    三四年前用 daocloud 的时候,那时候是用 jenkins 构建镜像到他们的服务器,他们有个界面可以方便配置和回滚,docker 相关操作的代码 github 上都有,你可以自己写一个
        25
    artandlol   81 天前 via Android
    @cwlmxwb 这个去年才推出的吧。。
        26
    wxb2dyj   81 天前
    新手,最近也在折腾这个问题。参考的这篇博客 https://blog.51cto.com/ganbing/2085769,但没有走通。参看这两篇博客 http://www.debugger.wiki/article/html/1559455233686297 和 https://blog.csdn.net/weinichendian/article/details/81047778,只走通了 Github 的 public 类型项目,private 的也实现自动构建了,但还没有构建成功。
        27
    akinoniku   81 天前
    一步到位,GitOps 了解一下
        28
    dunhanson   81 天前
    @Lpl 你说的自动方式我也说了,不是特别明白的你意思
        29
    dunhanson   81 天前
    @ssoor 嗯 gitlab 确实需要去了解下,不过已经在学 K8S 了,只是还没厉害到生产环境使用的地步
        30
    dunhanson   81 天前
    @suom 以后会迁移 K8S 的
        31
    dunhanson   81 天前
    @AlloVince 正在学习 K8S
        32
    dunhanson   81 天前
    @abcdocker 正在学习 K8S
        33
    dunhanson   81 天前
    @anubu DOCKER 命令操作确实也是一个思路
        34
    dunhanson   81 天前
    @wxb2dyj 嗯嗯 可以参考一下的
        35
    dunhanson   81 天前
    @airfling 嗯嗯 了解的
        36
    dunhanson   81 天前
    @jss 哈哈哈 我也是新手
        37
    bhaltair   81 天前
    k8s ?
        38
    abcdocker   81 天前
    @viewsonic docker 没啥难的,lxc,cgroup。在会点命令就行了。
        39
    abcdocker   81 天前
    @xmlf 收费的主题,之前用过知更鸟的。发现大家都用,就改成一个收费正版主题了。
        40
    abcdocker   81 天前
    @jss 手动不累吗? jenkins 写脚本都比手动轻松,上线点一下,接着看皮皮虾,回滚点一下,继续看皮皮虾
        41
    fivesmallq   80 天前
    我们目前就是通过 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"
    }
    ```
        42
    figael   79 天前
    1 )如果可以断线更新,直接用 docker-compose。
    2 )如果不能断线更新,在服务前加一层反向代理,如 nginx。在新版本实例就绪前,旧版本实例还可以继续对外服务。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3312 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 30ms · UTC 04:37 · PVG 12:37 · LAX 21:37 · JFK 00:37
    ♥ Do have faith in what you're doing.