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

dockerfile 和 docker-compose 的关系

  •  
  •   154625424 · 2016-09-12 15:37:17 +08:00 · 15191 次点击
    这是一个创建于 3001 天前的主题,其中的信息可能已经有所发展或是发生改变。
    想学习 docker ,一直想不明白 dockerfile 和 docker-compose 的关系,谁能简单通俗的讲解下。

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

    也有人用 dockerfile+dockercompose 部署

    还有一些教程里只用了 dockercompose

    那位可以通俗说说这 3 中的区别 和 可行性。以及怎么分析到底该用哪一种方式。
    14 条回复    2016-09-13 11:35:34 +08:00
    154625424
        1
    154625424  
    OP
       2016-09-12 15:37:56 +08:00
    不要沉
    derek80
        2
    derek80  
       2016-09-12 16:01:03 +08:00   ❤️ 1
    官方文档过一遍先。
    jerray
        3
    jerray  
       2016-09-12 16:06:04 +08:00
    按照我的把玩经验, dockerfile 用来定义容器, docker-compose 用于把多个容器连接到一起同时运行。
    gzlock
        4
    gzlock  
       2016-09-12 16:07:40 +08:00 via Android
    一句话理解明白:文件和文件夹的关系
    SpicyCat
        5
    SpicyCat  
       2016-09-12 16:44:20 +08:00   ❤️ 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  
       2016-09-12 16:45:08 +08:00
    Dockerfile - 为 docker build 命令准备的,用于建立一个独立的 image ,在 docker-compose 里也可以用来实时 build
    docker-compose.yml - 为 docker-compose 准备的脚本,可以同时管理多个 container ,包括他们之间的关系、用官方 image 还是自己 build 、各种网络端口定义、储存空间定义等
    keeley
        7
    keeley  
       2016-09-12 17:40:49 +08:00
    @SpicyCat 总结的很形象。
    leopardwei
        8
    leopardwei  
       2016-09-12 17:51:44 +08:00
    @SpicyCat 非常清晰,顶!
    kongkongyzt
        9
    kongkongyzt  
       2016-09-12 17:59:53 +08:00
    154625424
        10
    154625424  
    OP
       2016-09-12 22:41:53 +08:00
    @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
       2016-09-12 22:46:49 +08:00
    @derek80 你的回答等于浪费你的时间,我整明白了再过,和过了在整明白是两个效果。

    还有能来提问肯定是说明过不下去了,有不明白的地方。
    cxbig
        12
    cxbig  
       2016-09-12 23:48:20 +08:00
    @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
       2016-09-13 10:18:41 +08:00
    @cxbig 谢谢
    nonoroazoro
        14
    nonoroazoro  
       2016-09-13 11:35:34 +08:00
    Machine

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

    Swarm

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

    Compose

    编排工具,定义并运行基于 Docker 的分布式应用,简化部署复杂应用的流程,管理容器化应用的完整开发周期。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2611 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 06:54 · PVG 14:54 · LAX 22:54 · JFK 01:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.