我一直在阅读和学习Docker,并试图正确选择要使用的Django设置。到目前为止,有两种:

Docker撰写或Dockerfile

我知道Dockerfile在Docker Compose中使用,但我不确定将所有内容放在一个大Dockerfile中,对不同的图像使用多个FROM命令是否是个好做法?

我想使用几个不同的图像,包括:

uwsgi
nginx
postgres
redis
rabbitmq
celery with cron

请建议使用Docker建立这种类型环境的最佳实践是什么。

如果有帮助,我在Mac上,所以使用boot2docker。

我遇到的一些问题:

Docker Compose与Python3不兼容 我想容器化我的项目,所以如果一个大Dockerfile 是不理想的,那么我觉得我需要打破它使用Docker撰写 我可以让项目Py2和Py3兼容,所以我倾向于django-compose


当前回答

Dockerfile和Docker Compose是Dockerland中两个不同的概念。当我们谈论Docker时,首先想到的是编排、操作系统级虚拟化、映像、容器等。我将试着分别解释如下:

图片: 映像是存储在docker信任注册表中的不可变、可共享的文件。Docker映像是由一系列只读层构建的。每一层代表图像Dockerfile中给出的一条指令。映像包含运行所需的所有二进制文件。

容器: 映像的实例称为容器。容器只是由主机操作系统运行的可执行映像二进制文件。正在运行的映像是一个容器。

Dockerfile: Dockerfile是一个包含所有命令/构建指令的文本文档,用户可以在命令行上调用来组装一个图像。这将被保存为Dockerfile。(注意小写的“f”。)

Docker-Compose: Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件配置应用程序的服务(容器)。然后,使用一个命令就可以从配置中创建并启动所有服务。 撰写文件将被保存为docker-compose.yml。

其他回答

在我的工作流程中,我为系统的每个部分添加了Dockerfile,并将其配置为每个部分可以单独运行。然后我添加了一个docker-compose。Yml把它们连在一起。

最大的优势(在我看来):当链接容器时,你可以定义一个名称并用这个名称来ping你的容器。因此,您的数据库可以通过名称db访问,而不再通过其IP访问。

假设你是一家软件公司的经理,刚刚买了一台全新的服务器。只有硬件。

把Dockerfile看作是一组指示,您可以告诉系统管理员在这个全新的服务器上安装什么。例如:

我们需要一个Debian linux 添加一个apache web服务器 我们也需要postgresql 安装午夜指挥官 当所有的完成,复制所有的*.php, *.jpg等文件,我们的项目到web服务器的webroot (/var/www)

相比之下,想想docker-compose。Yml作为一组指令,您将告诉系统管理员服务器如何与其他系统进行交互。例如,

它可以从另一台计算机访问共享文件夹, 它的80端口与主机的8000端口相同, 等等。

(这不是一个精确的解释,但足以作为一个开始。)

答案是两者都不是。

如果你将构建命令添加到项目的Docker - Compose .yml中,Docker Compose(这里称为Compose)将使用Dockerfile。

你的Docker工作流程应该是为你想要创建的每个图像构建一个合适的Dockerfile,然后使用构建命令来组合这些图像。

你可以使用build /path/to/ Dockerfiles /blah来指定你的Dockerfile的路径,其中/path/to/ Dockerfiles /blah就是blah的Dockerfile所在的位置。

Docker compose file是一种让你以声明的方式编排多个容器的启动的方式,而不是用bash脚本分别运行每个Dockerfile,后者编写起来要慢得多,而且很难调试。

Dockerfiles是用来构建一个映像的,例如,从Ubuntu的骨架上,你可以在一个映像上添加mysql,在另一个映像上添加mywordpress。

撰写YAML文件是取这些图像并内聚地运行它们。 例如,如果你在docker-compose中。Yml文件一个名为db的服务:

services:
   db:
     image: mySQL  --- image that you built.

还有一个叫wordpress的服务,比如:

wordpress: 
    image: mywordpress

然后在mywordpress容器内,你可以使用db连接到你的mySQL容器。这种魔力是可能的,因为你的docker主机创建了一个网桥(网络覆盖)。