Bản dịch bản ghi podcast được chuẩn bị trước khi bắt đầu khóa học
Docker Compose là một công cụ tuyệt vời để tạo một môi trường làm việc
môi trường cho ngăn xếp được sử dụng trong ứng dụng của bạn. Nó cho phép bạn xác định
từng thành phần trong ứng dụng của bạn, tuân theo cú pháp rõ ràng và đơn giản trong
các tập tin
Với sự ra đời
cụm
Nhưng điều này có nghĩa là bạn có thể sử dụng cùng một tệp docker-compose trong
quá trình phát triển và trong môi trường sản xuất? Hoặc sử dụng cùng một tập tin cho
dàn dựng? Nói chung là có, nhưng đối với chức năng này, chúng ta cần những thứ sau:
- Nội suy biến: sử dụng biến môi trường cho một số
các giá trị thay đổi trong từng môi trường. - Ghi đè cấu hình: khả năng xác định giây (hoặc bất kỳ
một tệp docker-compose tiếp theo khác sẽ thay đổi điều gì đó liên quan đến
đầu tiên và docker soạn thảo sẽ đảm nhiệm việc hợp nhất cả hai tệp.
Sự khác biệt giữa các tập tin phát triển và sản xuất
Trong quá trình phát triển, rất có thể bạn sẽ muốn kiểm tra các thay đổi mã trong
thời gian thực. Để thực hiện việc này, ổ đĩa có mã nguồn thường được gắn vào
container chứa thời gian chạy cho ứng dụng của bạn. Nhưng đối với một môi trường sản xuất
Phương pháp này không phù hợp.
Trong quá trình sản xuất, bạn có một cụm có nhiều nút và âm lượng là cục bộ
liên quan đến nút mà vùng chứa (hoặc dịch vụ) của bạn đang chạy, vì vậy bạn không
bạn có thể gắn mã nguồn mà không cần các thao tác phức tạp bao gồm
đồng bộ hóa mã, tín hiệu, v.v.
Thay vào đó, chúng tôi thường muốn tạo một hình ảnh với một phiên bản mã cụ thể của bạn.
Theo thông lệ, người ta thường đánh dấu nó bằng thẻ thích hợp (bạn có thể sử dụng ngữ nghĩa
phiên bản hoặc hệ thống khác theo quyết định của bạn).
Ghi đè cấu hình
Do sự khác biệt và sự phụ thuộc của bạn có thể khác nhau trong các tình huống
phát triển và sản xuất, rõ ràng là chúng ta sẽ cần các tệp cấu hình khác nhau.
Docker soạn thư hỗ trợ hợp nhất các tệp soạn thảo khác nhau để
có được cấu hình cuối cùng. Cách thức hoạt động của nó có thể được nhìn thấy trong ví dụ:
$ cat docker-compose.yml
version: "3.2"
services:
whale:
image: docker/whalesay
command: ["cowsay", "hello!"]
$ docker-compose up
Creating network "composeconfigs_default" with the default driver
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1 | ________
whale_1 | < hello! >
whale_1 | --------
whale_1 |
whale_1 |
whale_1 |
whale_1 | ## .
whale_1 | ## ## ## ==
whale_1 | ## ## ## ## ===
whale_1 | /""""""""""""""""___/ ===
whale_1 | ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
whale_1 | ______ o __/
whale_1 | __/
whale_1 | __________/
composeconfigs_whale_1 exited with code 0
Như đã nói, docker soạn thư hỗ trợ kết hợp nhiều soạn thư -
các tệp, điều này cho phép bạn ghi đè các tham số khác nhau trong tệp thứ hai. Ví dụ:
$ cat docker-compose.second.yml
version: "3.2"
services:
whale:
command: ["cowsay", "bye!"]
$ docker-compose -f docker-compose.yml -f docker-compose.second.yml up
Creating composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1 | ______
whale_1 | < bye! >
whale_1 | ------
whale_1 |
whale_1 |
whale_1 |
whale_1 | ## .
whale_1 | ## ## ## ==
whale_1 | ## ## ## ## ===
whale_1 | /""""""""""""""""___/ ===
whale_1 | ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
whale_1 | ______ o __/
whale_1 | __/
whale_1 | __________/
composeconfigs_whale_1 exited with code 0
Cú pháp này không thuận tiện lắm trong quá trình phát triển, khi lệnh
sẽ phải thực hiện nhiều lần.
May mắn thay, docker soạn thư tự động tìm kiếm một tệp đặc biệt có tên
docker-compose.override.yml để ghi đè các giá trị docker-compose.yml. Nếu
đổi tên tệp thứ hai, bạn nhận được kết quả tương tự, chỉ sử dụng lệnh gốc:
$ mv docker-compose.second.yml docker-compose.override.yml
$ docker-compose up
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1 | ______
whale_1 | < bye! >
whale_1 | ------
whale_1 |
whale_1 |
whale_1 |
whale_1 | ## .
whale_1 | ## ## ## ==
whale_1 | ## ## ## ## ===
whale_1 | /""""""""""""""""___/ ===
whale_1 | ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
whale_1 | ______ o __/
whale_1 | __/
whale_1 | __________/
composeconfigs_whale_1 exited with code 0
Được rồi, điều đó dễ nhớ hơn.
Nội suy các biến
Hỗ trợ tập tin cấu hình
biến
services:
my-service:
build:
context: .
image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
...
Và nếu bạn làm xây dựng docker-compose (hoặc đẩy) không có biến môi trường
$MY_SERVICE_VERSION, giá trị sẽ được sử dụng mới nhấtnhưng nếu bạn đặt
giá trị của biến môi trường trước khi xây dựng, nó sẽ được sử dụng khi xây dựng hoặc đẩy
đến sổ đăng ký riêng tư.registry.mine.
Nguyên tắc của tôi
Những cách tiếp cận hiệu quả với tôi cũng có thể hiệu quả với bạn. Tôi làm theo những điều này
quy tắc đơn giản:
- Tất cả các ngăn xếp của tôi dành cho sản xuất, phát triển (hoặc các môi trường khác) được xác định thông qua
tập tin soạn thảo docker - Các tệp cấu hình cần thiết để bao phủ tất cả các môi trường của tôi, càng nhiều càng tốt
Tránh trùng lắp. - Tôi cần một lệnh đơn giản để làm việc trong từng môi trường.
- Cấu hình chính được xác định trong tập tin docker-compose.yml.
- Các biến môi trường được sử dụng để xác định thẻ hình ảnh hoặc các
các biến có thể thay đổi tùy theo môi trường (tổ chức, tích hợp,
sản xuất). - Giá trị của các biến sản xuất được sử dụng làm giá trị cho
theo mặc định, điều này giảm thiểu rủi ro nếu ngăn xếp được đưa vào sản xuất mà không có
đặt biến môi trường. - Để bắt đầu một dịch vụ trong môi trường sản xuất, hãy sử dụng lệnh triển khai ngăn xếp docker - soạn tập tin docker-compose.yml -with-registry-auth my-stack-name.
- Môi trường làm việc được bắt đầu bằng lệnh docker-soạn lên -d.
Hãy xem xét một ví dụ đơn giản.
# docker-compose.yml
...
services:
my-service:
build:
context: .
image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
environment:
API_ENDPOINT: ${API_ENDPOINT:-https://production.my-api.com}
...
И
# docker-compose.override.yml
...
services:
my-service:
ports: # This is needed for development!
- 80:80
environment:
API_ENDPOINT: https://devel.my-api.com
volumes:
- ./:/project/src
...
tôi có thể sử dụng docker-compose (docker-compose up)để chạy ngăn xếp trong
chế độ phát triển với mã nguồn được gắn vào /dự án/src.
Tôi có thể sử dụng những tập tin tương tự trong sản xuất! Và tôi chắc chắn có thể sử dụng
cùng một tập tin docker-compose.yml để dàn dựng. Để mở rộng điều này thành
production, tôi chỉ cần xây dựng và gửi hình ảnh với thẻ được xác định trước
ở giai đoạn CI:
export MY_SERVICE_VERSION=1.2.3
docker-compose -f docker-compose.yml build
docker-compose -f docker-compose.yml push
Trong sản xuất, điều này có thể được chạy bằng các lệnh sau:
export MY_SERVICE_VERSION=1.2.3
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth
Và nếu bạn muốn làm điều tương tự trên sân khấu, bạn chỉ cần xác định
các biến môi trường cần thiết để làm việc trong môi trường dàn dựng:
export MY_SERVICE_VERSION=1.2.3
export API_ENDPOINT=http://staging.my-api.com
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth
Kết quả là, chúng tôi đã sử dụng hai tệp docker-compose khác nhau, không có
Cấu hình trùng lặp có thể được sử dụng cho bất kỳ môi trường nào bạn có!
Tìm hiểu thêm về khóa học
Nguồn: www.habr.com