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

用 Docker 部署私有镜像太复杂了,大家看看怎么简化这个流程

  •  1
     
  •   daijinming · 2019-03-06 16:54:46 +08:00 · 10251 次点击
    这是一个创建于 2092 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Markdown 修改一段代码到部署到服务器上,需要 5 步走( 1、编写代码 2、制作镜像 3、推送镜像到私有镜像库 4、更新本地镜像 5、重启容器 ),是不是有点太麻烦量?我在考虑怎么简化,需要开发自动化部署工具?,或有没有现成的方式?

    57 条回复    2020-08-11 08:48:45 +08:00
    liubin
        1
    liubin  
       2019-03-06 16:58:16 +08:00
    一般是这么做吧:

    1. 本地提交代码,push 到 git server (手动)
    2. CI 服务制作镜像,推送到 registry (自动)
    3. 本地开发环境更新(手动)

    3. 可以写成一个 shell 脚本就行了吧。
    liubin
        2
    liubin  
       2019-03-06 16:59:33 +08:00
    另外看到你的图右边是生产环境,这样的话也可以把更新服务器放到 CI 服务器中去做。一般用 jenkins 之类的。
    klgd
        3
    klgd  
       2019-03-06 16:59:44 +08:00
    有实力的话就上自动化部署吧 比如 gitlab 就自带镜像库和 CI,不过我没实战过
    lfzyx
        4
    lfzyx  
       2019-03-06 17:02:49 +08:00
    你们公司没有 devops 运维吗?
    daijinming
        5
    daijinming  
    OP
       2019-03-06 17:03:56 +08:00
    @liubin 我是考虑脱离 Git 来做这个事情
    daijinming
        6
    daijinming  
    OP
       2019-03-06 17:04:19 +08:00
    @lfzyx 还没有
    darrenfang
        7
    darrenfang  
       2019-03-06 17:09:15 +08:00 via iPhone
    阿里云和腾讯云都用过,代码在 GitHub 上,用 CI 将镜像 push 到阿里云 /腾讯云的私有镜像,阿里云手动 pull 镜像更新,腾讯云部署了 k8s 集群,可以自动更新。

    不过,CI push 镜像到阿里云 /腾讯云很慢...
    CivAx
        8
    CivAx  
       2019-03-06 17:10:39 +08:00   ❤️ 1
    自动构建代码与打包镜像势必要用到 jenkins,要做到提交代码自动构建势必要用到 git 的 webhook 或类似功能

    你不可能空手锤钉子还想要效率,不现实。
    lfzyx
        9
    lfzyx  
       2019-03-06 17:11:52 +08:00
    @daijinming 看来你是要全栈的节奏
    daijinming
        10
    daijinming  
    OP
       2019-03-06 17:12:57 +08:00
    @darrenfang 朋友,我对 CI 这个概念没有真实的体会,没有处理过,需要操作那些才能做到 CI,CI 是 Github 的一个功能吗
    daijinming
        11
    daijinming  
    OP
       2019-03-06 17:14:31 +08:00
    @lfzyx 俺还在尝试阶段
    kqz901002
        12
    kqz901002  
       2019-03-06 17:15:55 +08:00
    @daijinming #10 CI 是持续集成,目前开源解决方案有 gitlab 和 jenkins 等,还有其他商用方案,目前比较成熟的是 jenkins,使用 jenkins 可以根据 gitlab webhook 自动打包 docker、maven、apk 等。
    tomczhen
        13
    tomczhen  
       2019-03-06 17:16:07 +08:00 via Android
    jetbrain 家的 IDE 有 docker 插件,也许能直接达到你的目的,没有用 jetbrain 的话可以了解一下 docker-machine。

    剩下的事就是写个本地 hook 脚本。
    sep1025
        14
    sep1025  
       2019-03-06 17:16:13 +08:00
    我司
    1.写代码
    2.代码更新到线上的存储
    3.重启线上的 DOCKER,应用更新. (DOCKER 也挂载了存储)
    zibber
        15
    zibber  
       2019-03-06 17:17:04 +08:00
    jenkins+playbook
    daijinming
        16
    daijinming  
    OP
       2019-03-06 17:17:15 +08:00
    @CivAx webhook 我大概能理解,应该是个推送开关,也就是说我的架构图中欠缺一个 jenkins,就齐活了吗
    cloudbeyond
        17
    cloudbeyond  
       2019-03-06 17:18:10 +08:00
    @daijinming #16 你就缺个 jenkins ,devops 工具链学习一下吧~
    daijinming
        18
    daijinming  
    OP
       2019-03-06 17:20:23 +08:00
    @sep1025 这个套路我之前也用过,你们公司应该是互联网公司吧,不是那种面向项目开发的,客户多,代码项目分散的感觉不太使用,你看那
    defunct9
        19
    defunct9  
       2019-03-06 17:22:19 +08:00
    开 ssh,让我装 jenkins,脚本就得你自己来写了,推荐 shell。通用。
    daijinming
        20
    daijinming  
    OP
       2019-03-06 17:22:29 +08:00
    @cloudbeyond 如果我这里有很多台服务器,当然每个服务器都是独立的,你觉得这个 jenkins 也能胜任吗
    darrenfang
        21
    darrenfang  
       2019-03-06 17:22:51 +08:00
    @daijinming CI 可以完成你操作步骤中的 2、3 ( 4、5 应该也可以,没尝试过)。

    GitHub CI 可以选择 travis / circleci,推荐 circleci,可以添加私有项目,每月 1000 分钟免费构建时间。

    本地 git 服务器可以使用 jenkins。
    CivAx
        22
    CivAx  
       2019-03-06 17:31:02 +08:00   ❤️ 10
    通常情况是这样:
    代码提交到 Git

    Git 在相关项目的 Integrations 中设置 Webhook ( URL 从 Jenkins 获取

    Jenkins 根据 Git 触发的 Webhook 进行自动构建代码并打成镜像

    Jenkins 执行对应 shell 命令(通常是 docker push

    Jenkins ssh 到目标服务器,执行 docker run 完成更新

    这是一套完整的基于容器服务的 CI/CD 流程
    godjob
        23
    godjob  
       2019-03-06 17:32:03 +08:00
    docker 开启 tcp 远程控制,直接远程在部署服务器上构建镜像和启动
    daijinming
        24
    daijinming  
    OP
       2019-03-06 17:35:10 +08:00
    @CivAx 行家一出手就知有没有
    daijinming
        25
    daijinming  
    OP
       2019-03-06 17:35:38 +08:00
    @godjob 有点 hack
    vissssa
        26
    vissssa  
       2019-03-06 17:49:45 +08:00
    gitlabci runner
    编译镜像就在 docker 中进行
    更新镜像就在本地 runner 进行,打一个 tags 即可
    memorycancel
        27
    memorycancel  
       2019-03-06 18:08:18 +08:00
    这个工具挺好用,https://github.com/joewalnes/websocketd,直接在远程执行 shell 脚本,在浏览器可以看见输出。
    xlui
        28
    xlui  
       2019-03-06 18:19:12 +08:00 via iPhone
    @CivAx
    @daijinming
    现在 GitHub actions 就可以完成前几步了:

    push 到 GitHub ;
    GitHub Actions 自动触发,执行自己定义的测试、构建、发布等;
    GitHub Actions 触发 webhook,Jenkins 执行后续部署。

    不过 Actions 还在 beta 测试阶段,可以看 https://xlui.me/t/github-actions-beta
    k9990009
        29
    k9990009  
       2019-03-06 19:36:13 +08:00 via Android
    用 jenkines 就行啦,gitlab 拉代码打包,maven 有 docker 插件,打包的时候可以触发制作镜像上传 habor,再写个部署脚本,更新镜像,重启。
    eloah
        30
    eloah  
       2019-03-06 19:38:59 +08:00 via Android
    问题是,这有什么复杂的
    SorcererXW
        31
    SorcererXW  
       2019-03-06 20:16:46 +08:00
    在 CI 上 build 镜像,推到 Registy,然后 SSH 到服务器上执行服务器的部署脚本
    服务器上的部署脚本差不多就是停掉现有的容器,拉取 latest 镜像,然后重启部署
    6diyipi
        32
    6diyipi  
       2019-03-06 21:19:40 +08:00
    gitlab ci
    gowinder
        33
    gowinder  
       2019-03-06 21:42:39 +08:00
    然而并不复杂啊。
    metrue
        34
    metrue  
       2019-03-06 21:52:30 +08:00
    @godjob 有 hijacked 风险。
    rayingecho
        35
    rayingecho  
       2019-03-06 22:24:19 +08:00
    都 2019 年了... 也该上 k8s 或者 OpenShift 了
    myljs
        36
    myljs  
       2019-03-06 22:48:03 +08:00
    [drone]( https://github.com/drone/drone) 用来做 CD 更好用更简单,因为本身就是 Docker based,但实际打包对机器性能有要求,0.5 内存的基本会构建内存不够用卡死了。此外阿里云的私有 Docker Registry 免费速度又快,免去自己搭建和管理服务了。
    hilbertz
        37
    hilbertz  
       2019-03-06 22:52:01 +08:00
    所以 serverless 会是以后的主流
    mattx
        38
    mattx  
       2019-03-07 00:45:20 +08:00
    把代码分开管理, 用卷挂载到 docker 里面, 就不要每次重新部署了
    zjb861107
        39
    zjb861107  
       2019-03-07 02:07:39 +08:00
    如果是单机部署,docker-compose + docker machine 也可以的,也就是说开发过程直接在服务器上构建镜像~
    theks
        40
    theks  
       2019-03-07 03:43:58 +08:00 via iPhone
    如果只是拉代码部署更新,就不需要自己写 shell 脚本了吧,给镜像添加配置文件可以解决不少问题
    4linuxfun
        41
    4linuxfun  
       2019-03-07 08:17:33 +08:00
    写 compose 啊
    ipeony
        42
    ipeony  
       2019-03-07 08:42:13 +08:00

    假设 Jenkins 主要用来打包,打包通过 Docker 的 multistage-build 替代,就不依赖 Jenkins 了,仅供参考。
    Dockerfile 示例:
    https://gist.github.com/dongfg/aedd3eacd33094bc594786800c99da53
    d5
        43
    d5  
       2019-03-07 08:51:14 +08:00 via iPhone
    daocloud 没烦恼
    kinderlas
        44
    kinderlas  
       2019-03-07 10:32:55 +08:00
    domeos 挺好用的
    gz911122
        45
    gz911122  
       2019-03-07 10:43:06 +08:00
    @daijinming Java 的话可以看下谷歌的 jib
    zeromake
        46
    zeromake  
       2019-03-07 11:12:35 +08:00
    @rayingecho #35 看了一会没有看懂打包镜像推送私有镜像和 k8s 有啥关系
    donnior
        47
    donnior  
       2019-03-07 11:24:51 +08:00
    自己的项目一个原则是能花钱的就不自己动手 ^_^, 所以我们用的 bitbucket 的 pipeline

    1. 开发人员推送分支到 bitbucket
    2. bitbucket 执行对应分支的 pipeline,构建 docker 镜像(用 tag 区分分支),上传到 docker hub (私有的)
    3. docker compose 自动更新对应 dev,test,prod 的镜像

    全程开发人员只需要推送代码;目前正在准备上 k8s
    ospider
        48
    ospider  
       2019-03-07 11:36:48 +08:00
    上 k8s 吧
    jerray
        49
    jerray  
       2019-03-07 12:35:42 +08:00
    推荐上一套 CI/CD,可以考虑用 drone ( drone.io ) —— docker 部署,CI 流程的每一步都是调用 docker 镜像执行,扩展非常方便,运维成本低,能很好地和 GitHub、GitLab、Bitbucket 集成。

    图里的这几步除了编写代码,其他都可以自动执行。但是考虑到生产环境的问题,最后一步上线也可以配置成手动——执行完前面所有步骤包括更新线上镜像,最后用一条命令确认执行预先定义好的上线流程。
    jakehu
        50
    jakehu  
       2019-03-07 15:22:44 +08:00
    本地->push(gitlab)->gitlab ci(gitlab runner)->docker push(registry Harbor)->K8s(pull)

    最后在 gitlab ci 里面调用 K8s api 自动打包->自动更新
    joesonw
        51
    joesonw  
       2019-03-07 17:32:12 +08:00
    真实案例:

    本地 -> gitlab MR -> gitlab CI -> commit hash 作为镜像版本号推送到叮叮 -> 通过 helm 更新 devtest 的 k8s, 验证 -> Merge 进 master -> gitlab CI -> commit hash 作为镜像版本号推送到叮叮 -> 通过 helm 更新 staging 的 k8s -> 打 tag 发版本 -> gitlab CI -> commit hash 作为镜像版本号推送到叮叮 -> 通过 helm 更新 prod 的 k8s
    kelvinblood
        52
    kelvinblood  
       2019-03-07 18:41:28 +08:00 via iPad
    有现成的方案,Jenkins。
    wmhx
        53
    wmhx  
       2019-03-07 18:52:26 +08:00
    Java 的话可以看下谷歌的 jib
    szkoda
        54
    szkoda  
       2019-03-07 19:45:06 +08:00
    上 k8s 吧
    windgreen
        55
    windgreen  
       2019-03-07 19:50:14 +08:00
    提交代码是手动的,后面构建镜像是自动的,部署可手动可自动
    enrolls
        56
    enrolls  
       2019-03-08 01:16:07 +08:00
    godjob 的思路,+1。[docker-py]( https://docker-py.readthedocs.io/en/stable/ ) 了解一下。或者你把代码写完了,fabric 跑 2-5 环节可以鸭。
    vampire2kk
        57
    vampire2kk  
       2020-08-11 08:48:45 +08:00
    @joesonw hello joesonw,想问下你们通过 helm 更新 k8s 时,用的 kube_token 是怎么获取的?方便的话可以私下请教么?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5491 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:04 · PVG 16:04 · LAX 00:04 · JFK 03:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.