Sự khác biệt giữa Docker và Python virtualenv là gì?


84

Theo những gì tôi hiểu về Docker, đó là một công cụ được sử dụng cho môi trường ảo. Trong biệt ngữ của họ, nó được gọi là "container hóa". Đây ít nhiều là những gì virtualenv của Python thực hiện. Tuy nhiên, bạn có thể sử dụng virtualenv trong Docker. Vì vậy, nó là một môi trường ảo bên trong một môi trường ảo? Tôi bối rối không biết điều này sẽ hoạt động như thế nào, vì vậy ai đó có thể vui lòng làm rõ không?


21
Đây là một câu hỏi hay, nhưng có thể sẽ bị kết thúc vì lạc đề. virtualenv không phải là sự cô lập thực sự, đó là sự cô lập của một kẻ tội nghiệp bằng cách sử dụng hack đường dẫn và liên kết tượng trưng - bạn vẫn đang ở trong hệ điều hành của riêng mình. Docker cung cấp nhiều tính năng cách ly hơn, nhưng không nhiều như một máy ảo chạy đầy đủ. Bạn có thể nghĩ về một vùng chứa như một trung gian giữa hộp ảo (nặng, đắt) và virtualenv (nhẹ, rẻ). Việc tạo một virtualenv bên trong một vùng chứa không có nhiều ý nghĩa vì sự cô lập đã được cung cấp bởi docker, sẽ không có nhiều điểm để làm điều đó.
wim

Câu trả lời:


95

Virtualenv chỉ đóng gói các phụ thuộc Python. Một Docker container đóng gói toàn bộ một hệ điều hành .

Với một virtualenv Python, bạn có thể dễ dàng chuyển đổi giữa các phiên bản Python và các phụ thuộc, nhưng bạn đang gặp khó khăn với hệ điều hành chủ của mình.

Với hình ảnh Docker, bạn có thể hoán đổi toàn bộ hệ điều hành - cài đặt và chạy Python trên Ubuntu, Debian, Alpine, thậm chí cả Windows Server Core.

Có các hình ảnh Docker ở đó với mọi sự kết hợp của các phiên bản hệ điều hành và Python mà bạn có thể nghĩ đến, sẵn sàng để kéo xuống và sử dụng trên bất kỳ hệ thống nào có cài đặt Docker.


24

Môi trường ảo Python sẽ chỉ "chứa" thời gian chạy Python tức là trình thông dịch python và các thư viện python trong khi Docker cô lập toàn bộ hệ thống (toàn bộ hệ thống tệp, tất cả thư viện không gian người dùng, giao diện mạng). Do đó Docker gần với Máy ảo hơn nhiều so với môi trường ảo.


Có bất kỳ lợi ích nào trong việc tạo môi trường ảo bên trong vùng chứa docker khi vùng chứa sẽ chỉ phân phát một ứng dụng web flask.
thanos.a

9

Thêm vào phần trên: có một trường hợp để kết hợp docker và venv: một số hệ điều hành được cài đặt python để cung cấp các ứng dụng 'OS-near', theo hiểu biết của tôi, apt trên debian (và các dẫn xuất của nó). Python venv cho phép nhà phát triển gửi ứng dụng python yêu cầu phiên bản thông dịch khác mà không ảnh hưởng đến python được vận chuyển cùng với hệ điều hành. Bây giờ, vì Docker 'cô lập toàn bộ hệ điều hành' như đã nêu ở trên, điều tương tự cũng áp dụng cho hình ảnh Docker. Do đó, theo quan điểm của tôi, nếu hình ảnh Docker được yêu cầu / mong muốn, cách tốt nhất là tạo một venv bên trong hình ảnh Docker cho ứng dụng python của bạn.


2
Điều này có làm chậm thời gian phản hồi (hai cấp độ ảo hóa) không?
Andrew Swift

2
Môi trường ảo Python thay đổi môi trường python, nó không ảo hóa việc thực thi trình thông dịch python. Docker container không được ảo hóa trừ khi nó được thực thi với một siêu giám sát (Docker Machine).
Morten

Tôi vẫn nghĩ rằng việc gắn docker bên trong hệ điều hành sẽ rất tẻ nhạt đối với tôi, tôi thường làm điều này, tôi lập trình bằng ngôn ngữ shell tất cả các phụ thuộc của dự án bên ngoài vào pytohn và tôi thực thi chúng tự động, giả sử trong sản xuất thông qua ssh
Alex Ancco Cahuana
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.