Làm cách nào tôi có thể chạy một hệ điều hành đầy đủ trong bộ chứa Docker mà không chỉ định lệnh?


25

Tôi đang theo dõi Tài liệu Docker CoreOS và nó đề cập đến việc bắt đầu các thùng chứa với các lệnh như:

docker run someImageName /bin/somebinary

Đâu someImageNamelà một hình ảnh. Khi / bin / somebinary thoát, hình ảnh sẽ không còn chạy.

Tôi chỉ đơn giản muốn chạy một hình ảnh, mà không chỉ định bất kỳ nhị phân nào để chạy. Thay vào đó, tôi chỉ đơn giản muốn chạy các dịch vụ (ví dụ: systemd / sysvinit) thường chạy bên trong hệ điều hành hình ảnh .

Đây có vẻ như là điều phổ biến nhất mà bất kỳ ai cũng muốn làm với Docker, nhưng cố gắng chạy một hình ảnh mà không có lệnh trả về:

2014/02/05 14:49:19 Error: create: No command specified

Làm cách nào tôi có thể khởi động một Docker container và chạy một hệ điều hành đầy đủ, thay vì chỉ định một lệnh ?



@FredtheMagicWonderDog Không hoàn toàn, mặc dù câu trả lời là như nhau.
mikemaccana

Câu trả lời:


24

Như tài liệu ở đây, bạn chỉ cần chạy /sbin/initnhư lệnh giống như bất kỳ khởi động unix nào khác từ chế độ một người dùng sang chế độ nhiều người dùng.

/programming/19332662/start-full-container-in-docker

Các container có thể là hệ điều hành đầy đủ, chúng không cần phải như vậy (cũng không phải VM cho vấn đề đó, việc cấu hình và quản lý sẽ phức tạp hơn).

Tôi muốn nói rằng toàn bộ quan điểm của Docker là làm cho các thùng chứa ứng dụng trở nên dễ dàng, để bạn chỉ phải định cấu hình một ứng dụng chứ không phải toàn bộ HĐH.


Cảm ơn. Sau khi bắt đầu hình ảnh với / sbin / init, tôi đã chạy docker ps -notrunc, để lấy ID container, sau đó sudo /usr/sbin/lxc-attach -n containerIDđể vào hình ảnh đang chạy. Như các poster khác đề cập, tôi thực sự không cần một init thứ hai, vì vậy tôi sẽ kiểm tra các container đơn lệnh tiếp theo ...
mikemaccana

Nói rằng bạn không cần chạy HĐH đầy đủ trong VM cũng giống như nói rằng bạn không cần chạy HĐH đầy đủ trong một máy vật lý, vâng đúng là hạt nhân về cơ bản chỉ là một x86 / C thông thường chương trình chạy mà không có stdlib và init cũng vậy, nhưng đó là
Lie Ryan

11

Docker là một hệ thống để quản lý và triển khai các thùng chứa ứng dụng , không phải các thùng chứa hệ điều hành . Có vẻ như bạn đang kết hợp chạy một container docker với việc khởi động một hệ điều hành.

Các thùng chứa Docker của bạn phải là các ứng dụng đơn mục đích, có phạm vi rất hẹp có thể được bắt đầu bằng một lệnh duy nhất. Nếu bạn đang tìm kiếm thứ gì đó phức tạp hơn thế, thì Docker không phải là giải pháp bạn đang tìm kiếm. Trong trường hợp đó, hãy kiểm tra KVM, ESXi, OpenVZ, LXD , v.v.

Nếu bạn chỉ tìm kiếm cách bạn có thể chỉ định mặc định CMDENTRYPOINTcho các thùng chứa của mình, bạn có thể làm điều đó vào thời gian xây dựng bằng cách sử dụng Dockerfile.


5
Tôi biết Docker là gì. Tôi sẽ chỉ ra rằng các thùng chứa ứng dụng dựa trên các hệ điều hành, ví dụ: Fedora hoặc Ubuntu. Các ứng dụng liên tục trên Unix - ngay cả không gian người dùng chỉ có các Unix như container Docker - được bắt đầu từ các tệp initscripts hoặc systemd. Ví dụ: nếu ứng dụng của tôi gặp sự cố, tôi muốn ứng dụng tự động khởi động lại, với ngưỡng giống như systemd cung cấp.
mikemaccana

5
Bạn đang cố nhồi nhét quá nhiều vào thùng chứa của mình - chúng không phải là hệ điều hành. Giám sát quá trình nên được xử lý bên ngoài của mỗi container.
EEAA

1
Vì vậy, nếu một quá trình chết ... chỉ cần khởi động lại toàn bộ container? Tôi đoán rằng nó không quá đắt để có thể ổn. Nó cảm thấy kỳ lạ - thùng chứa của tôi có / sbin / init, nhưng nó không bao giờ được sử dụng ...
mikemaccana

1
Vâng, đó là ý tưởng. Container của bạn có một /sbin/init, nhưng nó không phải có nó. Bạn có thể đã sử dụng một bộ chứa ubfox mặc định hoặc một cái gì đó tương tự. Có rất nhiều bit trong các thùng chứa này có thể được gỡ bỏ nếu bạn muốn.
EEAA

1
@ValkoSipuli Bạn chắc chắn có thể giữ quan điểm đó. Tôi vẫn duy trì việc chạy nhiều hơn một quy trình bên trong một thùng chứa phủ nhận phần lớn lý do sử dụng các container ở nơi đầu tiên. Có một nơi để chạy một hệ điều hành trong một container? Có lẽ. Tuy nhiên, đó là một ngoại lệ và không nên được thực hiện mà không cân nhắc nhiều về ưu / nhược điểm.
EEAA

5

Để chạy một hệ điều hành đầy đủ trong một thùng chứa, hãy tạo Dockerfile sau:

FROM fedora:25

CMD /sbin/init

Sau đó xây dựng và khởi động container và nhập shell bên trong nó để khám phá các dịch vụ chạy bên trong nó:

docker build -t os .
docker run -d --privileged --name os os
docker exec -it os bash

Dịch vụ systemd đầy đủ bên trong container. Đẹp.


0
docker pull ubuntu

Chỉ cần chạy từ cùng một hình ảnh nhiều lần là cần thiết. Các thùng chứa mới sẽ được tạo và sau đó chúng có thể được khởi động và dừng từng cái lưu cấu hình của chính nó. Để thuận tiện cho bạn, sẽ tốt hơn nếu đặt cho mỗi thùng chứa của bạn một tên bằng "--name".

Fi:

docker run --name MyContainer1 <ubuntu image>
docker run --name MyContainer2 <ubuntu image>
docker run --name MyContainer3 <ubuntu image>

Đó là nó.

$ docker ps
CONTAINER ID        IMAGE            CREATED          STATUS               NAMES
a7e789711e62        67759a80360c   12 hours ago     Up 2 minutes         MyContainer1
87ae9c5c3f84        67759a80360c   12 hours ago     Up About a minute    MyContainer2
c1524520d864        67759a80360c   12 hours ago     Up About a minute    MyContainer3

Sau đó, bạn có các thùng chứa của mình được tạo mãi mãi và bạn có thể bắt đầu và dừng chúng như VM.

docker start MyContainer1

Để vào trong container và làm những gì bạn muốn làm:

docker exec -it MyContainer1 bash
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.