2015-01-10 41 views
62

Tôi đang chạy Jenkins bên trong vùng chứa Docker. Tôi tự hỏi nếu nó ok cho container Jenkins cũng là một máy chủ Docker? Những gì tôi đang nghĩ đến là để bắt đầu một container docker mới cho mỗi xây dựng thử nghiệm tích hợp từ bên trong Jenkins (để bắt đầu cơ sở dữ liệu, môi giới tin nhắn, vv). Các thùng chứa do đó sẽ được tắt sau khi kiểm tra tích hợp được hoàn thành. Có lý do nào để tránh chạy các thùng chứa docker từ bên trong một thùng chứa docker khác theo cách này không?Có thể chạy docker từ bên trong docker không?

+6

Khả năng khác là gắn ổ cắm đế từ máy chủ dưới dạng ổ đĩa trong vùng chứa. Điều đó cho phép bạn tạo các thùng chứa "anh chị em" và có lợi thế là có thể sử dụng lại bộ nhớ cache. –

+1

Tôi đã tìm thấy rằng khi sử dụng docker socket từ máy chủ trong trường hợp tôi muốn gắn kết khối lượng bên ngoài, nó cần thiết để thiết lập đường dẫn khối lượng tương đối với host như là nơi docker daemon chạy. Thiết lập nó tương đối so với container bắt đầu container sẽ không nhất thiết phải làm việc trừ khi các đường dẫn trùng với nhau. –

Trả lời

76

Chạy bộ điều khiển bên trong Docker (a.k.a. dind), trong khi có thể, nên tránh, nếu có thể. (Nguồn được cung cấp bên dưới.) Thay vào đó, bạn muốn thiết lập cách để vùng chứa chính của bạn sản xuất và giao tiếp với các vùng chứa anh chị em.

Jérôme Petazzoni - tác giả của đối tượng địa lý làm cho Docker có thể chạy bên trong vùng chứa Docker - thực sự đã viết a blog post saying not to do it. Trường hợp sử dụng mà ông mô tả phù hợp với trường hợp sử dụng chính xác của OP đối với thùng chứa CI Docker cần chạy các công việc bên trong các vùng chứa Docker khác.

Petazzoni liệt kê hai lý do tại sao dind là phiền hà:

  1. Nó không hợp tác tốt với Linux Security Modules (LSM).
  2. Nó tạo ra sự không phù hợp trong các hệ thống tệp gây ra sự cố cho các vùng chứa được tạo bên trong vùng chứa chính.

Từ đó bài viết trên blog, ông mô tả sự thay thế sau,

[The] Cách đơn giản nhất là chỉ cần tiếp xúc với ổ cắm Docker để chứa CI của bạn, bằng cách ràng buộc tháo lắp nó với -v cờ.

một cách đơn giản, khi bạn bắt đầu chứa CI của bạn (Jenkins hoặc khác), thay vì hack một cái gì đó cùng với Docker-in-Docker, bắt đầu nó với:

docker run -v /var/run/docker.sock:/var/run/docker.sock ... 

Bây giờ chứa này sẽ có quyền truy cập vào các Docker socket, và do đó sẽ có thể bắt đầu container. Ngoại trừ việc thay vì bắt đầu container "con", nó sẽ bắt đầu "anh chị em" container.

+0

Làm thế nào để chạy lệnh docker mà không có 'sudo' khi làm như thế này? Cảm ơn – c4k

+0

Bạn cần thêm người dùng vào nhóm 'docker':' sudo usermod -aG docker $ USER'. Bạn sẽ cần phải relog sau đó. – predmijat

+0

Làm thế nào để relog từ trong một cointainer? – thiagowfx

24

Tôi đã trả lời câu hỏi tương tự trước đây trên how to run a Docker container inside Docker.

Để chạy docker bên trong docker chắc chắn là có thể. Điều chính là bạn run thùng chứa bên ngoài với extra privileges (bắt đầu bằng --privileged=true) và sau đó cài đặt đế trong ngăn chứa đó.

Kiểm tra bài đăng trên blog này để biết thêm thông tin: Docker-in-Docker.

Một trường hợp sử dụng tiềm năng cho trường hợp này được mô tả trong this entry. Blog mô tả cách xây dựng các vùng chứa docker trong một thùng chứa Docker của Jenkins.

Tuy nhiên, Docker bên trong Docker không phải là phương pháp được khuyến nghị để giải quyết loại sự cố này. Thay vào đó, phương pháp được đề xuất là tạo các vùng chứa "anh chị em" là described in this post

Vì vậy, chạy Docker bên trong Docker được nhiều người coi là một giải pháp tốt cho loại sự cố này. Bây giờ, xu hướng là sử dụng "anh chị em" container thay thế. Xem the answer by @predmijat on this page để biết thêm thông tin.

+0

Xem nhận xét bên dưới về cách tránh trình cắm trong docker. –

Các vấn đề liên quan