【问题标题】:Dockerfile vs docker-compose.ymlDockerfile 与 docker-compose.yml
【发布时间】:2017-03-12 09:52:00
【问题描述】:

Dockerfiledocker-compose.yml 文件之间有什么关系?

看起来我可以使用Dockerfile 使用FROMRUNapt-get 等和CMD 命令来构建任何 Linux 设置。但看起来,这不是可重用的(我可以重用整个图像,但服务是硬编码的,不能被其他项目重用)。

我应该在新项目中使用这两个文件吗?

假设我想要常规的 LAMP 堆栈:

  • Linux 操作系统 (debian:wheezy)
  • Apache 网络服务器 (httpd:2.2)
  • MySQL (mariadb)
  • PHP (php:5.6)

像在一台普通机器上一样一起运行。

在我的主机系统的目录中:

  • 应用源文件的容量
  • 虚拟主机配置文件
  • apache 日志
  • 数据库中的持久数据

我更喜欢使用官方的基础存储库和图像,而不是预先配置的一体机。

在这种情况下,配置文件应该是什么样子?

我在 Ubuntu 上使用 docker-compose v.1.8.1 和 docker v. 1.12.3。

【问题讨论】:

    标签: php linux apache docker docker-compose


    【解决方案1】:

    Dockerfile:

    • 是 Docker 镜像的秘诀
    • 仅支持可移植选项(其他选项必须在容器运行时指定)

    docker-compose.yaml:

    • 是一组正在运行的服务的配方
    • 支持覆盖在Dockerfile 中定义的可移植选项
    • 支持非便携式选项
    • 支持创建和配置网络和卷
    • 也可以使用build:配置镜像的构建

    通常同时使用两者。

    Dockerfile 几乎总是用于创建自定义图像。一些图像可能用于运行服务(长时间运行的进程),但一些图像可能用于运行短暂的交互式进程(如运行单元测试)。

    docker-compose.yaml 在您想要运行一项或多项服务时很有用。

    【讨论】:

    • 什么是便携选项?
    • 可移植选项是在所有主机上行为方式相同的选项。用于公开使用ENV 设置环境变量。不可移植的选项类似于主机绑定挂载,目录需要存在于主机上才能工作。
    • 谢谢。我一直在试图理解,如果我想运行,例如,具有特定选项(端口映射和卷)的 nginx 容器,我是否指定使用 Dockerfile、docker-compose.yml 或其他东西(如bash 脚本)。如果我正确理解了这个答案,我可以排除此类任务的 Dockerfile。
    【解决方案2】:

    Docker 创建隔离机器(容器)。每个容器只包含一个进程(Apache 或 Mysql 或另一个);而 Dockerfile 定义了如何构建镜像。

    Docker compose 允许一起运行、链接和配置 bunch 容器。

    在您的情况下,apache 需要知道 mysql 的“位置”。并且 mysql 需要在运行 apache 容器之前被唤醒。

    Dockerfile 定义了如何创建应用镜像。应用图像包含您的应用和网络浏览器。

    FROM apache:php5.6
    
    ADD /src /var/www/awesome_project #add a project src code
    ADD /config/apache/awesome_project.conf /etc/apache2/sites-available/ # add a configuration
    # make any things
    

    然后你需要构建镜像docker build my_app:latest .

    此时你已经创建了镜像,你需要运行app并将它链接到db

    您有两种方法可以做到这一点:

    1) 本地 docker 方法。你运行数据库容器

    docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest

    在你需要运行应用容器之后(之前创建的图像)

    docker run --name my_app --link some-mysql:mysql -P -d my_app

    此时我们已经完成了应用程序。有点这个简单的事情导致我们发出 2 个长命令。如果您需要将应用程序复制到另一台机器,您需要准确地重复此命令。

    2) docker-compose 方式 允许创建运行容器的配置。它描述了如何运行容器。

    简单的docker-compose.yml 配置说明了这种方法

    db:
       image: mysql
       environment:
        - MYSQL_USER=root
        - MYSQL_PASSWORD=root
    
    app:
       image: my_app:latest
       ports:
        - 80:80
       depends_on:
        - db
       environment:
        # Database
        - DB_USER_NAME=root
        - DB_USER_PASSWORD=root
    

    此配置允许您一起运行 2 个容器,链接并配置它们。

    这是一个非常简单的例子。并且使用 docker compose 的优点并不明显,但是如果你有 5 个以上的容器,那么在没有 compose 的情况下很难将它们一起运行。

    【讨论】:

    • 那么Dockerfile 根本不需要?如何仅使用docker-compose.yml 来定义我的问题中描述的整个堆栈? Dockerfile 是一种旧的 Docker 配置方式还是适合创建低级镜像的方式,例如发行版克隆?
    • 你需要一个 Dockerfile。 Dockerfile 定义了如何创建特定的 docker 镜像(在低级别)。 Docker compose 定义了如何一起运行、链接、配置容器(来自镜像)
    • 您能否提供两个文件的完整示例,关于我的问题中的设置?
    • 感谢您的更新,但我仍然看不到 php 和 Apache 附加在哪里。为什么FROM apache:php5.6
    • 在这个例子中图片my_app包含src代码、php和apache,因为基础图片是apache:php5.6
    【解决方案3】:

    它从根本上讲是关于关注点的分离,一种简单的设想方法是考虑what vs how

    Dockerfile 定义了容器内的什么

    Docker-compose.yml 定义了容器在主机中的如何运行。这就是为什么他们在文档中说 - “服务只是生产中的容器”。

    容器不关心它运行的方式和位置,它只关心它运行的是什么。主机不关心它正在运行的什么,只关心它运行的如何。例如。多个实例,这么多内存,这么多 CPU,确保你在那个之前启动这个服务,等等。

    因此,我们为每个目的创建了两个单独的配置文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-28
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多