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.