Docker Compose与Dockerfile – 哪个更好?

我一直在阅读和学习Docker ,并试图正确select使用Django的设置。 到目前为止,要么是:

Docker Compose或Dockerfile

我明白Dockerfiles用在Docker Compose ,但我不确定是否将所有内容放在一个大的Dockerfile中,并将多个FROM命令放在不同的图像上?

我想要使​​用几个不同的图像,其中包括:

 uwsgi nginx postgres redis rabbitmq celery with cron 

请告知使用Docker设置这种types的环境的最佳实践。

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

我有一些问题:

  1. Docker Compose与Python3不兼容
  2. 我想集装箱我的项目,所以如果一个大的Dockerfile是不理想的,那么我觉得我需要分解使用Docker Compose
  3. 我可以让项目Py2&Py3兼容,所以我倾向于Django-compose

    答案是不是。

    如果将build命令添加到项目的docker-compose.yml Docker Compose(以下简称compose)将使用docker-compose.yml

    你的Docker工作stream程应该是为你想要创build的每个镜像构build一个合适的Dockerfile ,然后使用build命令来Dockerfile镜像。

    你可以使用build /path/to/dockerfiles/blah来指定你的个人Dockerfiles的build /path/to/dockerfiles/blah其中/path/to/dockerfiles/blah是blah的Dockerfile所在的Dockerfile

    Dockerfile

    在这里输入图像说明

    Dockerfile是一个简单的文本文件,其中包含用户可以调用来组装图像的命令。

    示例, Dockerfile

     FROM ubuntu:latest MAINTAINER john doe RUN apt-get update RUN apt-get install -y python python-pip wget RUN pip install Flask ADD hello.py /home/hello.py WORKDIR /home 

    Docker撰写

    在这里输入图像说明

    Docker撰写

    • 是定义和运行多容器Docker应用程序的工具。

    • docker-compose.yml定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行。

    • 只需运行docker-compose up让一个应用程序运行在一个命令中

    例如, docker-compose.yml

     version: '3' services: web: build: . ports: - "5000:5000" volumes: - .:/code - logvolume01:/var/log links: - redis redis: image: redis volumes: logvolume01: {} 

    Compose文件描述了容器的运行状态 ,留下了如何构build容器Dockerfiles的细节http://deninet.com/blog/1587/docker-scratch-part-4-compose-and-volumes

    在开发中使用Compose定义应用程序可以使用此定义在不同的环境(如CI,分段和生产)中 运行应用程序https://docs.docker.com/compose/production/

    也似乎Compose 从1.11开始就被认为是安全的 ,因为https://docs.docker.com/v1.11/compose/production/不再有像https&#xFF1A:// docs一样在生产中使用它的警告.docker.com / v1.10 / compose / production / does。

    在我的工作stream程中,我为系统的每个部分添加一个Dockerfile,并对其进行configuration,使得每个部分都可以单独运行。 然后我添加一个docker-compose.yml将它们连接在一起并链接它们。

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