docker-compose существует, чтобы вам не приходилось писать массу команд, которые вам пришлось бы делать с docker-cli.
docker-compose также позволяет легко запускать несколько контейнеров одновременно и автоматически соединять их вместе с помощью некоторой формы сети.
Цель docker-compose — функционировать как docker cli, но гораздо быстрее выполнять несколько команд.
Чтобы использовать docker-compose, вам нужно закодировать команды, которые вы запускали ранее, в файл docker-compose.yml
.
Вы же не будете просто копипастить их в yaml файл, там специальный синтаксис.
После создания вы должны передать его в cli 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 и Redis, вы хотите убедиться, что знаете, какой порт по умолчанию использует 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
.
person
Daniel
schedule
21.12.2018