我一直在阅读和学习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组合用于运行多容器环境。

在你的特定场景中,如果你为你提到的每一种技术都有多个服务(服务1使用reddis,服务2使用rabbit mq等),那么你可以为每个服务都有一个Dockerfile和一个公共的docker-compose。以容器的形式运行所有的Dockerfile。

如果您希望它们都在一个服务中,docker-compose将是一个可行的选择。

其他回答

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-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: {}

Dockerfile是一个包含用于组装图像的文本命令的文件。

Docker组合用于运行多容器环境。

在你的特定场景中,如果你为你提到的每一种技术都有多个服务(服务1使用reddis,服务2使用rabbit mq等),那么你可以为每个服务都有一个Dockerfile和一个公共的docker-compose。以容器的形式运行所有的Dockerfile。

如果您希望它们都在一个服务中,docker-compose将是一个可行的选择。

答案是两者都不是。

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

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

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

“更好”是相对的。这完全取决于你的需求。Docker的组合是为了编排多个容器。如果这些映像已经存在于docker注册表中,那么最好将它们列在compose文件中。如果这些图像或其他一些图像必须从计算机上的文件构建,那么您可以在Dockerfile中描述构建这些图像的过程。

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

在一个dockerfile中使用多个FROM并不是一个很好的主意,因为有人建议删除该功能。13026

例如,如果你想dockerize一个使用数据库的应用程序,并在你的计算机上有应用程序文件,你可以使用一个合成文件和dockerfile,如下所示

docker-compose.yml

mysql:
  image: mysql:5.7
  volumes:
    - ./db-data:/var/lib/mysql
  environment:
    - "MYSQL_ROOT_PASSWORD=secret"
    - "MYSQL_DATABASE=homestead"
    - "MYSQL_USER=homestead"
  ports:
    - "3307:3306"
app:
  build:
    context: ./path/to/Dockerfile
    dockerfile: Dockerfile
  volumes:
    - ./:/app
  working_dir: /app
      

Dockerfile

FROM php:7.1-fpm 
RUN apt-get update && apt-get install -y libmcrypt-dev \
  mysql-client libmagickwand-dev --no-install-recommends \
  && pecl install imagick \
  && docker-php-ext-enable imagick \
  && docker-php-ext-install pdo_mysql \
  && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

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