docker-compose існує для того, щоб вам не довелося писати багато команд, які вам доведеться виконати з docker-cli.
docker-compose також спрощує запуск декількох контейнерів одночасно та автоматично з'єднує їх разом із деякою формою мереж.
Мета docker-compose - функціонувати як docker cli, але набагато швидше видавати кілька команд.
Щоб використовувати docker-compose, вам потрібно кодувати команди, які ви виконували раніше, у docker-compose.yml
файл.
Ви не просто збираєтесь скопіювати вставити їх у файл yaml, є спеціальний синтаксис.
Після створення ви повинні подати його до док-композиційного кліпу, і кліп повинен буде розібрати файл і створити всі різні контейнери з правильною конфігурацією, яку ми задаємо.
Отже, у вас будуть окремі контейнери, скажімо, наприклад, один є, 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
});
Тож Докер побачить, що шукає додаток 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
.