Trang chủ Thủ Thuật Cách (và tại sao) chạy Docker Inside Docker

Cách (và tại sao) chạy Docker Inside Docker

0
13

Cách (và tại sao) chạy Docker Inside Docker

993634a1 12

Chạy Docker bên trong Docker cho phép bạn xây dựng hình ảnh và bắt đầu các vùng chứa trong một môi trường đã được chứa sẵn. Có hai cách tiếp cận để đạt được điều này tùy thuộc vào việc bạn muốn bắt đầu các container con hay anh chị em.

Quyền truy cập vào Docker từ bên trong vùng chứa Docker thường được mong muốn nhất trong ngữ cảnh của hệ thống CI và CD. Việc lưu trữ các tác nhân chạy đường ống của bạn bên trong vùng chứa Docker là điều phổ biến. Bạn sẽ kết thúc bằng cách sử dụng chiến lược Docker-in-Docker nếu một trong các giai đoạn đường ống của bạn sau đó xây dựng hình ảnh hoặc tương tác với các vùng chứa.

Hình ảnh Docker-in-Docker

Docker được cung cấp dưới dạng hình ảnh độc lập thông qua docker:dind trên Docker Hub. Bắt đầu hình ảnh này sẽ cung cấp cho bạn một cài đặt Docker daemon đang hoạt động bên trong vùng chứa mới của bạn. Nó sẽ hoạt động độc lập với daemon của máy chủ của bạn đang chạy vùng dind , vì vậy docker ps docker bên trong vùng chứa sẽ cung cấp các kết quả khác nhau cho docker ps trên máy chủ của bạn.

docker run -d --privileged --name docker 
    -e DOCKER_TLS_CERTDIR = / certs 
    -v docker-certs-ca: / certs / ca 
    -v docker-certs-client: / certs / client 
    docker: dind

Sử dụng Docker-in-Docker theo cách này đi kèm với một cảnh báo lớn: bạn cần sử dụng chế độ đặc quyền. Ràng buộc này áp dụng ngay cả khi bạn đang sử dụng vùng chứa không cần root. Chế độ đặc quyền được kích hoạt bởi các --privileged cờ trong lệnh trình bày ở trên.

Sử dụng chế độ đặc quyền cung cấp cho vùng chứa quyền truy cập hoàn toàn vào hệ thống máy chủ của bạn. Điều này là cần thiết trong kịch bản Docker-in-Docker để Docker bên trong của bạn có thể tạo các vùng chứa mới. Tuy nhiên, nó có thể là một rủi ro bảo mật không thể chấp nhận được trong một số môi trường.

Quảng cáo

Có những vấn đề khác với dind quá. Một số hệ thống nhất định có thể gặp xung đột với Mô-đun bảo mật Linux (LSM) như AppArmor và SELinux. Điều này xảy ra khi Docker bên trong áp dụng các chính sách LSM mà daemon bên ngoài không thể lường trước được.

Một thách thức khác liên quan đến hệ thống tệp vùng chứa. Daemon bên ngoài sẽ chạy trên hệ thống tệp thông thường của máy chủ lưu trữ của bạn, chẳng hạn như ext4 . Mặc dù vậy, tất cả các vùng chứa của nó, bao gồm cả daemon Docker bên trong, sẽ nằm trên một hệ thống tệp tin copy-on-write (CoW). Điều này có thể tạo ra sự không tương thích nếu daemon bên trong được cấu hình để sử dụng trình điều khiển lưu trữ không thể được sử dụng trên hệ thống tệp CoW hiện có.

Gắn ổ cắm Docker của máy chủ lưu trữ của bạn thay thế

Những thách thức liên quan đến dind được giải quyết tốt nhất bằng cách tránh hoàn toàn việc sử dụng nó. Trong nhiều trường hợp, bạn có thể đạt được hiệu quả dự kiến bằng cách gắn ổ cắm Docker của máy chủ của bạn vào một bộ chứa docker

docker run -d --name docker
    -v /var/run/docker.sock:/var/run/docker.sock 
    docker: mới nhất

Các Docker CLI bên trong docker tương tác hình ảnh với daemon Docker ổ cắm mà nó tìm thấy tại /var/run/docker.sock . Việc gắn socket của máy chủ của bạn với đường dẫn này có nghĩa là docker chạy bên trong vùng chứa sẽ thực thi trên nền tảng Docker hiện có của bạn.

Điều này có nghĩa là các vùng chứa được tạo bởi Docker bên trong sẽ nằm trên hệ thống máy chủ của bạn, cùng với chính vùng chứa Docker. Tất cả các vùng chứa sẽ tồn tại dưới dạng anh chị em, ngay cả khi có cảm giác như Docker lồng nhau là con của cha mẹ. Chạy docker ps sẽ cho kết quả giống nhau, cho dù nó chạy trên máy chủ hoặc bên trong vùng chứa của bạn.

