Docker Compose против Dockerfile - что лучше?

Я читал и изучал Docker, и я пытаюсь правильно выбрать настройку Django для использования. Пока что есть:

Docker Compose или Dockerfile

Я понимаю, что Dockerfiles файлы используются в Docker Compose, но я не уверен, является ли хорошей практикой помещать все в один большой Dockerfile с несколькими командами FROM для разных образов?

Я хочу использовать несколько разных изображений, которые включают в себя:

uwsgi
nginx
postgres
redis
rabbitmq
celery with cron

Посоветуйте, пожалуйста, как лучше настроить этот тип среды с помощью Docker.

Если это помогает, я на Mac, поэтому использую boot2docker.

Некоторые проблемы у меня были:

  1. Docker Compose не совместим с Python3
  2. Я хочу создать контейнер для своего проекта, поэтому, если один большой Dockerfile не идеален, я чувствую, что мне нужно разбить его с помощью Docker Compose.
  3. Я в порядке, чтобы сделать проект Py2 & Py3 совместимым, поэтому я склоняюсь к django-compose

Ответ 1

Ответ не является ни тем, ни другим.

Docker Compose (здесь именуется compose) будет использовать Dockerfile, если вы добавите команду сборки в свой проект docker-compose.yml.

Рабочий процесс Docker должен состоять в создании подходящего Dockerfile для каждого изображения, которое вы хотите создать, а затем используйте compose для сборки изображений с помощью команды build.

Вы можете указать путь к вашим индивидуальным файлам Docker, используя build /path/to/dockerfiles/blah, где /path/to/dockerfiles/blah находится там, где живет blah Dockerfile.

Ответ 2

Dockerfile

enter image description here

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 Compose

enter image description here

Docker Compose

  • это инструмент для определения и запуска мультиконтейнерных приложений 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: {}

Ответ 3

Файл Создать описывает контейнер в рабочем состоянии, оставив информацию о том, как построить контейнер до 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://docs.docker.com/v1.10/compose/production/.

Ответ 4

docker-compose существует для того, чтобы вам приходилось писать кучу команд, которые вам бы пришлось делать с помощью docker-cli.

Docker-compose также позволяет легко запускать несколько контейнеров одновременно и автоматически соединять их вместе с какой-либо формой сетевого взаимодействия.

Цель docker-compose - функционировать как docker cli, но выполнять несколько команд гораздо быстрее.

Чтобы использовать docker-compose, вам нужно кодировать команды, которые вы выполняли ранее, в файл docker-compose.yml.

Вы не просто скопируете, вставите их в файл yaml, есть специальный синтаксис.

После создания вы должны передать его в docker-compose cli, и у вас будет возможность проанализировать файл и создать все различные контейнеры с правильной конфигурацией, которую мы укажем.

Таким образом, у вас будут отдельные контейнеры, скажем, например, один - redis-server а второй - node-app и вы хотите, чтобы он был создан с использованием Dockerfile в вашем текущем каталоге.

Кроме того, после создания этого контейнера вы должны отобразить некоторый порт из контейнера на локальную машину, чтобы получить доступ ко всему, что работает внутри него.

Итак, для вашего файла docker-compose.yml вы бы хотели начать первую строку следующим образом:

version: '3'

Это говорит Docker о версии docker-compose вы хотите использовать. После этого вы должны добавить:

version: '3'
services: 
  redis-server: 
    image: 'redis'
  node-app:
    build: .

Пожалуйста, обратите внимание на отступ, очень важно. Кроме того, обратите внимание, что для одного сервиса я собираю изображение, но для другого сервиса я советую docker-compose заглянуть в текущий каталог, чтобы создать образ, который будет использоваться для второго контейнера.

Затем вы хотите указать все различные порты, которые вы хотите открыть в этом контейнере.

version: '3'
services: 
  redis-server: 
    image: 'redis'
  node-app:
    build: .
    ports:
      -

Обратите внимание на тире, тире в файле yaml - это то, как мы указываем массив. В этом примере я сопоставляю 8081 на моей локальной машине с 8081 на контейнере следующим образом:

version: '3'
services: 
  redis-server: 
    image: 'redis'
  node-app:
    build: .
    ports:
      - "8081:8081"

Таким образом, первый порт - это ваша локальная машина, а другой - порт в контейнере, вы также можете различать два, чтобы избежать путаницы, например:

version: '3'
services:
  redis-server:
    image: 'redis'
  node-app:
    build: .
    ports:
      - "4001:8081"

Разрабатывая docker-compose.yml файл docker-compose.yml он будет создавать эти контейнеры практически в одной и той же сети, и у них будет свободный доступ для общения друг с другом любым удобным для них способом и обмена таким количеством информации, как они захотят.

Когда два контейнера создаются с использованием docker-compose нам не нужны никакие объявления портов.

Теперь в моем примере нам нужно выполнить настройку кода в приложении Nodejs, которое выглядит примерно так:

const express = require('express');
const redis = require('redis');

const app = express();
const client = redis.createClient({
  host: 'redis-server'
});

Я использую этот пример выше, чтобы вы знали, что, возможно, вам придется выполнить какую-то конкретную настройку в дополнение к файлу docker-compose.yml который может быть специфичен для вашего проекта.

Теперь, если вы когда-нибудь обнаружите, что работаете с приложением Nodejs и выполнили повтор, вы хотите убедиться, что знаете о порте по умолчанию, который использует Nodejs, поэтому я добавлю это:

const express = require('express');
const redis = require('redis');

