Docker Compose: từ phát triển đến sản xuất

Bản dịch bản ghi podcast được chuẩn bị trước khi bắt đầu khóa học "Quản trị viên Linux"

Docker Compose: từ phát triển đến sản xuất

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 YAML-
các tập tin
.

Với sự ra đời docker soạn v3 các tệp YAML này có thể được sử dụng trực tiếp trong môi trường sản xuất khi làm việc với
cụm Docker bầy.

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 phép nội suy
biến
và các giá trị mặc định. Nghĩa là, bạn có thể làm như sau:

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 "Quản trị viên Linux"

Nguồn: www.habr.com

Thêm một lời nhận xét