Dockerfile与docker-compose.yml

Sfi*_*oza 9 php linux apache docker docker-compose

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

貌似我可以构建使用任何Linux安装Dockerfile使用FROM,RUN(apt-get等和CMD命令.但现在看来,这是没有太大的可重复使用的(我可以重用的整体形象,但服务hardcdoded,而不是由其他项目重复使用).

我可以在新项目中使用这两个文件吗?

假设我想要定期LAMP堆栈:

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

像常规机器一样在一起运行.

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

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

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

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

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

dne*_*hin 12

Dockerfile:

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

docker-compose.yaml:

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

通常将两者结合使用.

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

docker-compose.yaml 在您想要运行一个或多个服务时非常有用.

  • 可移植选项是在所有主机上行为方式相同的选项。用于公开使用“ENV”设置环境变量。非可移植选项类似于主机绑定安装,其中目录需要存在于主机上才能工作。 (3认同)
  • 什么是便携式选项? (2认同)

Buk*_*gey 10

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

Docker compose允许运行,链接和配置一堆容器.

在你的情况下,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
Run Code Online (Sandbox Code Playgroud)

然后你需要建立图像 docker build my_app:latest .

此时您已经创建了图像,并且需要运行app并将其链接到db

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

1)本地码头工人方法.你运行db容器

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
Run Code Online (Sandbox Code Playgroud)

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

这是一个非常简单的例子.使用docker的优点并不明显,但是如果你有5个以上的容器,那么在没有编写的情况下将它们放在一起就太难了.


ris*_*ism 7

从根本上讲,它是关于关注点的分离,而实现这一点的一个简单方法是从“什么”和“如何”的角度进行思考。

Dockerfile 定义了容器内发生的事情。

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

容器不关心它如何运行或在哪里运行,它只关心它正在运行什么。主机不关心它正在运行什么,只关心它是如何运行的。例如多个实例,这么多的 RAM,那么多的 CPU,确保你在那个服务之前启动这个服务,等等。

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