Kỹ thuật này giảm thiểu các thách thức thực hiện của dind . Nó cũng loại bỏ nhu cầu sử dụng chế độ đặc quyền, mặc dù việc gắn ổ cắm Docker tự nó là một mối quan tâm bảo mật tiềm ẩn. Bất kỳ thứ gì có quyền truy cập vào socket đều có thể gửi hướng dẫn đến Docker daemon, cung cấp khả năng khởi động vùng chứa trên máy chủ của bạn, kéo hình ảnh hoặc xóa dữ liệu.

Khi nào sử dụng từng phương pháp tiếp cận

Docker-in-Docker qua dind lịch sử đã được sử dụng rộng rãi trong môi trường CI. Nó có nghĩa là các thùng chứa “bên trong” có một lớp cách ly với máy chủ. Một vùng chứa Á hậu CI duy nhất hỗ trợ mọi vùng chứa đường ống mà không làm ô nhiễm daemon Docker của máy chủ.

Quảng cáo

Mặc dù nó thường hoạt động, nhưng điều này có đầy tác dụng phụ và không phải là trường hợp sử dụng dự kiến cho dind . Nó được thêm vào để dễ dàng phát triển Docker, không cung cấp hỗ trợ người dùng cuối cho các cài đặt Docker lồng nhau.

Theo Jérôme Petazzoni, người sáng tạo ra việc dind , việc áp dụng phương pháp dựa trên ổ cắm sẽ là giải pháp ưu tiên của bạn. Ràng buộc việc gắn ổ cắm daemon của máy chủ của bạn an toàn hơn, linh hoạt hơn và có đầy đủ tính năng giống như khởi động dind chứa dind.

Nếu trường hợp sử dụng của bạn có nghĩa là bạn hoàn toàn yêu cầu dind , thì có một cách an toàn hơn để triển khai nó. Dự án Sysbox hiện đại là một thời gian chạy vùng chứa chuyên dụng có thể lồng các thời gian chạy khác mà không cần sử dụng chế độ đặc quyền. Các thùng chứa Sysbox trở nên giống như máy ảo để chúng có thể hỗ trợ phần mềm thường chạy trên máy ảo hoặc vật lý. Điều này bao gồm Docker và Kubernetes mà không có bất kỳ cấu hình đặc biệt nào.

Phần kết luận

Chạy Docker trong Docker là một yêu cầu tương đối phổ biến. Bạn có nhiều khả năng nhìn thấy nó trong khi thiết lập máy chủ CI cần hỗ trợ xây dựng hình ảnh vùng chứa từ bên trong đường ống do người dùng tạo.

Sử dụng docker:dind cung cấp cho bạn một daemon Docker độc lập chạy bên trong vùng chứa của chính nó. Nó tạo hiệu quả các vùng chứa con không hiển thị trực tiếp từ máy chủ. Mặc dù nó dường như cung cấp sự cô lập mạnh mẽ, dind chứa nhiều vấn đề phức tạp và mối quan tâm về bảo mật. Đây là do các tương tác hệ điều hành của Docker.

Quảng cáo

Gắn ổ cắm Docker của máy chủ của bạn vào một vùng chứa bao gồm docker là một giải pháp thay thế đơn giản và dễ dự đoán hơn. Điều này cho phép quá trình Docker lồng nhau bắt đầu các vùng chứa trở thành anh chị em của chính nó. Không cần cài đặt thêm khi bạn sử dụng phương pháp dựa trên ổ cắm.

How to Mount or Symlink a Single File in a Docker Container

Cách gắn kết hoặc liên kết biểu tượng một tệp duy nhất trong vùng chứa Docker

How to Remove a Commit From Github

Cách xóa cam kết khỏi Github

What Is “Inner Source” Development and Should You Be Using It?

Phát triển “Nguồn bên trong” là gì và bạn có nên sử dụng nó không?

How to Access and Use DigitalOcean Droplet Metadata

Cách truy cập và sử dụng siêu dữ liệu giọt DigitalOcean

How to Run Your Own DNS Server on Your Local Network

Cách chạy máy chủ DNS của riêng bạn trên mạng cục bộ của bạn

What’s New In C# 10?

Có gì mới trong C # 10?

Dịch từ: https://www.cloudsavvyit.com/14890/how-and-why-to-run-docker-inside-docker/

Hãy giúp chúng tôi đánh giá bài viết này!

BÌNH LUẬN

Vui lòng nhập bình luận của bạn
Vui lòng nhập tên của bạn ở đây