用 Docker 部署私有镜像太复杂了,大家看看怎么简化这个流程 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
daijinming
V2EX    程序员

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

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

    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 脚本,在浏览器可以看见输出。
    akiakiseofficial
        28
    akiakiseofficial  
       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-ctions-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 里面, 就不要每次重新部署了
    edsion996
        39
    edsion996  
       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
    4BVL25L90W260T9U
        48
    4BVL25L90W260T9U  
       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     Solana     4314 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 04:04 PVG 12:04 LAX 20:04 JFK 23:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86