Многие люди путают Dockerfile и Composefile. Это в первую очередь потому, что оба они используются для некоторого изменения образа Docker, хотя это технически некорректно.
Эти два термина легко спутать, но также необходимо понимать разницу при разговоре с коллегой или вашим (потенциальным) работодателем.
Dockerfile – это то, что используется для создания образа контейнера, а файл Compose – это то, что используется для развертывания экземпляра этого образа в качестве контейнера.
Позвольте нам остановиться подробнее, чтобы вы правильно поняли разницу между Docker Compose и Dockerfile.
Нам нравится называть Dockerfile предшественником образа контейнера. Вы создаете образ из Dockerfile. Типичным Dockerfile содержит специальные инструкции по сборке, такие команды, как RUN, ADD, COPY, ENTRYPOINT и т.д.
Вот пример:
FROM alpine:latest RUN apk add --no-cache fortune ENTRYPOINT ["fortune"]
Каждая строка начинается с инструкции для компонента сборки. Эти инструкции не обязательно должны быть написаны заглавными буквами. Следующее действует так же, как и предыдущее.
from alpine:latest run apk add --no-cache fortune entrypoint ["fortune"]
Из Dockerfile теперь вы можете создать образ контейнера (или образ Docker). Образ – это просто шаблон для запущенных контейнеров, состоящий из нескольких слоев только для чтения. Поскольку это статья не об образах контейнеров, мы воздержимся от излишних разъяснений по этой теме.
Чтобы создать образ из этого Dockerfile, используя интерфейс командной строки docker, выполните следующую команду:
docker build -t fortune:alpine
Это создаст изображение с тегами fortune:alpine. Мы пока не собираемся создавать контейнер из этого изображения, это для следующего раздела.
Composefile используется в двух типах развертываний: в некластерном развертывании с помощью docker-compose и кластерном развертывании с docker swarm.
Чтобы различать эти два типа, мы собираемся обратиться к файлу набора, отвечающему за развертывание кластера, как к файлам стека. Мы расскажем о файлах стека чуть позже.
Компоновка файлов – это часть инструмента, называемого docker-compose. Это клиентское приложение для сервера демона докеров, что-то вроде docker клиента CLI, но вместо того, чтобы каждый раз запускать все команды docker-compose, вы можете повторно использовать один и тот же файл YAML снова и снова и развертывать один и тот же контейнер с тем же конфигурация, как и в первый раз.
Он более читаемый, более удобный в обслуживании, более интуитивно понятный. Один файл компоновки может содержать несколько конфигураций развертывания контейнера.
Давайте возьмем предыдущий образ и развернем его, используя файл набора.
version: "3.3" services: fortune: image: "fortune:alpine"
Сохраните файл как docker-compose.yml. Теперь запустите в том же каталоге следующую команду
docker-compose up
Вы не должны сохранить файл как docker-compose.yml, вы можете сохранить его, как вам нравится, но если это не так, docker-compose.yml или docker-compose.yaml, убедитесь, что вы используете опцию -f [FILENAME].
docker-compose -f docker-compose.yml up
Подождите и посмотрите, что произойдет.
Файлы стека идентичны файлам компоновки с аналогичным синтаксисом и большинством внутренних параметров, за некоторыми исключениями. Файлы стека используются для развертывания стеков сервисов в роевом кластере.
Вы можете повторно использовать предыдущий файл композиции непосредственно как файл стека.
Сначала инициализируйте кластер.
docker swarm init
Затем запустите команду, подобную следующей
docker stack deploy -c docker-compose.yml fortune
При таком развертывании необходимо проверить вывод, просмотрев журналы службы с помощью docker service logs ….
Файлы Dockerfiles и Compose служат разным целям. Если бы я мог построить график, это выглядело бы примерно так
Dockerfile -> Docker Image -> Compose File -> Running Containers
Есть еще одна причина, по которой новичков путают с этими двумя файлами. На файл Dockerfile можно указать через файл Compose, а затем вы можете использовать docker-compose для создания образа.
Например, вы можете переписать предыдущий файл композиции, чтобы
version: "3.3" services: fortune: build: context: '.' dockerfile: "./Dockerfile" image: "fortune:alpine"
Теперь вы можете запустить создание образа docker-compose build. Или вы также можете запустить сборку docker-compose up –build и сразу запустить контейнер.
Здесь файл Dockerfile передается через файл компоновки, и на первый взгляд может показаться, что это файл компоновки, который отвечает за создание образа, но это не так.
Мы надеемся, что эта статья прояснила, в чем разница между файлом Dockerfile и файлом Compose. Если у вас есть какие-либо вопросы, дайте нам знать в разделе комментариев ниже.