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

创建运行应用的 doker 容器最佳方法

  •  1
     
  •   herozzm · 2022-09-13 19:33:17 +08:00 · 1709 次点击
    这是一个创建于 800 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如容器内运行 go 程序,运行 java 程序等

    我不太喜欢 Dockerfile ,都是自己下载最基础的镜像,然后进去容器里面弄好必要的环境重新打包成一个 image ,然后用过-v 方式加载宿主的应用程序并 run ,这种方式可以随时替换自己的应用。

    我看到网上的方式是将自己的应用打包进去容器里, 这样做每次更新应用就得重新打包,非常麻烦。

    大家来说说最佳的方式是什么?

    13 条回复    2022-09-13 22:25:45 +08:00
    herozzm
        1
    herozzm  
    OP
       2022-09-13 19:47:39 +08:00
    账户被降权了,现在发帖不置顶根本不会出现,哎,也不知道什么时候会恢复?
    Acoffice
        2
    Acoffice  
       2022-09-13 19:48:36 +08:00
    @herozzm #1 习惯就好
    herozzm
        3
    herozzm  
    OP
       2022-09-13 19:50:08 +08:00
    @Acoffice 还会出现
    距离创建上一个新主题还不到 2 小时,请稍等 6425 秒之后再试

    2014 的账户现在和新手账户一样
    boris93
        4
    boris93  
       2022-09-13 19:57:32 +08:00 via iPhone
    > 每次更新应用就得重新打包,非常麻烦

    搞个 CI/CD ,监听 repo ,master 有更新就自动编译、构建镜像,然后推送到仓库

    客户端起个 watchtower 容器,它监测到镜像有更新就会自动用新镜像重新启动新容器

    现在的做法听起来就像,通过替换 tomcat 里面的 class 来实现应用更新
    Rache1
        5
    Rache1  
       2022-09-13 19:58:56 +08:00   ❤️ 1
    应用打包到容器的,一般都是生产部署使用。开发使用直接挂载目录就好了,最佳方式仍然是 Dockerfile
    herozzm
        6
    herozzm  
    OP
       2022-09-13 20:04:27 +08:00
    @Rache1 生成部署也得更新应用版本啊,每次发送一个巨大的打包文件很夸张啊
    anubu
        7
    anubu  
       2022-09-13 20:06:19 +08:00
    你现在的方式大部分场景都不是一个好选择。
    应用分发的话,最佳应该还是 Dockerfile+CI 。
    生产部署更倾向于使用不可变镜像,状态数据尽量和环境无关,统一放在外部管理,如数据库、共享存储等,尽量做到计算和存储分离。
    可能也就本机临时起个测试环境用用吧,相对快捷一些。
    boris93
        8
    boris93  
       2022-09-13 20:07:41 +08:00 via iPhone
    @herozzm #6 企业里并不需要人工发送打包成果,打包的镜像会自动上传到私有仓库
    应用升级直接从私有库拉镜像
    killva4624
        9
    killva4624  
       2022-09-13 20:15:20 +08:00
    不知道是什么语言跑的程序。
    Dockerfile 有一些构建的技巧减少最终 build 的镜像,比如减少 Dockerfile 行数,Dockerfile 多重构建(只用第一次构建的制品)。
    以及按最常变化的放在 Dockerfile 最末行的顺序(比如 COPY 二进制),这样每次更新镜像的时候需要拉取的 layer 越少。
    ClericPy
        10
    ClericPy  
       2022-09-13 21:09:01 +08:00
    开发的时候确实 -i -t -v 就够了, 反正我 Python 都打包成一个带依赖的 zip 就可以运行, 没必要放进去, 上线时候再走 CI

    linux 上要是有个绿色版 Python 就好了, 公司非要用 conda 的, 结果 reuse_port 有 bug, 麻烦死了
    dcsuibian
        11
    dcsuibian  
       2022-09-13 21:17:47 +08:00
    开发环境和生产环境不一样吧。

    生产环境的话我肯定是 Dockerfile+编译好的程序拷贝进去。

    开发时个人偏向于直接在宿主机上弄环境,你要直接显示文件的变更的话,弄个 Dockerfile.dev ??
    ailer
        12
    ailer  
       2022-09-13 21:18:49 +08:00 via Android   ❤️ 1
    @herozzm 如果是 go 的话直接多重构建,最后 alpine 镜像里只有二进制文件和证书
    AoEiuV020CN
        13
    AoEiuV020CN  
       2022-09-13 22:25:45 +08:00 via Android
    > 也不知道什么时候会恢复?
    不会恢复的,注册小号或者离开,
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1141 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:34 · PVG 02:34 · LAX 10:34 · JFK 13:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.