const app = express();
const client = redis.createClient({
  host: 'redis-server',
  port: 6379
});

Итак, Docker увидит, что приложение Node ищет redis-server и перенаправит это соединение в этот работающий контейнер.

Все время Dockerfile содержит только это:

FROM node:alpine

WORKDIR '/app'

COPY /package.json ./
RUN npm install
COPY . .

CMD ["npm", "start"]

Поэтому, прежде чем вам нужно будет запустить docker run myimage чтобы создать экземпляр всех контейнеров или служб внутри файла, который вы можете вместо этого запустить, docker-compose up и вам не нужно указывать изображение, потому что Docker будет искать в текущий рабочий каталог и найдите docker-compose.yml файл docker-compose.yml.

Перед docker-compose.yml нам пришлось иметь дело с двумя отдельными командами docker build. и docker run myimage, но в мире docker-compose если вы хотите перестроить ваши изображения, вы пишете docker-compose up --build. Это говорит Docker снова запускать контейнеры, но перестраивать его, чтобы получить последние изменения.

Таким образом, docker-compose облегчает работу с несколькими контейнерами. В следующий раз, когда вам потребуется запустить эту группу контейнеров в фоновом режиме, вы можете выполнить docker-compose up -d а чтобы остановить их, вы можете выполнить docker-compose down.

Ответ 5

В моем рабочем процессе я добавляю файл Docker для каждой части моей системы и настраиваю его, чтобы каждая часть могла запускаться индивидуально. Затем я добавляю docker-compose.yml, чтобы объединить их и связать.

Самое большое преимущество (на мой взгляд): когда связывает контейнеры, вы можете определить имя и ping свои контейнеры с этим именем. Поэтому ваша база данных может быть доступна с именем db и уже не по IP-адресу.

Ответ 6

"лучше" относительно. Все зависит от ваших потребностей. Docker compose предназначен для организации нескольких контейнеров. Если эти образы уже существуют в реестре Docker, то лучше перечислить их в файле compose. Если эти изображения или некоторые другие изображения должны быть собраны из файлов на вашем компьютере, вы можете описать процессы создания этих изображений в Dockerfile.

Я понимаю, что Dockerfiles используются в Docker Compose, но я не уверен, является ли хорошей практикой помещать все в один большой Dockerfile с несколькими командами FROM для разных образов?

Использование нескольких FROM в одном файле Docker не очень хорошая идея, потому что есть предложение удалить эту функцию. 13026

Если, например, вы хотите докеризировать приложение, которое использует базу данных и имеет файлы приложения на вашем компьютере, вы можете использовать файл компоновки вместе с файлом докера следующим образом

докер-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

Ответ 7

Dockerfile и Docker Compose - это две разные концепции в Dockerland. Когда мы говорим о Docker, первое, что приходит на ум, это оркестровка, виртуализация на уровне ОС, образы, контейнеры и т.д. Я постараюсь объяснить каждый из них следующим образом:

Изображение: Изображение - это неизменяемый файл общего доступа, который хранится в надежном реестре Docker. Образ Docker состоит из ряда слоев, доступных только для чтения. Каждый слой представляет собой инструкцию, которая дается в Dockerfile для изображений. Изображение содержит все необходимые двоичные файлы для запуска.

enter image description here

Контейнер: Экземпляр изображения называется контейнером. Контейнер - это просто исполняемый двоичный файл образа, который должен запускаться операционной системой хоста. Работающее изображение - это контейнер.

enter image description here

Dockerfile: Dockerfile - это текстовый документ, содержащий все команды/инструкции по сборке, которые пользователь может вызвать в командной строке для сборки образа. Это будет сохранено как Dockerfile. (Обратите внимание на строчную букву 'f'.)

enter image description here

Docker-Compose: Compose - это инструмент для определения и запуска многоконтейнерных приложений Docker. С Compose вы используете файл YAML для настройки служб приложений (контейнеров). Затем с помощью одной команды вы создаете и запускаете все службы из вашей конфигурации. Файл Compose будет сохранен как docker-compose.yml.

Ответ 8

Представьте, что вы менеджер компании по разработке программного обеспечения и только что купили новый сервер. Просто железо.

Dockerfile что Dockerfile - это набор инструкций, которые вы бы Dockerfile системному администратору, что устанавливать на этом новом сервере. Например:

  • Нам нужен Debian Linux
  • добавить веб-сервер Apache
  • нам нужен также postgresql
  • установить полночь командир
  • когда все сделано, скопируйте все *.php, *.jpg и т.д. файлы нашего проекта в webroot веб-сервера (/var/www)

Напротив, думайте о docker-compose.yml как о наборе инструкций, которым вы бы сказали своему системному администратору, как сервер может взаимодействовать с остальным миром. Например,

  • у него есть доступ к общей папке с другого компьютера,
  • это порт 80 такой же, как порт 8000 хост-компьютера,
  • и так далее.

(Это не точное объяснение, но достаточно хорошее для начала.)

Ответ 9

Dockerfiles предназначены для создания образа, например, из чистого Ubuntu, вы можете добавить mysql под названием mySQL на одно изображение и mywordpress на mywordpress изображение под названием mywordpress.

Составьте файлы YAML, чтобы взять эти изображения и выполнить их связно. например, если в вашем файле docker-compose.yml есть служебный вызов db:

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

и сервис под названием worpress, такой как:

wordpress: 
    image: mywordpress

затем внутри контейнера mywordpress вы можете использовать db для подключения к контейнеру mySQL. Эта магия возможна потому, что ваш докер-хост создает сетевой мост (сетевое наложение).