Tại sao lại kết hợp hệ thống với chim gõ kiến để triển khai sản xuất

Cơ sở hạ tầng hiện đại cần thiết để tồn tại các dịch vụ đóng gói còn lại, khởi động lại bất ngờ, phần cứng bị hỏng, hoặc cập nhật gói. Trong khi Docker cung cấp chính sách khởi động lại ([FLT: 0], những chính sách này chỉ hoạt động khi trình nền Docker còn chạy. Hệ thống định vị — hệ thống init được dùng bởi Ubuntu, Debian, Fedora, CentOS, và hầu hết các bản phân phối Linux hiện đại – có thể làm việc này bằng cách quản lý thêm bằng cách tự quản lý xe đạp của trình nền Docker và có thể bắt đầu công cụ đóng hộp ngay cả trước khi ổ cắm của Docker có sẵn. Lợi ích của hệ thống này được dùng:

  • Bảo đảm thứ tự khởi động qua chỉ thị quan hệ phụ thuộc (v. d., sau mạng.tget, sau khi gõ xong. Service)
  • Việc ghi nhật ký hợp nhất qua , làm cho việc gỡ lỗi được dễ dàng
  • Điều khiển tốt hơn các giới hạn tài nguyên (CPU, bộ nhớ, I/O) sử dụng chỉ thị đơn vị hệ thống
  • Tự động khởi chạy lại khi bị lỗi với sự chậm trễ có thể cấu hình và phá vỡ giới hạn
  • Hỗ trợ kích hoạt ổ cắm và khởi chạy có thời gian

Bằng cách gói mỗi container trong một tập tin dịch vụ hệ thống, các đội tác chiến đạt được một giao diện nhất định để bắt đầu, dừng lại, và theo dõi các thùng chứa, giảm sự phụ thuộc vào các hệ thống quảng cáo và can thiệp bằng tay.

Tạo dịch vụ hệ thống cho một người chuyên chế

Cách tiếp cận thông thường bao gồm việc viết một tập tin đơn vị dịch vụ gọi là lệnh Docker để chạy và dừng công-te-nơ.

Bước 1: Ghi tập tin đơn giản dịch vụ

Tạo một tập tin tên . Hãy dùng mẫu sau là điểm khởi động:

[Unit]
Description=My Application Container
After=network-online.target docker.service
Wants=network-online.target
Requires=docker.service

[Service]
Restart=always
RestartSec=10
StartLimitBurst=3
ExecStartPre=-/usr/bin/docker kill myapp
ExecStartPre=-/usr/bin/docker rm myapp
ExecStart=/usr/bin/docker run --rm --name myapp \
 -e DB_HOST=10.0.1.50 \
 -e DB_PORT=5432 \
 -v /data/myapp:/app/data \
 -p 8080:8080 \
 myregistry/myapp:latest
ExecStop=/usr/bin/docker stop -t 10 myapp
ExecStopPost=-/usr/bin/docker rm myapp

[Install]
WantedBy=multi-user.target

Cách sắp xếp các chỉ thị quan trọng:

  • ) – bảo đảm trình nền Docker đang chạy trước khi khởi chạy container.
  • ) – nếu Docker bị dừng lại, dịch vụ này cũng ngừng lại.
  • [FLT:] ) – làm sạch bất kỳ thùng còn sót lại nào từ lần chạy trước ( thổ ngữ [FLT: 7) có nghĩa là thất bại ở đây là không có chất béo).
  • — dùng để tự động gỡ bỏ thùng khi nó dừng.
  • ) ) – duyên dáng dừng thùng lại với thời hạn (10 giây).
  • ) – khởi chạy lại hộp chứa bất kể mã thoát.
  • – đợi 10 giây trước khi khởi động lại.
  • ) – giới hạn bắt đầu lại 3 lần cố gắng trong mỗi khoảng thời gian (mặc định 10 giây) để tránh lặp lại vòng lặp.

Bước 2: Bật và bắt đầu dịch vụ

sudo systemctl daemon-reload
sudo systemctl enable myapp.service
sudo systemctl start myapp.service

nói với cho biết về các tập tin dịch vụ đọc lại. tạo giao diện tượng để dịch vụ bắt đầu khi khởi động lại.

