Chạy Docker bên trong Docker (còn gọi là dind ), trong khi có thể, nên tránh, nếu có thể. (Nguồn được cung cấp dưới đây.) Thay vào đó, bạn muốn thiết lập một cách để thùng chứa chính của bạn sản xuất và liên lạc với các thùng chứa anh chị em .
Jérôme Petazzoni - tác giả của tính năng giúp Docker có thể chạy bên trong một container Docker - thực sự đã viết một bài đăng trên blog nói rằng không nên làm điều đó . Trường hợp sử dụng mà anh mô tả khớp với trường hợp sử dụng chính xác của OP của bộ chứa CI Docker cần chạy các công việc bên trong các bộ chứa Docker khác.
Petazzoni liệt kê hai lý do tại sao dind gây rắc rối:
- Nó không hợp tác tốt với Mô-đun bảo mật Linux (LSM).
- Nó tạo ra một sự không phù hợp trong các hệ thống tệp tạo ra các vấn đề cho các thùng chứa được tạo bên trong các thùng chứa cha.
Từ bài đăng trên blog, ông mô tả các phương án sau,
[Cách] đơn giản nhất là chỉ để lộ ổ cắm Docker vào thùng chứa CI của bạn, bằng cách gắn kết nó với -v
cờ.
Nói một cách đơn giản, khi bạn khởi động thùng chứa CI của mình (Jenkins hoặc loại khác), thay vì hack một cái gì đó cùng với Docker-in-Docker, hãy khởi động nó bằng:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
Bây giờ container này sẽ có quyền truy cập vào ổ cắm Docker, và do đó sẽ có thể bắt đầu các container. Ngoại trừ việc thay vì bắt đầu các container "con", nó sẽ bắt đầu các container "anh chị em".