V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ynohoahc
V2EX  ›  程序员

docker 对普通个人开发者的作用,求指点

  •  
  •   ynohoahc · 2019-05-17 10:15:38 +08:00 · 14766 次点击
    这是一个创建于 2048 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在学习 docker 但是越学越不清楚自己为什么要学 docker

    其中最大的疑惑是 服务器上用 docker 去部署项目真能节省很多资源吗? 比如说 用 docker 在机器上部署了几十个 api 服务 去对比 用传统的 tomcat 在本地部署几十个 api 服务

    因为每开一个容器都相当于多开了一个基础 linux 镜像, 然后再在这个基础镜像里跑 tomcat 服务

    基础镜像无论有多轻量 好歹也是一部分开销呢

    所以从直观感觉上还是觉得后者会省资源一点 但外界宣传就是说容器会更轻量 呃~~

    还有一个不小的疑惑就是, 对于普通个人开发者来说(我只想平日里没事接接外单, 挣点零花钱), 那么 docker 带来的好处是不是只有一个就是能统一开发环境呢?

    有实操的前辈们能讲讲吗?

    95 条回复    2019-05-18 19:42:55 +08:00
    momocraft
        1
    momocraft  
       2019-05-17 10:19:49 +08:00
    比 VM 轻量,比一个 JVM 进程跑所有 servlet 显然是重的
    qinyusen
        2
    qinyusen  
       2019-05-17 10:24:16 +08:00   ❤️ 12
    你用过一键脚本么?一键部署环境,最简单的,比如,你装 LAMP,1 个半小时够么?

    docker 的意义是,docker pull 一下就无障碍部署完毕了。

    另外,你有没有遇见过环境里即需要 python2 又需要 python 3 的?也就是运行环境依赖有冲突的时候。

    个人接单,你是喜欢跑人家服务器上叮咣手动装 2 天环境,还是直接 docker pull 一下,然后跑一个 docker run 的脚本,分分钟部署上比较好呢?也不用管宿主机到底是 centos 还是 debian。

    docker 之于我,就是再也不用维护多个 os 的一键脚本了,维护一个 dockerfile 就 OK 了。

    env independent, 你要先明白这个关键字的意义。
    Vegetable
        3
    Vegetable  
       2019-05-17 10:24:23 +08:00   ❤️ 1
    就说你外包吧
    从前是登录客户提供的机器自己配置环境,装依赖,跑项目,写 crontab,可能还有别的.
    这还是好的,起码让你连服务器.
    不让你连的话,你就得教别人用,当然不排除沟通很顺畅的情况,但是大部分是....你懂得

    如果用 docker 的话,在已经部署了 docker 的机器上会方便很多,可能能做到 git clone&docker-compose up 直接跑起来,哪怕对方是 Windows 系统.

    我觉得这就算是对个人开发者比较大的意义了.
    CallMeReznov
        4
    CallMeReznov  
       2019-05-17 10:24:47 +08:00   ❤️ 1
    你喜欢把鸡蛋都往一个篮子里装的话,就不要怕这一篮子的鸡蛋都被砸烂.
    ynohoahc
        5
    ynohoahc  
    OP
       2019-05-17 10:25:03 +08:00
    @momocraft 前辈其实我一直不明白为什么要拿容器和 vm 比呢 因为我理解的是容器就是在 vm 里跑的呀 如果是这样 那么现在的情况是 vm 跑容器 然后容器里面跑 tomcat 服务 传统的方式的 vm 里面直接跑 tomcat 服务
    zjsxwc
        6
    zjsxwc  
       2019-05-17 10:26:44 +08:00
    首先没有 docker 之前我们用 chroot,先了解下什么是 chroot
    ynohoahc
        7
    ynohoahc  
    OP
       2019-05-17 10:29:18 +08:00
    @qinyusen 谢谢指点 统一环境是 docker 的好处这我是知道 不过我可能还是低估了这一个好处
    lhx2008
        8
    lhx2008  
       2019-05-17 10:29:55 +08:00
    我觉得*个人、开发*是没啥用的,虽然可以拉镜像,但是配镜像的时间非常长,代码重新部署也要高度依赖脚本,给调试也带来很多困难。我觉得 Docker 最大的优势还是横向扩展吧。生产环境肯定还是有用的。
    ynohoahc
        9
    ynohoahc  
    OP
       2019-05-17 10:33:50 +08:00
    @Vegetable 其实我从来没有私活啦 所以对于 docker 的这个好处还不能切身体会到 现在我是开发环境用 brew 去安装环境 然后云主机上用传统的方式去安装环境 环境装好之后就没怎么变过了 都是在写一些业务代码
    ynohoahc
        10
    ynohoahc  
    OP
       2019-05-17 10:35:37 +08:00
    @lhx2008 对开发来说还是能统一环境的 但是对于不是经常搞环境的开发来说真的体会不到 目前来说我就是
    /(ㄒoㄒ)/~~
    GiantHard
        11
    GiantHard  
       2019-05-17 10:36:15 +08:00
    使用 VM 或者容器的一个目的在于隔离各个网站的运行环境,而容器在达成这一目的上所需要付出的系统资源是要小于 VM 的,所以说 docker 比较节省资源。
    noahzh
        12
    noahzh  
       2019-05-17 10:36:20 +08:00   ❤️ 3
    都是太片面理解了,举个简单例子,你能在同一台机器很容易同时部署各个版本的 jdk 嘛?就这一条就够用了.
    ynohoahc
        13
    ynohoahc  
    OP
       2019-05-17 10:36:32 +08:00
    @zjsxwc 呃... 我还真不知道什么是 chroot 现在就去查一下
    kevinhwang
        14
    kevinhwang  
       2019-05-17 10:37:17 +08:00 via Android
    只有我一个用 docker 跑 ss 和 frp 这些 daemon 吗?
    原因是好管理,多机可以方便配置。与宿主更多的隔离,重装系统压力小很多,尽量将 daemon docker 化,放到 gitbhub 管理,带有密钥的 ignore 就好。
    opengps
        15
    opengps  
       2019-05-17 10:37:22 +08:00 via Android
    打包环境以前的做法是:拷贝整个虚拟机!
    ynohoahc
        16
    ynohoahc  
    OP
       2019-05-17 10:37:53 +08:00
    @noahzh 言简意赅 精辟~👍
    ynohoahc
        17
    ynohoahc  
    OP
       2019-05-17 10:39:29 +08:00
    @opengps 哈哈哈 程序员史上还有这么一个简单粗暴的黑历史吗
    GiantHard
        18
    GiantHard  
       2019-05-17 10:39:48 +08:00
    @ynohoahc 如果你有 docker 的话,就不用在云主机上去安装环境了,你在开发时候顺手打包一个 docker 镜像,在云主机上只要无脑 docker pull 就好了
    fengbjhqs
        19
    fengbjhqs  
       2019-05-17 10:40:29 +08:00
    win 电脑,表示没有听过 docker
    ynohoahc
        20
    ynohoahc  
    OP
       2019-05-17 10:41:08 +08:00
    @kevinhwang 嗯 好专业~~老哥是运维吗?
    ynohoahc
        21
    ynohoahc  
    OP
       2019-05-17 10:42:43 +08:00
    @GiantHard 嗯这个的确是我学习 docker 的初衷
    kevinhwang
        22
    kevinhwang  
       2019-05-17 10:48:30 +08:00 via Android
    @ynohoahc 普通 Linux 使用者。
    boris1993
        23
    boris1993  
       2019-05-17 10:49:05 +08:00 via Android   ❤️ 1
    从用户角度谈一下

    Docker 对我来说最大的好处是,不会搞脏我本机的环境

    比如我要用个 PHP 的应用,brew install php 之后,它不仅会装 PHP,还会装一堆依赖,久而久之各种东西会越来越乱

    但是现在我只需要取个合适的 PHP 的镜像,把应用塞进去,就可以了,本机不会装任何其他的东西,嗯,干净
    d5
        24
    d5  
       2019-05-17 10:52:25 +08:00
    “.” Build, Ship, and Run Any App, Anywhere.
    whileFalse
        25
    whileFalse  
       2019-05-17 10:53:48 +08:00
    十年前我买域名买 vps 用一键脚本装 lamp,装代理。文档一大篇一大篇,装的时候如果网络报错,或者一不小心敲错命令,那就只能吧机器磁盘重置了,重来一遍。

    现在有了 Docker 体验是什么呢?搜索看看哪个镜像好用,然后 docker run -p 80:80 very-good-image 搞定。
    bjfane
        26
    bjfane  
       2019-05-17 10:58:43 +08:00
    每开一个容器都相当于多开了一个基础 linux 镜像 这个不对吧
    whusnoopy
        27
    whusnoopy  
       2019-05-17 10:59:11 +08:00
    docker 对个人而言的一个明显的好处是可以相对于传统虚拟机做相对轻量的环境隔离

    比如你有好几个项目,有一个依赖最新的 python 3.7.0,另一个年久失修只能跑在 python 2.6 下,你怎么同时维护能允许这两个项目的环境? Python 还好一点可以用 pyenv 加 virtualenv 做隔离,其他的语言我不熟悉,不确定是否有类似的简单方法做隔离。如果你是用虚拟机来隔离,那每个虚拟机的环境怎么装?是不是也费劲。以及,你自己隔离好了虚拟机,怎么发布和分享给别人?再来做一次虚拟机环境初始化?还是直接把虚拟机硬盘拷给对方?如果是 docker,直接一个 docker 配置文件就能相对于虚拟机更轻量的隔离并启动
    wdy3334
        28
    wdy3334  
       2019-05-17 11:02:34 +08:00
    @whileFalse #25 去哪儿找靠谱的镜像,全靠自己分辨吗?
    tiedan
        29
    tiedan  
       2019-05-17 11:03:13 +08:00
    linux 基础镜像有啥开销?唯一的开销就是多占用了几百 MB 的磁盘和几 KB 的内存。
    jameskuk
        30
    jameskuk  
       2019-05-17 11:05:51 +08:00
    我们可以把环境+代码做成一个镜像,这样不用再去管远端真实环境,特别是在部署集群的时候,好处显而易见。

    还有个方面我补充一下。曾经有个项目在 aws 上,除了生产以外的环境,都是上班时间创建实例,部署服务,下班了,销毁实例,一年省了不少钱。你要手动搞或者写个很复杂的脚本,成本肯定比 docker 大很多。
    jjianwen68
        31
    jjianwen68  
       2019-05-17 11:06:04 +08:00
    docker 是个好东西
    jackleeforce3615
        32
    jackleeforce3615  
       2019-05-17 11:07:16 +08:00
    环境隔离是最大的好处。
    zjyl1994
        33
    zjyl1994  
       2019-05-17 11:08:28 +08:00
    docker 的优势在于方便部署啊,你要得闲裸机上一个一个依赖装,这样肯定省资源,但是调到 100%拉起来的成本太高了
    ghos
        34
    ghos  
       2019-05-17 11:12:11 +08:00
    比如我装一个 tinyrss 需要:
    tinyrss 本体
    mercury api
    opencc api
    pg 数据库
    还要占用不知道多少个机器的端口
    现在一键安装部署 暴露出一个端口 美滋滋得很啊
    ghos
        35
    ghos  
       2019-05-17 11:14:27 +08:00
    接上 搞这么一套 没有部署脚本 最快要几个小时 一键安装实在太舒坦了
    zong400
        36
    zong400  
       2019-05-17 11:15:56 +08:00   ❤️ 1
    tomcat 本地部署几十个 api

    tomcat 一挂全部挂,一个 api 出问题( oom )全部挂,维护一个 api 全部重启,更新 tomcat、jdk 版本(修漏洞)全部重启,这样你不觉得可怕吗
    Luckyray
        37
    Luckyray  
       2019-05-17 11:17:58 +08:00   ❤️ 3
    最大的优势应该就是环境的一致性了,足以改变软件的分发方式。比如有的复杂应用需要装环境,装类库,假如有几百台服务器需要部署,对运维来说是巨大的挑战。某一次发布版本,部分依赖更新了怎么办?或者单台物理机上,两个应用的依赖冲突了怎么办?有了 docker,那种“我本地没问题的啊”的问题应该具不会出现了。

    其次,应该是资源的隔离,上面说的 tomcat 上部署几个应用,当然可以,其中一个应用负载突然暴增,整个物理机托挂了怎么办? docker 可以直接限制内存占用、cpu 核心数量,应用要死只会自己死。

    然后对个人开发来说,有个好处就是保持自己机器在整洁。经常遇到需要临时安装某些功能或者类库,执行了几个命令之后,它稀里哗啦下载了一堆东西,用完了也不好删除,一是不知道在哪,二是怕误删。有了 docker 不长期用的功能就可以不放在物理机上。我个人开发电脑上就没装 mysql、nginx 这些东西,还有一些使用频次比较低的命令行,都放在了容器里,不用的时候直接关闭容器,还能节省资源。
    lihongjie0209
        38
    lihongjie0209  
       2019-05-17 11:18:47 +08:00   ❤️ 2
    这个问题要从不同的角度回答

    1. 作为软件开发者,你可以把 docker 当作软件的分发渠道,可以避免用户的繁琐配置
    2. 作为软件使用者, 你可以把 docker 当作软件的一种形式,可以直接"双击运行"
    3. 作为大规模集群的运维, 你以为他们用的是 docker, 其实他们用的是 k8s, 只是碰巧底层调度的是 docker 而已, 这个东西和个人使用一点关系都没有.
    zong400
        39
    zong400  
       2019-05-17 11:22:11 +08:00   ❤️ 1
    为什么在 vm 里跑 docker ?这是基础资源管理的问题
    你理解的 vm 底层其实是各种云,阿里云、腾讯云、openstack (自建云)等,这些是为了把机房、机架、实体服务器、实体网络等一大堆资源整合利用,也可以说是把这是物理层面的东西虚拟化透明化了。
    而 docker 则是把 OS 虚拟化透明化,就是楼上说的各种跨版本啦、一键部署环境啦这些,开发就只需要专注于代码就好了,这是对程序员或者个人最大的好处。
    micean
        40
    micean  
       2019-05-17 11:24:20 +08:00
    我现在都是直接用 idea 的 docker 插件直接把程序部署到测试环境……那还用得着中间搭个 jenkins ……
    marsgt
        41
    marsgt  
       2019-05-17 11:24:58 +08:00
    一个是封装 /隔离,再一个是标准化,
    不让单个项目的依赖影响到整个系统,另外就是可以相对容易的可以封装一套东西、交付给其它人去部署(反过来也是,别人的东西,给你 Dockerfile 或者 Docker-Compose 就能拉起来了),还有就是给虚拟化提供更细的粒度,云平台直接部署 Docker 可以转成可视化的东西,方便管理
    zyy314680012
        42
    zyy314680012  
       2019-05-17 11:26:51 +08:00 via Android
    @fengbjhqs win 也可以 主要方便安装各种环境
    fengbjhqs
        43
    fengbjhqs  
       2019-05-17 12:26:13 +08:00
    @zyy314680012 win 安装 dorcker,流畅运行就是很麻烦
    cway
        44
    cway  
       2019-05-17 12:38:57 +08:00
    说白了就是快速部署,docker 可以把你制作好的镜像传到仓库,以后有需要随时可以用,不用配置环境
    cway
        45
    cway  
       2019-05-17 12:39:32 +08:00
    但主要还是 devops 部署用的多,自动化部署项目
    HelloAmadeus
        46
    HelloAmadeus  
       2019-05-17 12:41:25 +08:00 via iPhone
    kubernetes 搭配 docker 才能发挥容器的最大优点
    loading
        47
    loading  
       2019-05-17 12:42:07 +08:00 via Android
    我觉得,不是要多部署的,小打小闹,公司也不用 docker 部署的话,我建议用虚拟机。
    loading
        48
    loading  
       2019-05-17 12:42:51 +08:00 via Android
    如果开发机是 windows,其实比虚拟机还……
    hcymk2
        49
    hcymk2  
       2019-05-17 12:44:37 +08:00 via Android
    对个人开发特别是 Java 来说其实意义不大,多版本 jdk 其实不是痛点。
    shm7
        50
    shm7  
       2019-05-17 12:50:10 +08:00 via iPhone
    意义是在不用重复配置环境吧。有了编排结构以后,服务多副本的更新迭代也会更方便。
    impl
        51
    impl  
       2019-05-17 13:01:41 +08:00 via Android
    统一开发环境用 vagrant
    linshiyouxiang
        52
    linshiyouxiang  
       2019-05-17 13:08:18 +08:00
    对个人的意义是 重装系统随便搞了,日常各种应用都扔到了 docker 里面,互不干扰.
    vscode 预览版已经支持 docker 的远程接入,跟本地开发没什么区别,正打算把开发也扔到 docker 里面.
    xuanbg
        53
    xuanbg  
       2019-05-17 13:46:27 +08:00
    用资源换方便而已,看你是资源值钱还是时间值钱咯。
    sazima
        54
    sazima  
       2019-05-17 13:53:07 +08:00
    用 docker 不会在服务器上安装一堆乱七八糟的东西, 只需要准备几个 docker-compose 文件就好了.
    mattx
        55
    mattx  
       2019-05-17 14:08:10 +08:00
    如果从开发&软件工程方面来讨论价值的话, 是不大的. 应该尽量少去折腾, 除非为了环境, 点到为止即可. 从运维方面来说是价值很大.
    neroxps
        56
    neroxps  
       2019-05-17 14:09:15 +08:00
    最简单的例子,以前编译 openwrt 你会被折腾到痛不欲生。而现在 你只需要到 hub.docker.com 那边找一个 openwrt builder 的容器就好了。完善自己的程序编译环境,编译完容器就删掉,剩下就是编译出来的文件,多舒服啊。
    ww2000e
        57
    ww2000e  
       2019-05-17 14:10:10 +08:00
    轻量类虚机,环境隔离,方便部署,不一定都要用
    liuguang
        58
    liuguang  
       2019-05-17 14:10:53 +08:00
    方便迁移啊。。随便重装系统都没事
    dreamusername
        59
    dreamusername  
       2019-05-17 14:13:13 +08:00
    “每开一个容器都相当于多开了一个基础 linux 镜像”
    比较质疑这一句,tomcat 的 dockfile 基本都是从 openjdk 的包开始的,并不是 centos、debian 这类操作系统的包开始的,当然我也是一桶水不满。
    alexmy
        60
    alexmy  
       2019-05-17 14:13:46 +08:00
    个人的话,就是觉得方便,我都用 docker-compose.yml ,至于别的 k8s 什么的,就没有去折腾了。
    ynohoahc
        61
    ynohoahc  
    OP
       2019-05-17 14:40:48 +08:00
    @dreamusername 我觉得是这样的
    razertory
        62
    razertory  
       2019-05-17 14:49:49 +08:00   ❤️ 1
    假如你一台 linux 机器上需要跑两个服务 A 和 B,并且 A 和 B 跑起来的需要额外安装基础组件 C。不巧的是,A 需要版本 V1.0.0, B 需要版本 V2.0.0。这时候如果 V2.0.0 没有做到向下兼容的话,运维同学就不得不在一个机器安装两个版本不一样的 C。但是!又发现同时安装起来会报冲突。

    如果是 docker 的话可以在各自的容器中安装需要的 C。

    以上。对于个人本地开发同样适用
    justfly
        63
    justfly  
       2019-05-17 14:55:10 +08:00
    容器的意义就是隐藏要部署的服务的细节 ( python go java 各种环境),从而有一套统一的接口进行操控,其实就是标准化。

    在此之上构建自动调度才更加简单。这些好处在你只有一台服务器,几个进程时体现不出来。你能体会到的就是本机开发有了开箱即用的环境。
    jorneyr
        64
    jorneyr  
       2019-05-17 15:16:47 +08:00
    一般小公司还真没太大用,Docker 在微服务盛行的今天,当服务器压力扛不住后 (小公司有几个业务好到阵发的服务器压力太大?),快速增加服务器,快速使用 Docker 部署,启动新服务,关键就是快快快,在部署的时候差不多就是复制粘贴然后就能启动服务了,不需要在新系统上逐个的安装配置各种软件了。
    www5070504
        65
    www5070504  
       2019-05-17 15:36:31 +08:00
    “每开一个容器都相当于多开了一个基础 linux 镜像”

    感觉你把 docker 理解成了类似虚拟机的东西 虽然可以这么理解

    但是底层没有像虚拟机那样虚拟化所以性能损失要少很多

    docker 的意义在于方便的统一开发和部署环境 以及 部署流程的问题吧

    如果让运维去部署 运维很多时候也不知道你这个要怎么启动运行 可能你还得写个启动脚本 就更费劲了。。
    sevncz
        66
    sevncz  
       2019-05-17 15:56:10 +08:00
    隔离环境,安装各种服务不用修改本机环境
    yuhr123
        67
    yuhr123  
       2019-05-17 16:10:23 +08:00
    环境隔离呀,这很重要。
    干干净净的来,干干净净的走。
    menyakun
        68
    menyakun  
       2019-05-17 16:53:08 +08:00
    menyakun
        69
    menyakun  
       2019-05-17 16:58:32 +08:00
    @dreamusername openjdk 再往下看一层就是了,*-stretch,*-alpine 就代表是从不同发行版 build 出来的
    ynohoahc
        70
    ynohoahc  
    OP
       2019-05-17 17:40:52 +08:00
    @bjfane 这个不对嘛?
    我们写 Dockerfile 的时候不是经常写 COPY、WORKDIR 的嘛
    如果不是每一个容器有一个基础镜像的话 那么这些操作怎么解释呢?
    BCy66drFCvk1Ou87
        71
    BCy66drFCvk1Ou87  
       2019-05-17 17:43:30 +08:00
    kaneg
        72
    kaneg  
       2019-05-17 17:54:40 +08:00 via iPhone
    无论是对开发还是运维好处都太多。别的不说,以前开发环境部署一套 Oracle 几天都搞不定,还得专业人员干,现在随便抓过来个开发分分钟就搞定了。
    choury
        73
    choury  
       2019-05-17 18:04:34 +08:00
    @ynohoahc #70 有基础镜像,但是他们并不需要运行起来,最多占用点磁盘空间,这就是和 vm 有区别的地方。vm 管理的是一个系统,要跑内核的,但是容器管理的是进程,推荐的做法就是一个容器跑一个进程。所以我们可以认为,用容器起进程和直接在机器上起一个进程相比没有额外的开销,只是会损失一点 io (网络,磁盘)性能(大概 5%,也远小于 vm )
    FantaMole
        74
    FantaMole  
       2019-05-17 18:11:21 +08:00
    从我的体验来说,在新机器上搭环境变得很简单,不同时期的项目的语言版本和框架版本依赖都是不同的,本地环境只需要 docker,执行 docker build + docker run 两条命令就能快速构建,快速开始测试。从我上家公司的架构层面来讲,微服务后,老项目抽离成服务由 PHP 构成,新服务是由 Java 构成,能让两套开发语言并存。甚至后来我们后端的技术栈还加上了 Node.js 和 Golang,这些都要依靠容器
    0x8C
        75
    0x8C  
       2019-05-17 18:18:38 +08:00
    我在 mac 上写 golang 装 docker 主要是为了解决交叉编译的问题
    galaxyyao
        76
    galaxyyao  
       2019-05-17 18:25:02 +08:00   ❤️ 2
    #### “因为每开一个容器都相当于多开了一个基础 linux 镜像, 然后再在这个基础镜像里跑 tomcat 服务”
    在去看下 docker 原理吧。Namespace+Cgroups 的开销相比虚机的 Hypervisor+Guest OS 不知道低了多少了。
    如果都使用的是同一个 tomcat 镜像,那么通过 overlay2,就算开 10 个容器,存储空间都只需要 1 份。

    #### “用传统的 tomcat 在本地部署几十个 api 服务”
    如果指的是 1 个 tomcat 上 10 个 webapp,那么的确是比 10 个容器占用的资源少。但就像楼上已经说的“ 10 个鸡蛋放在一个篮子里”,能承受 1 个 webapp OOM 导致所有 webapp 不能访问的风险么?根本不用说对每个 webapp 控制 Xms 和 Xmx 内存占用了。
    如果指的是 10 个 tomcat,每个 tomcat 里一个 webapp,那么负载约等于 10 个 tomcat 的容器。但容器在编排,CI/CD 的简易程度,对环境依赖的灵活性,高可用负载均衡等等很多方面远胜。

    #### 对于普通个人开发者
    做私活的好处楼上已经说了。
    另一个好处是如果应用需要依赖数据库 /redis/消息队列等等中间件,以前只有两种方案:要么是依赖一个公共基础环境,会遇到和其他人互相修改对方数据的冲突。debug 了半天发现原来是数据被别人改掉了这种恶心事情发生频率还是挺高的。要么是在本机搭,但如果是 windows/mac 开发机,还必须需要这个中间件在 windows/mac 上有安装包。
    如果有容器,就本地 pull+run 一把梭,问题解决。
    cf020031308
        77
    cf020031308  
       2019-05-17 18:29:18 +08:00
    容器不同于虚拟机,是非常轻的。当然再轻也就像你说的一样会有额外开销,反过来又可以说,虽然有额外开销但是非常轻。所以不用纠结,学就是了。
    好处就是封装了环境,不影响宿主机。不但对于公司有好处,对于个人开发者也是好的,比如我之前写过一篇文章 https://cf020031308.github.io/blog/workplace-refactory (装逼用蹩脚英文写的)就是说这事,最近升级了 Majove 又搞破一堆环境,很是心累。
    另外一个好处就是环境固化成了配置文件,交付能力提高了,新机配置无比简单。打破了开发与运维之间的混乱墙,不然也不会几乎同时流行起 DevOps 概念了。
    billlee
        78
    billlee  
       2019-05-17 22:21:39 +08:00
    @noahzh #12 你这举了个最不恰当的例子吧。JDK 只要设置 PATH 和 JAVA_HOME 就好了,一台机器放上各个版本 JDK 完全没有问题的,应用也可以自带全部依赖。麻烦的是环境隔离做得不好的 C, python 这些。
    FrankHB
        79
    FrankHB  
       2019-05-17 22:50:51 +08:00
    @loading 基于 HyperV 的直接就是虚拟机了……
    真要开发还得另说;但光就部署讲,要是直接已经有提供了个 docker image 的情况,还费事把它拆出来自己撸一遍重新部署,那是没事找事。
    native
        80
    native  
       2019-05-17 22:57:34 +08:00
    比如我在这家公司搞了一边开发换环境。到了那个公司还得在搞一遍。有了 docker 就不一样了。 把环境写到 dockerfile 中到了直接运行生成自己需要的开发环境
    FrankHB
        81
    FrankHB  
       2019-05-17 23:09:05 +08:00
    跑点题,这玩意儿技术上的出发点就是对没法方便隔离环境的具体负载的变通。
    如果能跑的东西本来就有机制能方便隔离,那么仅仅是为了让环境干净,再套一个间接层的收益自然不大——这里的收益是相对的,很多时候是通过相对替代方案降低成本体现。例如虚拟机比物理机省事,操作系统支持的 namespace 实现的隔离比虚拟机省事,等等。
    但就原始目的来讲,这样的比较也不是绝对的,因为隔离会有功能限制上的代价。隔离完倒腾环境是省事了,但能做的事情往往就少了,在同一个实例上部署其它玩意儿的可能性通常也减少了。所以越是对通用性和灵活性要求越高的场合,细粒度的隔离限制越明显。极端情况下,如果目的不止是隔离,还要强调完整地模拟其它环境,那么当然就不是越轻量越好。比如像 WSL2 不也得依赖虚拟化么,为啥不按 WSL 的套路来?
    还有个问题也是显然的:隔离出来的实例多了就容易冗余。只是业务系统上跑的东西相对专一,本来就无所谓多少共享的依赖,独立部署自然无所谓。不过开发机上来讲,如果不是为了测试生产环境,这样显然不太划算(除非你一个开发机只打算管一个项目)。考虑这点,用隔离环境的思路来实现解决共存这样的问题就明显是跑偏了。要实现这样的目的,应该用更细粒度的非完全隔离的机制,比如 nixpkgs 之类的包管理方案。不过这类东西可能太偏向开发者了,运维基本都没概念更不可能流行,别指望近些年内能在公共生产环境用上,作为开发者还得自己负担环境差异带来的额外成本,于是基本只能自己玩自己的。
    dyllen
        82
    dyllen  
       2019-05-17 23:15:13 +08:00
    个人感受是对于普通开发者就是搞环境方便,用完就没什么用处了,docker 主要是用在运维上面方便,各种扩展方便。
    容器又不是运行在 vm 上面的,vm 是虚拟了硬件,docker 并没有虚拟硬件,用的资源都是主机的。
    1010543618
        83
    1010543618  
       2019-05-17 23:24:38 +08:00
    docker 给客户部署应用多方便啊,要是所有客户都能直接给你一台服务器就另说了
    miao1007
        84
    miao1007  
       2019-05-17 23:41:40 +08:00 via Android
    docker 可以搭建 overlay 网络,多台 ip 一起跑
    KigKrazy
        85
    KigKrazy  
       2019-05-18 00:41:35 +08:00
    如果你需要管理很多台机器才用,或者需要部署的程序很多。不然如果只有一两个程序其实没必要,增加负担。
    resouer
        86
    resouer  
       2019-05-18 04:08:52 +08:00
    节省资源有一百种方法,打包应用和 OS 依赖就容器镜像这一种方法。建议读一下这个: https://www.infoq.cn/article/R1p3H3_29f4TYImExsyw
    lionseun
        87
    lionseun  
       2019-05-18 09:21:00 +08:00 via Android
    一键搭建一个 MySQL 一键搭一个 Redis 互不影响,线上本地环境一致
    AlexaZhou
        88
    AlexaZhou  
       2019-05-18 09:54:31 +08:00
    等你遇到需要部署几十上百台机器的时候,就知道 docker 好用了
    abcbuzhiming
        89
    abcbuzhiming  
       2019-05-18 10:13:06 +08:00
    对于个人开发者来说最大的好处是环境隔离,无污染
    部署的便捷性要成百上千台机器的时候才体现的出来。k8s 对个人用户不是刚需,但是隔离环境这点确实是刚需
    charlie21
        90
    charlie21  
       2019-05-18 11:14:38 +08:00 via iPhone
    环境隔离:虚拟机 vagrant 能做到、docker 也能做到
    资源隔离:docker composer 能做到
    * 离开了 xx 就不会写代码了 [1]:docker 能做到

    docker 隐藏的细节太多,这会直接导致很多人看似使用了 docker 的便利,实则离开 docker 就不会写代码了(等于把能力捆绑到了 docker 上)。有人将为此付出代价

    (设计师说离开 photoshop 就不会作图了,尚可理解,运维人员说离开 docker 就不会搞运维了,这表明已经将自己的知识栈捆绑在 docker 上,只会沦为笑柄。比如 给你两个看似能起一样作用的 container 哪个好哪个坏都分不出来,快速 pull 了有啥用?直接给你安个后门你会排查问题吗?性能监控更是没得谈了 -- “负载均衡” 这个名词是什么含义 那些 docker 步道者是不会告诉你的,你就一把梭就对了

    docker will cost you, docker 只是有钱人的玩具,但是你不会因为玩了它而变成有钱人,反而会先染上富贵病

    [1]: 离开了 Borg 都不知道怎么写代码
    https://www.infoq.cn/article/R1p3H3_29f4TYImExsyw
    lonelygo
        91
    lonelygo  
       2019-05-18 12:14:33 +08:00
    这么说吧:有个项目,后端比较杂,相隔时代久远,不同 JDK、Py2、Py3 都有。
    老板安排了新功能开发,为了省钱,就给了一台机子让你部署测试环境。

    传统部署:起 VM,一台一台 VM 先装起来,然后按照不同版本一台一台装机,然后再部署。嗯,如果运气好,一天没了,如果运气不好,再来一天。
    Docker 呢?一个环境,两条命令,pull / run,就酱。
    CitizenR
        92
    CitizenR  
       2019-05-18 13:38:48 +08:00 via iPhone
    当我开发需要当前系统不提供的数据库版本时,我体会出 docker 的好了。
    ZSeptember
        93
    ZSeptember  
       2019-05-18 14:09:23 +08:00
    个人开发没啥大用。
    不会直接节约资源,只是细粒度的调控资源,可以提高资源利用率。
    有了各种编排平台以后,对公司内部的开发,测试,部署有不少好处。
    mzdblsw8
        94
    mzdblsw8  
       2019-05-18 17:20:31 +08:00
    我觉得先试着用。不喜欢就不用上。
    mml
        95
    mml  
       2019-05-18 19:42:55 +08:00
    “别家孩子都在学”
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1755 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 16:28 · PVG 00:28 · LAX 08:28 · JFK 11:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.