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

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

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

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

    56 回复  |  直到 2019-03-08 01:16:07 +08:00
    liubin
        1
    liubin   323 天前
    一般是这么做吧:

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

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

    不过,CI push 镜像到阿里云 /腾讯云很慢...
    CivAx
        8
    CivAx   323 天前   ♥ 1
    自动构建代码与打包镜像势必要用到 jenkins,要做到提交代码自动构建势必要用到 git 的 webhook 或类似功能

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

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

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

    本地 git 服务器可以使用 jenkins。
    CivAx
        22
    CivAx   323 天前   ♥ 9
    通常情况是这样:
    代码提交到 Git

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

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

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

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

    这是一套完整的基于容器服务的 CI/CD 流程
    godjob
        23
    godjob   323 天前
    docker 开启 tcp 远程控制,直接远程在部署服务器上构建镜像和启动
    daijinming
        24
    daijinming   323 天前
    @CivAx 行家一出手就知有没有
    daijinming
        25
    daijinming   323 天前
    @godjob 有点 hack
    vissssa
        26
    vissssa   323 天前
    gitlabci runner
    编译镜像就在 docker 中进行
    更新镜像就在本地 runner 进行,打一个 tags 即可
    memorycancel
        27
    memorycancel   323 天前
    这个工具挺好用,https://github.com/joewalnes/websocketd,直接在远程执行 shell 脚本,在浏览器可以看见输出。
    xlui
        28
    xlui   323 天前 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   323 天前 via Android
    用 jenkines 就行啦,gitlab 拉代码打包,maven 有 docker 插件,打包的时候可以触发制作镜像上传 habor,再写个部署脚本,更新镜像,重启。
    eloah
        30
    eloah   323 天前 via Android
    问题是,这有什么复杂的
    SorcererXW
        31
    SorcererXW   323 天前
    在 CI 上 build 镜像,推到 Registy,然后 SSH 到服务器上执行服务器的部署脚本
    服务器上的部署脚本差不多就是停掉现有的容器,拉取 latest 镜像,然后重启部署
    6diyipi
        32
    6diyipi   323 天前
    gitlab ci
    gowinder
        33
    gowinder   323 天前
    然而并不复杂啊。
    metrue
        34
    metrue   323 天前
    @godjob 有 hijacked 风险。
    rayingecho
        35
    rayingecho   323 天前
    都 2019 年了... 也该上 k8s 或者 OpenShift 了
    myljs
        36
    myljs   323 天前
    [drone]( https://github.com/drone/drone) 用来做 CD 更好用更简单,因为本身就是 Docker based,但实际打包对机器性能有要求,0.5 内存的基本会构建内存不够用卡死了。此外阿里云的私有 Docker Registry 免费速度又快,免去自己搭建和管理服务了。
    hilbertz
        37
    hilbertz   323 天前
    所以 serverless 会是以后的主流
    mattx
        38
    mattx   323 天前
    把代码分开管理, 用卷挂载到 docker 里面, 就不要每次重新部署了
    zjb861107
        39
    zjb861107   323 天前
    如果是单机部署,docker-compose + docker machine 也可以的,也就是说开发过程直接在服务器上构建镜像~
    theks
        40
    theks   323 天前 via iPhone
    如果只是拉代码部署更新,就不需要自己写 shell 脚本了吧,给镜像添加配置文件可以解决不少问题
    4linuxfun
        41
    4linuxfun   322 天前
    写 compose 啊
    ipeony
        42
    ipeony   322 天前

    假设 Jenkins 主要用来打包,打包通过 Docker 的 multistage-build 替代,就不依赖 Jenkins 了,仅供参考。
    Dockerfile 示例:
    d5
        43
    d5   322 天前 via iPhone
    daocloud 没烦恼
    kinderlas
        44
    kinderlas   322 天前
    domeos 挺好用的
    gz911122
        45
    gz911122   322 天前
    @daijinming Java 的话可以看下谷歌的 jib
    zeromake
        46
    zeromake   322 天前
    @rayingecho #35 看了一会没有看懂打包镜像推送私有镜像和 k8s 有啥关系
    donnior
        47
    donnior   322 天前
    自己的项目一个原则是能花钱的就不自己动手 ^_^, 所以我们用的 bitbucket 的 pipeline

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

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

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

    最后在 gitlab ci 里面调用 K8s api 自动打包->自动更新
    joesonw
        51
    joesonw   322 天前
    真实案例:

    本地 -> 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   322 天前 via iPad
    有现成的方案,Jenkins。
    wmhx
        53
    wmhx   322 天前
    Java 的话可以看下谷歌的 jib
    szkoda
        54
    szkoda   322 天前
    上 k8s 吧
    windgreen
        55
    windgreen   322 天前
    提交代码是手动的,后面构建镜像是自动的,部署可手动可自动
    enrolls
        56
    enrolls   322 天前
    godjob 的思路,+1。[docker-py]( https://docker-py.readthedocs.io/en/stable/ ) 了解一下。或者你把代码写完了,fabric 跑 2-5 环节可以鸭。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   742 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 28ms · UTC 19:59 · PVG 03:59 · LAX 11:59 · JFK 14:59
    ♥ Do have faith in what you're doing.