2016-10-29 6 views
6

Какая связь между Dockerfile и docker-compose.yml файлами?Dockerfile vs docker-compose.yml

Похоже, я могу построить любую установку Linux с помощью Dockerfile с помощью FROM, RUN (apt-get и т.д. и CMD команд. Но, похоже, это не так много многоразового (я могу повторно использовать все изображение, но услуги hardcdoded и не . многоразовые другими проектами)

Должен ли я использовать оба файла на новые проекты

Скажем, я хочу иметь регулярный стек LAMP:?

  • Linux O S (debian:wheezy)
  • веб-сервер Apache (httpd:2.2)
  • MySQL (mariadb)
  • PHP (php:5.6)

работает вместе, как на одной, обычной машине.

И в директории на моей системе хоста:

  • объем для источника приложения файлов
  • ВХоста конфигурационного файл
  • журналы Апач
  • постоянных данных в БД

Я предпочитаю используя официальные базовые репозитории и изображения, а не предварительно настроенные все-в-одном.

Как должны выглядеть файлы конфигурации в этом случае?

Я использую docker-compose v.1.8.1 и docker v. 1.12.3 на Ubuntu.

ответ

7

Docker создает изолированную машину (контейнер). Каждый контейнер содержит только один процесс (Apache или Mysql или другой); И Dockerfile определяет, как создать изображение.

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

В вашем случае apache должен знать «где» mysql. И mysql нужно разбудить перед запуском контейнера apache.

Dockerfile определяет, как создать изображение приложения. Изображение приложения содержит приложение и веб-браузер.

FROM apache:php5.6 

ADD /src /var/www/awesome_project #add a project src code 
ADD /config/apache/awesome_project.conf /etc/apache2/sites-available/ # add a configuration 
# make any things 

Тогда вам нужно построить изображение docker build my_app:latest .

На данный момент вы создали образ, и вам нужно запустить приложение и связывает его с БД

у вас есть 2 способа сделать это:

1) Подход на основе докеров. запуске DB контейнер

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest

и после того, как вам нужно запустить приложение контейнера (изображение было создано до)

docker run --name my_app --link some-mysql:mysql -P -d my_app

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

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

docker-compose.yml Простые конфигурации иллюстрируют этот подход

db: 
    image: mysql 
    environment: 
    - MYSQL_USER=root 
    - MYSQL_PASSWORD=root 

app: 
    image: my_app:latest 
    ports: 
    - 80:80 
    depends_on: 
    - db 
    environment: 
    # Database 
    - DB_USER_NAME=root 
    - DB_USER_PASSWORD=root 

Эта конфигурация позволяет запускать 2 контейнера вместе, ссылки и настроить их.

Это очень простой пример. и плюсы использования докеров не кажутся очевидными, но если у вас есть 5+ контейнеров, слишком сложно их объединить без компоновки.

+0

Значит, 'Dockerfile' вообще не нужен? Как определить весь стек, описанный в моем вопросе, просто используя 'docker-compose.yml'? Является ли Dockerfile более старым способом настройки Docker или способом, подходящим для создания изображений низкого уровня, например, клонов-дистрибуторов? – Sfisioza

+1

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

+0

Не могли бы вы предоставить полный пример обоих файлов, касающихся установки с моего вопроса? – Sfisioza

6

Dockerfile:

  • рецепт для Докеров изображений
  • поддерживает только портативные варианты (другие варианты должны быть указаны во время контейнера выполнения)

docker-compose.yaml:

  • является рецептом группы бегущих услуг
  • поддерживает верховные портативные варианты, которые были определены в Dockerfile
  • поддерживает непортабельному опции
  • поддерживает создание и настройка сетей и объемов
  • можно также настроить сборку образа с помощью build:

Как правило, они используются вместе.

A Dockerfile почти всегда используется для создания пользовательского изображения. Некоторые изображения могут использоваться для запуска служб (длительные процессы), но некоторые изображения могут использоваться для запуска недолговечных интерактивных процессов (например, для запуска модульных тестов).

docker-compose.yaml полезен, если вы хотите запустить одну или несколько служб.

+0

А что такое портативные опции? – Sfisioza

+1

Переносные опции - это параметры, которые ведут себя одинаково на всех хостах. Для выставления значения переменной среды с помощью 'ENV'. Не переносимая опция будет чем-то вроде монтирования привязки хоста, где каталог должен существовать на хосте для его работы. – dnephin

+0

Спасибо за это. Я пытаюсь понять, если я хочу запустить, например, контейнер nginx с определенными параметрами (сопоставления портов и тома), я указываю, что с помощью Dockerfile, docker-compose.yml или чего-то еще (например, bash). Если я правильно понимаю этот ответ, я могу исключить Dockerfile для такой задачи. –

Смежные вопросы