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

万物皆 docker 部署,真的有必要吗?

  •  
  •   imes · 11 天前 · 4009 次点击
    • 为了开发/测试一致性,使用 Docker 安装 MySQL 、Nginx ,是正常的。
    • 系统庞杂、繁琐,不容易部署,用 docker 是高效、稳定的。

    openlist这类无依赖的单文件程序,用docker部署是为了什么?不应该遵循 FHS 规范,安装到/opt/openlist并使用systemd管理吗?

    但是我在实际接触中发现,为了MySQL/Nginx性能,实际上docker部署的没几个,反而openlist这种web应用大多是docker部署。

    48 条回复    2025-08-24 19:38:27 +08:00
    zhangfeiwudi
        1
    zhangfeiwudi  
       11 天前
    方便统一迁移,标准化 , 标准化很重要,不管你是什么 openlist 还上 closelist 都是一个 dockerfile 的事儿, 方便快速 扩容大批量的 pod 和迁移整体集群
    totoro625
        2
    totoro625  
       11 天前   ❤️ 7
    docker 用户不在意性能损失,在意的是灵活部署,一键使用,删除方便,环境隔离
    简单的比喻就是,iOS 安装软件删除就全没了(此处不谈钥匙串),安卓安装软件删除还残留一些配置

    nginx 为例:
    在意性能肯定直接安装
    但是安装完在/etc/nginx 目录下一堆配置,不小心改错配置,卸载重装后问题还在,docker 安装则没有问题
    andyskaura
        3
    andyskaura  
       11 天前
    这就和豆腐脑应该是咸的还是甜的一样。数据库可以 docker 部署吗?
    duanxianze
        4
    duanxianze  
       11 天前
    分情况,假如是 saas 的应用,客户的服务器,系统什么的并不统一,用 docker 自然好,又或者分布式快速扩容,用 docker 也挺好,不能一概而论
    peteretep
        5
    peteretep  
       11 天前
    docker 标准化后,可以使用 docker-compose 或者 k8s ,进行更同意快捷的管理
    单服务安装就没有更进一步的手段了

    在业务部署数量随时间膨胀的的情况下,选一个长久的方案是合理的

    如果是小玩具服务无所谓
    wangxiang
        6
    wangxiang  
       11 天前   ❤️ 4
    装完就觉得系统不干净了,只能重装系统
    superrichman
        7
    superrichman  
       11 天前   ❤️ 2
    你以为是单文件,其实还是用到了系统的 so 文件的。

    ldd ./openlist
    linux-vdso.so.1 (0x00007f9c78298000)
    libresolv.so.2 => /usr/lib/libresolv.so.2 (0x00007f9c7824e000)
    libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f9c78249000)
    libdl.so.2 => /usr/lib/libdl.so.2 (0x00007f9c78244000)
    libc.so.6 => /usr/lib/libc.so.6 (0x00007f9c78000000)
    /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f9c7829a000)

    最经典比如 gilbc 的版本问题,这个是报错最多的。你不知道用户会在什么环境里用,有的版本高了,有的版本低了都不行,直接无法启动。

    docker 用来保证所有用户都在一个环境里运行,软件依赖版本都一致。
    NightFlame
        8
    NightFlame  
       11 天前
    @andyskaura 可以的
    imes
        9
    imes  
    OP
       11 天前
    @andyskaura 3#
    打~起~来~了~
    imes
        10
    imes  
    OP
       11 天前
    @superrichman 7#
    openlist 有 musl 版本,兼容性问题倒是不大。
    pdone
        11
    pdone  
       10 天前
    docker 迁移特方便 持久卷 + compose.yml 复制走 随便找个架构相同的机器就又跑起来了 喜欢折腾 nas 的朋友太喜欢了
    wunonglin
        12
    wunonglin  
    PRO
       10 天前
    容器化的好处太多了,真要性能不好加机子就行了
    wunonglin
        13
    wunonglin  
    PRO
       10 天前
    之前都有个 macos 的 docker 镜像可以跑。是真的 Mac OS 。

    好像也有 Windows 的
    chanChristin
        14
    chanChristin  
    PRO
       10 天前
    因为 docker 一个配置文件就能跑起来了,我要换一台机器的话把配置文件移过去就可以了
    但是其他的安装不行,一会配置这个地方,一会配置另一个地方,而且搞错了还不知道怎么回退,我不太了解 Linux 系统,这种对我来说是最方便的
    Dorathea
        15
    Dorathea  
       10 天前
    @andyskaura
    当然可以, 把数据和配置目录映射到主机上就行
    defunct9
        16
    defunct9  
       10 天前
    完全没必要
    Reficul
        17
    Reficul  
       10 天前
    > 但是我在实际接触中发现,为了 MySQL/Nginx 性能,实际上 docker 部署的没几个。

    首先这个前提就不成立,MySQL / Nginx 跑容器里的海了去了。 其次为什么有性能问题,有多少损失?
    NoobNoob030
        18
    NoobNoob030  
       10 天前
    喜欢简单一把梭,全部都用 docker 减少心智负担
    evill
        19
    evill  
       10 天前
    额,不懂为什么会有觉得 docker 会丢失性能,以及不能部署数据库
    docker 只是把 namespace 和 cgroup 集合起来对外提供统一功能而已,实际上还是 container

    在部署层面上 docker 与 systemd 、pm2 甚至 nohup 并没有区别,只是托管进程
    oneisall8955
        20
    oneisall8955  
    PRO
       10 天前
    统一规范 个人部署 尽量 all in docker ,portainer 等面板上去拉镜像就运行起来了,持久化只需要挂在
    不用 ssh 上去编写 systemd service ,不用 apt install ,不用编译。。。
    imes
        21
    imes  
    OP
       10 天前
    @evill 19#
    I/O 啊,docker 用的 overlay2 、aufs 等,再加上虚拟网络,负载一高就撑不住了。虽然可以 --volume 挂载到宿主机目录以及 --network host 共享宿主机网络栈,但也治标不治本。比如 json-file 日志 在 overlay2 层写入放大,10%的损失是很正常的。
    imes
        22
    imes  
    OP
       10 天前
    @Reficul 17#
    受限于文件系统和虚拟网络,10%的性能损失是很常见的,要是没有配置好,30%也不是不可能。
    jonsmith
        23
    jonsmith  
       10 天前 via Android
    all in docker 省事,配合 docker compose 部署、备份迁移都方便。
    evill
        24
    evill  
       10 天前
    额,公司大规模情况下,怎么会这么裸奔呢?

    网络不是应该结合 LB 等,做成 overlay 形成一个服务网络
    日志都是直接放主机? 难道不是直接收集走
    RanKaede
        25
    RanKaede  
       10 天前
    方便,直接装系统里就觉得不干净了,尤其是卸载后感觉会有各种不知道的配置项残留
    evill
        26
    evill  
       10 天前
    @imes 而且我真的不认为“负载一高就撑不住了”
    我所在公司,大几十万的日活,大概 400 多台虚拟机,all docker 并没有负载高就撑不住的情况
    Reficul
        27
    Reficul  
       10 天前
    @imes

    你这么说,说明你没测过。
    zhhqiang
        28
    zhhqiang  
       10 天前
    docker 服务起多了,小水管顶不住。
    gzldc
        29
    gzldc  
       10 天前
    @andyskaura 豆腐脑我喝咸的
    fuzzsh
        30
    fuzzsh  
       10 天前 via Android
    @evill docker 的 container 正是使用虚拟化…… guest 对比 host 必然是有性能损失……
    当然现在大多数商用服务撑不住就升配,没什么好对比
    fuzzsh
        31
    fuzzsh  
       10 天前 via Android
    OP 用开源项目比较并不恰当,因为你不能预测什么时候会来个牛鬼蛇神开个 issue 骂你,即使做个一键安装也要侍候好某些还在坚持用 10 年前的“稳定”Linux 发行版的牛鬼蛇神

    企业大概前后端分离+微服务架构,业务方向调整也快,上线可能隔 3/5 月就砍了,安装/扩容拉起容器就完事,也不用花时间开单等运维调试上线
    oneisall8955
        32
    oneisall8955  
    PRO
       10 天前
    @zhhqiang 小鸡内存不够吧
    evill
        33
    evill  
       10 天前
    @fuzzsh 额,docker 和虚化有什么关系呢?

    docker 是共享宿主机内核,只有用户空间隔离。唯一的虚化是 OS-level ,但这也是一个隔离而已

    这里虚拟机没有关系,也没有什么 guest ,这些都是虚拟机的概念
    Tink
        34
    Tink  
    PRO
       10 天前
    主要是小白多,docker 一行命令就行了,不用去靠谱什么配置文件参数等等一堆东西
    Tink
        35
    Tink  
    PRO
       10 天前
    靠谱 -> 考虑
    goodryb
        36
    goodryb  
       10 天前
    记得最早推 docker 的一大优势,就是屏蔽底层操作系统,解决各种依赖问题
    性能我觉得肯定是有损失的,但是损失多少,能否接受是另外一回事情
    COW
        37
    COW  
       10 天前
    @imes 如果不考虑其他因素,只说单机 Docker ,挂载本地磁盘的性能和裸机差距非常小。
    shenlanAZ
        38
    shenlanAZ  
       10 天前
    #10 不是所有系统都用 systemd 的,也不是所有程序都老老实实的往某个目录下写 data 。

    容器化就能很好的屏蔽这些差异( not only Docker ),并且预期可控。
    phrack
        39
    phrack  
       10 天前
    docker 方便啊,完全不用操心依赖,本地的 docker 能跑,远程但凡有个 docker 都能跑
    hwdq0012
        40
    hwdq0012  
       10 天前
    windows 也在 推 winRT 隔离 烦死了,我就想生成绿色软件包
    twl007
        41
    twl007  
       10 天前 via iPhone
    维护一个 systemd 的配置已经是一个比写 Dockerfile 心智负担大得多的东西了

    还没提你要维护管理包构建/发布/安装/更新

    与之相配套的还得有 Ansible/Chief/Puppet

    说真的我不知道哪里简单
    FrankAdler
        42
    FrankAdler  
       10 天前 via Android
    我觉得做大的好处就是,不会一堆小白问你安装失败的问题了,dockerfile 写的足够好,一键执行一定成功
    当然为了性能和空间我自己会找二进制文件甚至从 image 里扣出来直接运行
    kingcanfish
        43
    kingcanfish  
       10 天前
    就按你的理论 “会损失 10%的性能” 和 早 10 分钟下班
    ---
    我选择早十分钟下班
    bao3
        44
    bao3  
       10 天前
    docker 并没有多少性能损失,它又不是虚拟机,它只是容器而已。
    用 docker 的人不会在意它在内核上的性能损失,因为微乎其微,你要是在意这个,那你别用就行了。
