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
.