it-swarm.com.ru

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
269
Aaron Lelevier

Ответ ни один.

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

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

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

164
booyaa

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

Файл Compose описывает контейнер в его рабочем состоянии , оставляя детали о том, как собрать контейнер в 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/ делает.

76
Peeter Kokk

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

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

39
n2o

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, нам не нужны никакие объявления портов.

Теперь в моем примере нам нужно выполнить настройку кода в приложении 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 build . и docker run myimage, но в мире docker-compose, если вы хотите перестроить свои изображения, вы пишете docker-compose up --build. Это говорит Docker снова запускать контейнеры, но перестраивать его, чтобы получить последние изменения.

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

26
Daniel

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

Я понимаю, что Docker-файлы используются в 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
24
Akongnwi Devert

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

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

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

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

wordpress: 
    image: mywordpress

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

3
Hugo R