所以对你来说,并没有选择难题。
    BenHunDun
        45
    BenHunDun  
       10 天前
    感觉除非性能敏感和自身资源受限的情况. docker 应该是最方便的. 特别像个人使用的一些服务, 常常都不会有这些限制.

    原先写一些关于中间件 zk, kafka 的代码, 中间件都是宿主机启动, 现在没有特殊的都会优先考虑 docker. 包括一些集群启动什么的也方便.

    然后还有一些尝鲜式的有 docker 先起来看看感觉怎么样.
    momo2789
        46
    momo2789  
       10 天前
    😓为什么还有人说 docker 会有性能损失,是没看过 docker 的实现是吧。
    Docker 是基于 namespace + cgroups ,本质还是宿主机内核,所以 CPU 和内存开销几乎可以忽略。非要扣性能就挂 docker volume 网络走 host 。
    cwcc
        47
    cwcc  
       10 天前
    容器如果用作隔离环境我是赞成的,比虚拟机轻量,同时也好操作。

    但如果用 docker 给依赖地狱遮羞,那我不赞成,这明明是妥协,如果能干净地处理依赖或者环境配置,那肯定不用 docker 更好。
    princeofwales
        48
    princeofwales  
       7 天前 via iPhone
    一个 docker 里只部署了一个 mysql 容器,是个内网应用部署好之后 3 年不需要改动一次的那种,硬要放到容器里把各个目录和端口映射出来使用,我只能说闲得蛋疼,把软件供应商 k 了一顿
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5939 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:17 · PVG 14:17 · LAX 23:17 · JFK 02:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.