2013-08-04 75 views
12

Tôi đang thực hiện một số thử nghiệm ban đầu với docker. Hiện tại tôi có hình ảnh của mình và tôi có thể đặt một số thùng chứa đang chạy, với:Tự động bắt đầu dịch vụ trong vùng chứa Docker

docker ps 

Tôi làm docker attach container_id và bắt đầu dịch vụ apache2.

Sau đó từ bảng điều khiển chính, tôi chuyển vùng chứa đó đến hình ảnh.

Sau khi thoát khỏi vùng chứa, nếu tôi cố bắt đầu vùng chứa hoặc cố gắng chạy một vùng chứa mới từ hình ảnh đã cam kết, dịch vụ luôn bị dừng.

Cách tạo hoặc khởi động lại một vùng chứa với các dịch vụ đã bắt đầu, ví dụ như apache?

Trả lời

25

EDIT: Tôi đã học được rất nhiều về Docker kể từ khi đăng câu trả lời này. "Bắt đầu dịch vụ tự động trong vùng chứa Docker" không phải là mẫu sử dụng tốt cho Docker. Thay vào đó, hãy sử dụng một cái gì đó như fleet, Kubernetes hoặc thậm chí là Monit/SystemD/Upstart/Init.d/Cron để tự động bắt đầu các dịch vụ thực thi bên trong vùng chứa Docker.

ORIGINAL ĐÁP: Nếu bạn đang bắt đầu container với lệnh /bin/bash, sau đó bạn có thể thực hiện điều này theo cách thức nêu ở đây: https://stackoverflow.com/a/19872810/2971199

Vì vậy, nếu bạn đang bắt đầu container với docker run -i -t IMAGE /bin/bash và nếu bạn muốn tự động khởi động apache2 khi vùng chứa được bắt đầu, chỉnh sửa /etc/bash.bashrc trong vùng chứa và thêm /usr/local/apache2/bin/apachectl -f /usr/local/apache2/conf/httpd.conf (hoặc bất kỳ lệnh bắt đầu apache2 nào của bạn) vào dòng mới ở cuối tệp.

Lưu thay đổi vào hình ảnh của bạn và khởi động lại với docker run -i -t IMAGE /bin/bash và bạn sẽ thấy apache2 chạy khi bạn đính kèm.

+0

điểm tốt /etc/bash.bashrc –

+6

'/ etc/bash.bashrc' sẽ được thực hiện trên mỗi khởi động bash có thể gây ra vấn đề nếu sau này bạn muốn tương tác với vùng chứa (ví dụ như thực thi 'docker exec -ti ID bash') ... Tôi nghĩ đây không phải là nơi thích hợp để đặt các tập lệnh khởi động cho các dịch vụ như apache2 –

+0

Đồng ý Petr. Tôi đã học về Docker kể từ khi tôi đăng câu trả lời này, và trong khi nó hoạt động, nó không phải ở tất cả các cách chúng tôi thực sự sử dụng Docker trong cuộc sống thực. – damick

4

Tôi đoán bạn không thể. Những gì bạn có thể làm là tạo một hình ảnh bằng cách sử dụng một Dockerfile và xác định một CMD trong đó, sẽ được thực hiện khi container bắt đầu. Xem tài liệu về người xây dựng để biết thông tin cơ bản (https://docs.docker.com/reference/builder/) và xem Run a service automatically in a docker container để biết thông tin về cách duy trì dịch vụ của bạn.

Bạn không cần phải tự động hóa việc này bằng Dockerfile. Bạn cũng có thể tạo hình ảnh thông qua một cam kết thủ công như bạn làm, và chạy nó dòng lệnh. Sau đó, bạn cung cấp lệnh cần chạy (chính xác là những gì mà Dockerfile CMD thực sự làm). Bạn cũng có thể ghi đè lên Dockerfiles CMD theo cách này: chỉ có CMD mới nhất sẽ được thực thi, đó là lệnh dòng lệnh nếu bạn bắt đầu sử dụng một thùng chứa. Lệnh cơ bản docker run -i -t base /bin/bash từ tài liệu là một ví dụ. Nếu lệnh của bạn trở nên quá dài, bạn có thể tạo một kịch bản tiện lợi của khóa học.

2

Theo thiết kế, các thùng chứa bắt đầu ở lối thoát chế độ tách rời khi quá trình gốc được sử dụng để chạy thoát khỏi vùng chứa. Bạn cần khởi động dịch vụ Apache ở chế độ FOREGROUND.

docker run -p 8080:80 -d ubuntu/apache apachectl -D FOREGROUND 

tham khảo: https://docs.docker.com/engine/reference/run/#detached-vs-foreground