docker-compose tồn tại để giữ cho bạn phải viết một tấn lệnh bạn sẽ phải thực hiện với docker-cli.
docker-compose cũng giúp bạn dễ dàng khởi động nhiều container cùng một lúc và tự động kết nối chúng với nhau bằng một số hình thức kết nối mạng.
Mục đích của docker-compose là hoạt động như docker cli nhưng để phát hành nhiều lệnh nhanh hơn nhiều.
Để sử dụng docker-compose, bạn cần mã hóa các lệnh bạn đang chạy trước đó thành một docker-compose.yml
tệp.
Bạn sẽ không chỉ sao chép dán chúng vào tập tin yaml, có một cú pháp đặc biệt.
Sau khi tạo xong, bạn phải cung cấp nó cho cler docker-compose và nó sẽ tùy thuộc vào cli để phân tích tệp và tạo tất cả các thùng chứa khác nhau với cấu hình chính xác mà chúng tôi chỉ định.
Vì vậy, bạn sẽ có các thùng chứa riêng biệt, ví dụ, một là redis-server
và thứ hai là node-app
và bạn muốn nó được tạo bằng Dockerfile
thư mục hiện tại của bạn.
Ngoài ra, sau khi tạo vùng chứa đó, bạn sẽ ánh xạ một số cổng từ vùng chứa sang máy cục bộ để truy cập mọi thứ chạy bên trong nó.
Vì vậy, đối với docker-compose.yml
tệp của bạn, bạn sẽ muốn bắt đầu dòng đầu tiên như vậy:
version: '3'
Điều đó cho Docker biết phiên bản docker-compose
bạn muốn sử dụng. Sau đó, bạn phải thêm:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
Xin lưu ý các vết lõm, rất quan trọng. Ngoài ra, thông báo cho một dịch vụ tôi đang lấy một hình ảnh, nhưng đối với một dịch vụ khác tôi đang nói docker-compose
hãy nhìn vào bên trong thư mục hiện tại để xây dựng hình ảnh sẽ được sử dụng cho vùng chứa thứ hai.
Sau đó, bạn muốn chỉ định tất cả các cổng khác nhau mà bạn muốn mở trên container này.
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
-
Xin lưu ý dấu gạch ngang, dấu gạch ngang trong tệp yaml là cách chúng tôi chỉ định một mảng. Trong ví dụ này, tôi ánh xạ 8081
trên máy cục bộ của mình 8081
vào container như vậy:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "8081:8081"
Vì vậy, cổng đầu tiên là máy cục bộ của bạn và cổng kia là cổng trên container, bạn cũng có thể phân biệt giữa hai cổng để tránh nhầm lẫn như vậy:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "4001:8081"
Bằng cách phát triển docker-compose.yml
tệp của bạn như thế này, nó sẽ tạo ra các thùng chứa này trên cùng một mạng và họ sẽ có quyền truy cập miễn phí để liên lạc với nhau theo bất kỳ cách nào họ muốn và trao đổi nhiều thông tin như họ muốn.
Khi hai container được tạo bằng cách sử dụng, docker-compose
chúng tôi không cần bất kỳ khai báo cổng nào.
Bây giờ trong ví dụ của tôi, chúng ta cần thực hiện một số cấu hình mã trong ứng dụng Nodejs trông giống như thế này:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server'
});
Tôi sử dụng ví dụ này ở trên để làm cho bạn biết rằng có thể có một số cấu hình cụ thể mà bạn sẽ phải thực hiện ngoài docker-compose.yml
tệp có thể dành riêng cho dự án của bạn.
Bây giờ, nếu bạn thấy mình làm việc với ứng dụng Nodejs và bạn muốn đảm bảo rằng bạn biết về cổng mặc định mà Nodejs sử dụng, vì vậy tôi sẽ thêm điều này:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server',
port: 6379
});
Vì vậy, Docker sẽ thấy rằng ứng dụng Node đang tìm kiếm redis-server
và chuyển hướng kết nối đó đến container đang chạy này.
Toàn bộ thời gian, Dockerfile
chỉ có điều này:
FROM node:alpine
WORKDIR '/app'
COPY /package.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
Vì vậy, trong khi trước đó bạn sẽ phải chạy docker run myimage
để tạo một phiên bản của tất cả các vùng chứa hoặc dịch vụ bên trong tệp mà bạn có thể chạy docker-compose up
và bạn không phải chỉ định một hình ảnh vì Docker sẽ tìm trong thư mục làm việc hiện tại và tìm kiếm một docker-compose.yml
tập tin bên trong đó.
Trước đây docker-compose.yml
, chúng tôi đã phải đối phó với hai lệnh riêng biệt docker build .
và docker run myimage
, nhưng docker-compose
trên thế giới nếu bạn muốn xây dựng lại hình ảnh của mình, bạn viết docker-compose up --build
. Điều đó nói với Docker khởi động lại các container nhưng xây dựng lại để có những thay đổi mới nhất.
Vì vậy, docker-compose
làm cho nó dễ dàng hơn để làm việc với nhiều container. Lần tới khi bạn cần bắt đầu nhóm container này trong nền bạn có thể làm docker-compose up -d
và để ngăn chặn chúng, bạn có thể làm docker-compose down
.