Quản lý dịch vụ với những lệnh hệ thống

Khi dịch vụ đang chạy, bạn điều khiển nó như bất kỳ dịch vụ hệ thống nào khác:

  • Start:)
  • Dừng lại ) )
  • Khởi động lại:
  • )
  • Logs:) (Theo nhật ký trực tiếp)

Mẫu cấu hình nâng cao

Việc triển khai sản xuất thường đòi hỏi nhiều hơn đơn giản. Dưới đây là những tiến trình thông thường bạn có thể thêm vào tập tin dịch vụ hệ thống.

Chuyển biến môi trường

Không nên dùng những bí mật hoặc cấu hình cứng trong tập tin dịch vụ. Thay vào đó, hãy sử dụng tập tin môi trường riêng:

[Service]
EnvironmentFile=-/etc/myapp/env.conf
ExecStart=/usr/bin/docker run --rm --name myapp \
 --env-file /etc/myapp/env.conf \
 myregistry/myapp:latest

Tiền tố trước khi đường dẫn có nghĩa là dịch vụ sẽ khởi chạy ngay cả khi tập tin không tồn tại (thường dùng trong thiết lập ban đầu).

Đóng sách mạng và cổng

Đối với các thùng chứa cần phải liên lạc với nhau trên cùng một máy, hãy xem xét sử dụng hoặc mạng cầu do người dùng xác định. Ví dụ:

ExecStart=/usr/bin/docker run --rm --name web \
 --network=my-net \
 -p 443:443 \
 -v /etc/ssl/certs:/etc/ssl/certs:ro \
 myregistry/web:latest

Nếu dùng mạng riêng, bạn có thể thêm lệnh để tạo nó:

ExecStartPre=/usr/bin/docker network create my-net

Phụ thuộc lẫn nhau

Khi một container yêu cầu một công cụ khác phải sẵn sàng trước khi khởi động (v. d., một ứng dụng web đang đợi cơ sở dữ liệu), hệ thống có thể thực hiện điều lệnh. Tạo một tập tin dịch vụ thứ hai cho cơ sở dữ liệu và sau đó:

[Unit]
Description=Web App Container
After=network-online.target docker.service mydb.service
BindsTo=mydb.service

] Việc gắn xe đạp kéo dài của ứng dụng web vào thùng cơ sở dữ liệu — nếu cơ sở dữ liệu dừng lại, ứng dụng web cũng bị dừng lại.

Kiểm tra sức khỏe và đọc sách

Kiểm tra sức khỏe Docker có thể được kết hợp với hệ thống để ngăn chặn dịch vụ sớm.

ExecStartPost=/usr/local/bin/wait-for-health.sh http://localhost:8080/health 30

Văn lệnh nên thoát 0 chỉ khi nào công cụ này còn tốt. Nếu nó không thành công, hệ thống sẽ đánh dấu đơn vị là lỗi.

Giới hạn tài nguyên qua hệ thống

Bạn có thể ép buộc CPU và bộ nhớ của một container ở cấp c group mà không có cờ tài nguyên của Docker. Tính năng này đặc biệt hữu ích khi chạy nhiều thùng chứa trên một máy chủ:

[Service]
MemoryMax=512M
CPUQuota=50%

Những thiết lập này tạo một giới hạn khó mà hệ thống sẽ thực hiện độc lập với Docker.

Quản lý nhiều ngăn chứa: Trình soạn thảo Docker hệ thống

Đối với một số hộp nhỏ (v. d., 2-5), tập tin dịch vụ hệ thống cá nhân đơn giản và có thể bảo trì. Tuy nhiên, khi dự án bao gồm nhiều dịch vụ liên kết, trình soạn thảo Docker trở nên thuận tiện hơn. Bạn vẫn có thể sử dụng hệ thống để sắp xếp toàn bộ ngăn xếp các hộp đồ họa Docker bằng cách tạo một đơn vị dịch vụ duy nhất gọi . Ví dụ:

[Unit]
Description=My Application Stack
After=network-online.target docker.service
Requires=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/myapp
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down

[Install]
WantedBy=multi-user.target

Cách này cho bạn sự đơn giản của việc soạn thảo các dịch vụ xác định kết hợp với việc quản lý xe đạp của hệ thống.

