dockerfile 和 docker-compose 的关系 - V2EX
请不要在回答技术问题时复制粘贴 AI 生成的内容
154625424

dockerfile 和 docker-compose 的关系

  •  
  •   154625424 Sep 12, 2016 16103 views
    This topic created in 3556 days ago, the information mentioned may be changed or developed.
    想学习 docker ,一直想不明白 dockerfile 和 docer-compose 的关系,谁能简单通俗的讲解下。

    想用 docker 部署一个 wordpress 网站。
    我发现网上有人直接用 dockfile 就部署了

    也有人用 dockerfile+dockercompose 部署

    还有一些教程里只用了 dockercompose

    那位可以通俗说说这 3 中的区别 和 可行性。以及怎么分析到底该用哪一种方式。
    14 replies    2016-09-13 11:35:34 +08:00
    154625424
        1
    154625424  
    OP
       Sep 12, 2016
    不要沉
    derek80
        2
    derek80  
       Sep 12, 2016   1
    官方文档过一遍先。
    jerray
        3
    jerray  
       Sep 12, 2016
    按照我的把玩经验, dockerfile 用来定义容器, docker-compose 用于把多个容器连接到一起同时运行。
    gzlock
        4
    gzlock  
       Sep 12, 2016 via Android
    一句话理解明白:文件和文件夹的关系
    SpicyCat
        5
    SpicyCat  
       Sep 12, 2016   34
    其实楼主你把官网的例子都跑一遍应该就清楚了。

    从头说起。
    假如你不用 docker ,搭建 wordpress 怎么弄?先找台 server ,假设其 OS 为 Ubuntu ,然后按照文档一步步敲命令,写配置,对吧?

    用 docker 呢? 随便找台 server ,不管什么操作系统,只要支持 docker 就行, docker run ubuntu, docker 会从官方源里拉取最新的 Ubuntu 镜像,可以认为你开了个 Ubuntu 虚拟机,然后一步步安装,跟上面一样。

    但是这样安装有个显著的缺点,一旦 container 被删,你做的工作就都没了。当然可以用 docker commit 来保存成镜像,这样就可以复用了。

    但是镜像一般比较大,而且只分享镜像的话,别人也不知道你这镜像到底包含什么,这些问题都不利于分享和复用。
    一个直观的解决方案就是,写个脚本把安装过程全部记录下来,这样再次安装的时候,执行脚本就行了。 Dockerfile 就是这样的脚本,它记录了一个镜像的制作过程。
    有了 Dockerfile, 只要执行 docker build . 就能制作镜像,而且 Dockerfile 就是文本文件,修改也很方便。

    现在有了 wordpress 的镜像,只需要 docker run 就把 wordpress 启动起来了。

    如果仅仅是 wordpress, 这也就够了。但是很多时候,需要多个镜像合作才能启动一个服务,比如前端要有 nginx , 数据库 mysql, 邮件服务等等,当然你可以把所有这些都弄到一个镜像里去,但这样做就无法复用了。
    更常见的是, nginx, mysql, smtp 都分别是个镜像,然后这些镜像合作,共同服务一个项目。
    docker-compose 就是解决这个问题的。你的项目需要哪些镜像,每个镜像怎么配置,要挂载哪些 volume, 等等信息都包含在 docker-compose.yml 里。
    要启动服务,只需要 docker-compose up 就行,停止也只需要 docker-compse stop/down

    简而言之, Dockerfile 记录单个镜像的构建过程, docker-compse.yml 记录一个项目(project, 一般是多个镜像)的构建过程。

    你说有些教程用了 dockerfile+docker-compose, 是因为 docker-compose.yml 本身没有镜像构建的信息,如果镜像是从 docker registry 拉取下来的,那么 Dockerfile 就不需要;如果镜像是需要 build 的,那就需要提供 Dockerfile.

    说了好多废话,也比较低级浅显,贻笑大方了。
    cxbig
        6
    cxbig/strong>  
       Sep 12, 2016
    Dockerfile - 为 docker build 命令准备的,用于建立一个独立的 image ,在 docker-compose 里也可以用来实时 build
    docker-compose.yml - 为 docker-compose 准备的脚本,可以同时管理多个 container ,包括他们之间的关系、用官方 image 还是自己 build 、各种网络端口定义、储存空间定义等
    keeley
        7
    keeley  
       Sep 12, 2016
    @SpicyCat 总结的很形象。
    leopardwei
        8
    leopardwei  
       Sep 12, 2016
    @SpicyCat 非常清晰,顶!
    kongkongyzt
        9
    kongkongyzt  
       Sep 12, 2016
    154625424
        10
    154625424  
    OP
       Sep 12, 2016
    @SpicyCat @jerray @cxbig 感谢你们的回答,貌似我有点明白 dockerfile 和 docker-compose 的区别了。

    1.如果 dockerhub 存在的镜像满足我的需求,就可以直接使用 docker-compose
    2.如果 dockerhub 的镜像不能满足我的需求就 dockerfile 自己 build 镜像
    3.单一功能 dockerfile (自己 build )和 docker-compose (如果可以 docker pull )都可以实现。
    4.多个功能必须 compose 管理(可以 docker pull 的话),否则 compose+dockerfile 。
    154625424
        11
    154625424  
    OP
       Sep 12, 2016
    @derek80 你的回答等于浪费你的时间,我整明白了再过,和过了在整明白是两个效果。

    还有能来提问肯定是说明过不下去了,有不明白的地方。
    cxbig
        12
    cxbig  
       Sep 12, 2016
    @154625424
    1. 不对, docker-compose 是同时管理一套 container ,至于你的 image 是本地 build 还是在 docker hub 上都没有关系
    2. 对
    3. 对。但是 docker build 只是做 image ; docker-compose 是以启动 container 为目的的、先 build image 再以此启动 container 。
    4. docker-compose 都定义好了管理起来轻松,你如果喜欢用 docker run 带一大串 parameters 也是可以的

    docker-compose v2 以后可以灵活运用 image 和 build
    1. 只定义 image :先找本地、本地没有找 docker hub 、再没有就报错
    2. 只定义 build :跑 Dockerfile 做 image ,有 image 直接用, image 没有 name 和 tag
    3. 同时定义 image 和 build :没有 image 就先跑 build , name 和 tag 用 image 定义的那个,有了 image 就直接跑 container
    154625424
        13
    154625424  
    OP
       Sep 13, 2016
    @cxbig 谢谢
    nonoroazoro
        14
    nonoroazoro  
       Sep 13, 2016
    Machine

    解决因操作系统异构导致的安装 Docker 困难的问题。有了 Machine ,所有系统部署 Docker 都变得非常方便。

    Swarm

    提供原生 Docker 集群,它将几个 Docker 引擎聚集在一起,然后对外暴露为一个单一的虚拟 Docker 引擎,并提供资源管理、调度策略等。

    Compose

    编排工具,定义并运行基于 Docker 的分布式应用,简化部署复杂应用的流程,管理容器化应用的完整开发周期。
    About     Help     Advertise     Blog     API     FAQ     Solana     5474 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 48ms UTC 08:29 PVG 16:29 LAX 01:29 JFK 04:29
    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