Dockerfile vs docker-compose.yml

时间:2016-10-29 19:56:23

标签: php linux apache docker docker-compose

Dockerfiledocker-compose.yml个文件之间的关系是什么?

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

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

让我们说我想要定期LAMP堆栈:

  • Linux OS(debian:wheezy
  • Apache Web服务器(httpd:2.2
  • MySQL(mariadb
  • PHP(php:5.6

在一台常规机器上一起运行。

在主机系统的目录中:

  • 应用源文件的卷
  • vhost配置文件
  • apache logs
  • db
  • 中的持久数据

我更喜欢使用官方的基本回购和图片,而不是预先配置的多功能一体机。

在这种情况下配置文件应该如何?

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

3 个答案:

答案 0 :(得分:11)

Dockerfile

  • 是Docker Image的配方
  • 仅支持便携式选项(必须在容器运行时指定其他选项)

docker-compose.yaml

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

将两者结合使用是很常见的。

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

当您想要运行一个或多个服务时,

docker-compose.yaml非常有用。

答案 1 :(得分:10)

Docker 创建隔离计算机(容器)。每个容器只包含一个进程(Apache或Mysql或其他); Dockerfile定义了如何构建图像。

Docker撰写允许同时运行,链接和配置容器的

在你的情况下,apache需要知道“where”是一个mysql。并且在运行apache容器之前需要唤醒mysql。

Dockerfile定义了如何创建应用图片。应用程序映像包含应用程序和Web浏览器。

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

你有2种方法可以做到这一点:

1)本地码头工人方法。你运行数据库容器

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

并且在您需要运行app容器(之前创建了图像)

之后

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的优点并不明显,但如果你有5个以上的容器,那么在没有编写的情况下将它们组合在一起就太难了。

答案 2 :(得分:0)

从根本上讲,这是关注点的分离和一种简单的构想方式,是通过思考什么 vrs 如何来考虑的。

Dockerfile定义容器内发生的事情

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

容器并不关心其运行方式或运行位置,它只关心其运行情况。主机不关心运行什么,仅运行运行方式。多个实例,那么多的RAM,那么多的CPU,请确保在该实例之前启动该服务,等等。

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