Vài ngày trước, tôi đã xuất bản hướng dẫn dài và kỹ lưỡng của mình về Docker, một công nghệ ảo hóa cấp hệ điều hành dựa trên LXC, cung cấp một phương pháp nhanh, nhẹ và an toàn để cung cấp các ứng dụng vùng chứa. Đáng yêu.
Bây giờ, một trong những vấn đề chúng tôi gặp phải khi thử nghiệm các dịch vụ đầu tiên của mình, SSH và Apache, là việc kiểm soát các dịch vụ này. Chúng tôi không có init script hoặc systemd bên trong các thùng chứa và thành thật mà nói, chúng tôi có thể không muốn chúng. Nhưng chúng tôi muốn một số loại cơ chế để bắt đầu, dừng và không có dịch vụ của chúng tôi. Giới thiệu người giám sát, do đó hướng dẫn này. Làm ơn đi theo tôi.
Tóm tắt về giám sát
Supervisord là một hệ thống kiểm soát quy trình, được thiết kế để theo dõi và kiểm soát các quy trình. Nó không nhằm mục đích thay thế init, thay vào đó, nó đóng gói các quy trình bên trong khung của chính nó và có thể khởi động chúng khi khởi động, giống như chúng ta muốn. Không có lý do gì để đi sâu hơn về phần mềm vào thời điểm này.
Thiết lập giám sát
Về cơ bản, Supervisord là một mô-đun python. Nó có thể được cài đặt bằng easy_install, là một phần của setuptools, bản thân nó là một phần mở rộng của gói Python distutils. Vâng, nó trở nên khá phức tạp vào thời điểm này. May mắn thay, hầu hết các bản phân phối Linux đều có easy_install, bao gồm cả CentOS, đây là nền tảng thử nghiệm của chúng tôi trong ngày.
Để bắt đầu, chúng ta sẽ cần cài đặt Supervisord bên trong một thùng chứa. Sau đó, chúng tôi sẽ cam kết hình ảnh và sử dụng nó làm cơ sở cho các bản dựng của chúng tôi, bao gồm các dịch vụ như SSH và Apache đã nói ở trên. Nếu bạn cố gắng cài đặt Supervisord trên máy chủ của mình, bạn sẽ thành công mà không gặp bất kỳ sự cố nào:
người giám sát easy_install
Tìm kiếm người giám sát
Đọc https://pypi.python.org/simple/supervisor/
Phù hợp nhất:giám sát viên 3.1.3
Đang tải xuống https://pypi.python.org/packages/source/s/supervisor/
người giám sát-3.1.3.tar.gz#md5=aad263c4fbc070de63dd354864d5e552
Trình giám sát xử lý-3.1.3.tar.gz
Viết /tmp/easy_install-vbOcMG/supervisor-3.1.3/setup.cfg
Đang chạy Supervisor-3.1.3/setup.py -q bdist_egg --dist-dir /tmp/easy_install-vbOcMG/supervisor-3.1.3/egg-dist-tmp-i96mIs
cảnh báo:không tìm thấy tệp được đưa vào trước đó khớp với '*' trong thư mục 'docs/.build'
Thêm người giám sát 3.1.3 vào tệp easy-install.pth
Cài đặt tập lệnh echo_supervisord_conf vào /usr/bin
Cài đặt tập lệnh pidproxy vào /usr/bin
Cài đặt tập lệnh giám sát vào /usr/bin
Cài đặt tập lệnh giám sát vào /usr/bin
Cài đặt
/usr/lib/python2.7/site-packages/supervisor-3.1.3-py2.7.egg
Xử lý phụ thuộc cho người giám sát
Đang tìm kiếm meld3>=0.6.5
Đọc https://pypi.python.org/simple/meld3/
Phù hợp nhất:meld3 1.0.2
Đang tải xuống https://pypi.python.org/packages/source/m/meld3/
meld3-1.0.2.tar.gz#md5=3ccc78cd79cffd63a751ad7684c02c91
Xử lý meld3-1.0.2.tar.gz
Viết /tmp/easy_install-wnhLVS/meld3-1.0.2/setup.cfg
Chạy meld3-1.0.2/setup.py -q bdist_egg --dist-dir /tmp/easy_install-wnhLVS/meld3-1.0.2/egg-dist-tmp-Lp88cX
cờ zip_safe không được đặt; phân tích nội dung lưu trữ...
Thêm meld3 1.0.2 vào tệp easy-install.pth
Đã cài đặt /usr/lib/python2.7/site-packages/meld3-1.0.2-py2.7.egg
Đã xử lý xong phần phụ thuộc cho người giám sát
Bên trong một bộ chứa, bạn sẽ gặp lỗi vì khung Python được thêm vào bộ chứa chưa hoàn chỉnh và một số mô-đun bị thiếu.
# giám sát easy_install
Traceback (cuộc gọi gần đây nhất cuối cùng):
Tệp "/usr/bin/easy_install", dòng 5, trong
từ pkg_resource nhập load_entry_point
ImportError:Không có mô-đun nào có tên pkg_resources
Điều này có nghĩa là chúng ta sẽ cần thiết lập thủ công easy_install:
wget https://bitbucket.org/pypa/setuptools/raw/ ->
-> bootstrap/ez_setup.py -O - | con trăn
Cấu hình giám sát
Bước tiếp theo là tạo cấu hình cho vùng chứa. Chúng tôi có thể tạo tệp trên máy chủ, sau đó chúng tôi sẽ sao chép tệp đó vào hình ảnh của mình trong quá trình xây dựng bằng cách sử dụng lệnh COPY trong Dockerfile của chúng tôi.
SAO CHÉP ./supervisord.conf /etc/supervisord.conf
Bản thân cấu hình sẽ giống như:
[giám sát]
gật đầu =đúng
[chương trình:sshd]
lệnh =/usr/sbin/sshd -D
[chương trình:httpd]
command=/bin/bash -c "exec /usr/sbin/httpd -DFOREGROUND"
Chúng ta có gì ở đây? Mỗi cặp dấu ngoặc vuông xác định một phần. Đối với bản thân Supervisord, chúng tôi xác định rằng nó nên bắt đầu ở nền trước thay vì tự daemon hóa chính nó, điều đó có nghĩa là trở thành một dịch vụ nền.
Đối với chương trình có tên sshd, chúng tôi thực thi lệnh có liên quan, về cơ bản là chạy SSHD trong nền. Đối với chương trình có tên httpd, chúng tôi khởi động máy chủ ở nền trước, trong một trình bao riêng biệt. Có nhiều tùy chọn khác có sẵn, nhưng hiện tại, đây là mức tối thiểu mà chúng tôi cần để bắt đầu với giám sát.
Chạy vùng chứa &khắc phục sự cố
Sau khi chúng tôi xây dựng hình ảnh của mình và chạy nó, giám sát viên sẽ khởi động và bắt đầu các quy trình của chúng tôi. Nhưng trước tiên, hãy giải quyết một số lỗi phổ biến. Một cái mà bạn có thể thấy là:
docker run -ti -p 22 -p 80 image-3:mới nhất
/usr/lib/python2.7/site-packages/supervisor-3.1.3-py2.7.egg/
Supervisor/options.py:296:UserWarning:Supervisord đang chạy với quyền root và nó đang tìm kiếm tệp cấu hình của nó ở các vị trí mặc định (bao gồm cả thư mục làm việc hiện tại của nó); bạn có thể muốn chỉ định đối số "-c" chỉ định đường dẫn tuyệt đối đến tệp cấu hình để tăng cường bảo mật.
'Supervisord đang chạy với quyền root và nó đang tìm kiếm'
Lỗi:Không tìm thấy tệp cấu hình tại các đường dẫn mặc định (/usr/etc/supervisord.conf, /usr/supervisord.conf, Supervisord.conf, etc/supervisord.conf, /etc/supervisord.conf); sử dụng tùy chọn -c để chỉ định tệp cấu hình ở một đường dẫn khác
Để được trợ giúp, hãy sử dụng /usr/bin/supervisord -h
Nếu bạn đã chỉ định một đường dẫn sai cho tệp supervisord.conf hoặc sử dụng một tên sai, thì dịch vụ sẽ không thể chạy. Bạn sẽ phải chỉnh sửa hướng dẫn SAO CHÉP, xây dựng lại hình ảnh của mình và bắt đầu lại. Sau đó, lỗi tiếp theo bạn có thể gặp phải là:
# docker run -ti -p 22 -p 80 image-3:latest
/usr/lib/python2.7/site-packages/supervisor-3.1.3-py2.7.egg/
Supervisor/options.py:296:UserWarning:Supervisord đang chạy với quyền root và nó đang tìm kiếm tệp cấu hình của nó ở các vị trí mặc định (bao gồm cả thư mục làm việc hiện tại của nó); bạn có thể muốn chỉ định đối số "-c" chỉ định đường dẫn tuyệt đối đến tệp cấu hình để tăng cường bảo mật.
'Supervisord đang chạy với quyền root và nó đang tìm kiếm'
372 CRIT Supervisor chạy bằng root (không có người dùng trong tệp cấu hình)
375 Người giám sát INFO đã bắt đầu với pid 1
378 INFO sinh ra:'httpd' với pid 9
381 INFO sinh ra:'sshd' với pid 10
602 INFO đã thoát:httpd (trạng thái thoát 1; không mong đợi)
606 INFO sinh ra:'httpd' với pid 11
606 INFO thành công:sshd đã vào trạng thái CHẠY, quá trình đã duy trì hơn 1 giây (startsecs)
671 INFO đã thoát:httpd (trạng thái thoát 1; không mong đợi)
676 INFO sinh ra:'httpd' với pid 12
742 INFO đã thoát:httpd (trạng thái thoát 1; không mong đợi)
749 INFO sinh ra:'httpd' với pid 13
825 THÔNG TIN đã thoát:httpd (trạng thái thoát 1; không mong đợi)
826 INFO đã bỏ cuộc:httpd đã vào trạng thái FATAL, quá nhiều bắt đầu thử lại quá nhanh
đã bỏ cuộc:httpd đã vào trạng thái FATAL, quá nhiều lần bắt đầu thử lại quá nhanh
Những gì chúng tôi có ở đây là các luồng Apache thoát ra, buộc người giám sát phải thử bắt đầu lại chúng và cuối cùng bỏ cuộc, điều này dẫn chúng tôi đến trạng thái nghiêm trọng. Vùng chứa của chúng tôi gần như vô dụng vào thời điểm này.
Ở đây, giải pháp là chỉnh sửa tệp giám sát.conf và giới thiệu các lệnh bổ sung cho phần chương trình httpd, phần này sẽ xử lý quá trình sinh sản theo cách nhẹ nhàng hơn.
[chương trình:httpd]
bắt đầu giây =0
tự khởi động lại =sai
command=/bin/bash -c "exec /usr/sbin/httpd -DFOREGROUND"
Chúng tôi đã thêm startsecs =0 và autorestart =false. Chỉ thị đầu tiên cho chúng ta biết:
Tổng số giây mà chương trình cần tiếp tục chạy sau khi khởi động để coi là khởi động thành công. Nếu chương trình không duy trì trong nhiều giây này sau khi bắt đầu, ngay cả khi chương trình thoát với mã thoát dự kiến (xem mã thoát), quá trình khởi động sẽ bị coi là thất bại.
Điều thứ hai có nghĩa là người giám sát sẽ không xử lý các khởi động lại chuỗi Apache và những điều này sẽ được xử lý bởi chính máy chủ Web, vì nó xử lý các yêu cầu HTTP đến.
Có thể là một trong những sai, bất ngờ, hoặc đúng. Nếu sai, quá trình sẽ không bao giờ được tự động khởi động lại. Nếu không mong muốn, quy trình sẽ được khởi động lại khi chương trình thoát với mã thoát không phải là một trong các mã thoát được liên kết với cấu hình quy trình này (xem mã thoát). Nếu đúng, quy trình sẽ được khởi động lại vô điều kiện khi nó thoát ra mà không cần quan tâm đến mã thoát của nó.
Bây giờ, chúng ta có thể thử chạy lại vùng chứa. Bạn có nhớ vấn đề /run/httpd mà chúng tôi gặp phải trong hướng dẫn ban đầu không? Nếu không có thư mục /run, bạn sẽ thấy các thông báo sau:
docker run -ti -p 22 -p 80 image-3:mới nhất
/usr/lib/python2.7/site-packages/supervisor-3.1.3-py2.7.egg/
Supervisor/options.py:296:UserWarning:Supervisord đang chạy với quyền root và nó đang tìm kiếm tệp cấu hình của nó ở các vị trí mặc định (bao gồm cả thư mục làm việc hiện tại của nó); bạn có thể muốn chỉ định đối số "-c" chỉ định đường dẫn tuyệt đối đến tệp cấu hình để tăng cường bảo mật.
'Supervisord đang chạy với quyền root và nó đang tìm kiếm'
913 CRIT Supervisor chạy bằng root (không có người dùng trong tệp cấu hình)
916 INFO người giám sát đã bắt đầu với pid 1
919 INFO được sinh ra:'httpd' với pid 8
921 INFO sinh ra:'sshd' với pid 9
079 THÔNG TIN thành công:httpd đã vào trạng thái CHẠY, quá trình đã duy trì hơn 0 giây (bắt đầu giây)
105 THÔNG TIN đã thoát:httpd (trạng thái thoát 0; dự kiến)
120 INFO gặt chưa biết pid 10
122 THÔNG TIN thành công:sshd đã vào trạng thái CHẠY, quá trình đã duy trì hơn 1 giây (startsec)
Tại thời điểm này, bạn phải kết nối (đính kèm hoặc thực thi shell BASH) với bộ chứa, kiểm tra nhật ký và cố gắng hiểu tại sao dịch vụ không chạy như mong đợi.
Thử nghiệm thành công
Và sau đó, sau khi chúng tôi sắp xếp xong mọi thứ:
Kết luận
Đây là một hướng dẫn khá nerdy. Nhưng nó giới thiệu một công cụ hữu ích khác vào kho vũ khí của chúng tôi, mà giờ đây chúng tôi có thể sử dụng để kiểm soát các dịch vụ bên trong các vùng chứa một cách mạnh mẽ và thanh lịch mà không cần phải cài đặt các khung phức tạp, đắt tiền như systemd. Nó cũng dạy thêm về Docker, cách làm việc và khắc phục sự cố, v.v.
Giám sát không thực sự cần thiết, bởi vì chúng tôi đã quản lý để chạy các quy trình sshd và httpd của mình mà không có nó, nhưng một số người có thể thích phương pháp này hơn, đặc biệt nếu họ phải khởi động và khởi động lại dịch vụ của mình khá thường xuyên. Dù bằng cách nào, việc làm quen với tiện ích này sẽ giúp xây dựng sự hiểu biết và tự tin vào cơ chế Docker. Tôi hy vọng bạn thấy hướng dẫn này hữu ích và vui lòng gửi yêu cầu của bạn về những gì chúng ta nên khám phá tiếp theo.
Chúc mừng.