Bạn nên chọn phương pháp nào?

  • dịch vụ có hệ thống ) – dịch vụ có thứ tự chính xác khi bạn cần giới hạn tài nguyên riêng – tốt nhất cho ứng dụng di sản, dịch vụ với các dịch vụ có quy định bắt đầu, hoặc khi bạn cần giới hạn tài nguyên cho mỗi đối tượng.
  • Trình soạn thảo hệ thống ) – lý tưởng cho dịch vụ vi mô chồng các gói phụ thuộc được quản lý nội bộ bởi dàn bài, và bạn muốn một đơn vị quản lý toàn bộ nhóm.

Vấn đề khó giải quyết

Ngay cả khi được sắp đặt kỹ lưỡng, bạn cũng có thể gặp vấn đề, dưới đây thường là những cạm bẫy và giải pháp của chúng.

Dịch vụ thất bại với “Không thể kết nối đến trình nền Docker

Điều này thường có nghĩa là dịch vụ bắt đầu trước khi ổ cắm Docker sẵn sàng. Bảo đảm đơn vị của bạn có và . Cũng kiểm tra xem trình nền Docker có được bật: .

Bộ chứa bắt đầu lại trong một vòng lặp

Nếu thùng này thoát ra ngay lập tức, hệ thống sẽ tiếp tục khởi chạy lại nó theo và . Hãy kiểm tra các bản ghi . Tăng (v. g, 30 giây) và đặt để tránh một vòng bận rộn.

Phụng sự không ngừng trong sạch

Một bản cấu hình sai có thể để thùng đó chạy. Kiểm tra xem sử dụng tên hộp đúng. Hãy dùng để gỡ bỏ hộp nếu dừng lại.

Biến

Nếu bạn dùng , xác nhận tập tin tồn tại và có thể đọc bằng người chủ. Tránh trích dẫn những vấn đề – có mã hoá được trích dẫn từ giá trị biến. Để tiêm mật, hãy xem xét sử dụng giấy ủy nhiệm hệ thống hoặc bộ quản lý bí mật đã dâng hiến.

Những sự xem xét an ninh

Chạy các hộp đựng Docker thông qua hệ thống nâng lên một số điểm bảo mật:

  • Luôn luôn chạy dịch vụ có hệ thống như là người dùng không phải gốc nếu có thể (dùng và , nhưng bảo đảm người dùng có quyền truy cập ổ cắm Docker hoặc chạy trong chế độ không có người chủ).
  • Tránh dùng trong đơn vị có hệ thống trừ khi hoàn toàn cần thiết.
  • Dùng các gắn kết chỉ đọc ( khi nào công cụ không cần phải ghi cho máy.
  • của Levercraid để làm cứng đội chống lại những kẻ đào tẩu.
[Service]
ProtectSystem=strict
ReadWritePaths=/var/log/myapp
PrivateTmp=true
User=myappuser

Tài nguyên bên ngoài

Để đọc thêm, hãy tham khảo những tài liệu tham khảo chính thức sau:

Kết luận

Kết hợp với các hộp công cụ Docker cho bạn một cơ chế khởi động tự động mạnh mẽ, tích hợp chặt chẽ với phần còn lại của hệ thống Linux. Bằng cách viết tập tin đơn vị dịch vụ có cấu trúc tốt, bạn có thể điều khiển thứ tự khởi động, quản lý các phụ thuộc, đặt giới hạn tài nguyên, và theo dõi bản ghi sử dụng công cụ của đội hành động của bạn đã biết. Dù bạn chọn dịch vụ cá nhân cho mỗi container hay một đơn vị để sắp xếp một chồng, hệ thống cung cấp sự đáng tin cậy và dự đoán môi trường sản xuất.

Bắt đầu với một tập tin đơn vị đơn giản, kiểm tra nó kỹ lưỡng, sau đó phân loại các tùy chọn cấp cao như tập tin môi trường, kiểm tra sức khỏe và bảo mật bị cứng. Với cách tiếp cận này, các hộp Docker sẽ sống sót sau khi khởi động lại, sụp đổ, và cấu hình thay đổi mà không cần sự can thiệp bằng tay, giải phóng đội của bạn để tập trung vào các ứng dụng xây dựng.