Docker thêm gì vào công cụ lxc (công cụ LXC không gian người dùng)?


398

Nếu bạn xem các tính năng của Docker, hầu hết chúng đều được LXC cung cấp.

Vậy Docker thêm gì? Tại sao tôi nên sử dụng Docker trên LXC đơn giản?

Câu trả lời:


550

Từ câu hỏi thường gặp về Docker :

Docker không phải là một thay thế cho lxc. "lxc" đề cập đến các khả năng của hạt nhân linux (cụ thể là các không gian tên và nhóm điều khiển) cho phép các quá trình hộp cát từ nhau và kiểm soát việc phân bổ tài nguyên của chúng.

Ngoài nền tảng các tính năng hạt nhân cấp thấp này, Docker cung cấp một công cụ cấp cao với một số chức năng mạnh mẽ:

  • Triển khai di động trên các máy.Docker định nghĩa một định dạng để đóng gói một ứng dụng và tất cả các phụ thuộc của nó vào một đối tượng duy nhất có thể được chuyển đến bất kỳ máy nào kích hoạt docker và được thực thi ở đó với sự đảm bảo rằng môi trường thực thi tiếp xúc với ứng dụng sẽ giống nhau. Lxc thực hiện quy trình hộp cát, đây là một điều kiện tiên quyết quan trọng để triển khai di động, nhưng chỉ điều đó là không đủ để triển khai di động. Nếu bạn đã gửi cho tôi một bản sao ứng dụng của bạn được cài đặt trong cấu hình lxc tùy chỉnh, nó gần như chắc chắn sẽ không chạy trên máy của tôi theo cách của nó, bởi vì nó được gắn với cấu hình cụ thể của máy bạn: mạng, lưu trữ, ghi nhật ký, phân phối, v.v. Docker định nghĩa một sự trừu tượng hóa cho các cài đặt dành riêng cho máy này, để cùng một thùng chứa docker chính xác có thể chạy - không thay đổi - trên nhiều máy khác nhau,

  • Ứng dụng trung tâm. Docker được tối ưu hóa cho việc triển khai các ứng dụng , trái ngược với máy móc. Điều này được phản ánh trong API, giao diện người dùng, triết lý thiết kế và tài liệu của nó. Ngược lại, các tập lệnh trợ giúp lxc tập trung vào các thùng chứa dưới dạng các máy nhẹ - về cơ bản là các máy chủ khởi động nhanh hơn và cần ít ram hơn. Chúng tôi nghĩ rằng có nhiều hơn để chứa hơn chỉ có vậy.

  • Xây dựng tự động . Docker bao gồm một công cụ để các nhà phát triển tự động lắp ráp một container từ mã nguồn của họ, với toàn quyền kiểm soát các phụ thuộc ứng dụng, công cụ xây dựng, đóng gói, v.v ... Họ có thể tự do sử dụng các gói, maven, đầu bếp, bù nhìn, muối, gói debian, rpms, nguồn tarball, hoặc bất kỳ sự kết hợp nào ở trên, bất kể cấu hình của máy .

  • Phiên bản. Docker bao gồm các khả năng giống như git để theo dõi các phiên bản liên tiếp của container, kiểm tra sự khác biệt giữa các phiên bản, cam kết các phiên bản mới, quay lại, v.v. Lịch sử cũng bao gồm cách một container được lắp ráp và bởi ai, do đó bạn có thể truy xuất nguồn gốc hoàn toàn từ máy chủ sản xuất tất cả các cách trở lại nhà phát triển ngược dòng. Docker cũng thực hiện tải lên và tải xuống gia tăng, tương tự như "git pull", vì vậy các phiên bản mới của một container có thể được chuyển bằng cách chỉ gửi khác biệt.

  • Thành phần sử dụng lại. Bất kỳ container nào cũng có thể được sử dụng như một "hình ảnh cơ sở" để tạo ra các thành phần chuyên biệt hơn. Điều này có thể được thực hiện bằng tay hoặc là một phần của bản dựng tự động. Ví dụ, bạn có thể chuẩn bị môi trường python lý tưởng và sử dụng nó làm cơ sở cho 10 ứng dụng khác nhau. Thiết lập postgresql lý tưởng của bạn có thể được sử dụng lại cho tất cả các dự án trong tương lai của bạn. Và như thế.

  • Chia sẻ. Docker có quyền truy cập vào một sổ đăng ký công cộng ( https://registry.hub.docker.com/ ) nơi hàng ngàn người đã tải lên các thùng chứa hữu ích: mọi thứ từ redis, couchdb, postgres đến irc bouncers đến rails server server để có hình ảnh cơ sở cho distro khác nhau. Sổ đăng ký cũng bao gồm một "thư viện tiêu chuẩn" chính thức của các container hữu ích được duy trì bởi nhóm docker. Bản thân sổ đăng ký là nguồn mở, vì vậy bất kỳ ai cũng có thể triển khai sổ đăng ký của riêng mình để lưu trữ và chuyển các thùng chứa riêng, để triển khai máy chủ nội bộ chẳng hạn.

  • Hệ sinh thái công cụ. Docker định nghĩa một API để tự động hóa và tùy chỉnh việc tạo và triển khai các container. Có một số lượng lớn các công cụ tích hợp với docker để mở rộng khả năng của nó. Triển khai giống như PaaS (Dokku, Deis, Flynn), dàn nhạc đa nút (maestro, salt, mesos, openstack nova), bảng điều khiển quản lý (docker-ui, openstack horiz, shipyard), quản lý cấu hình (đầu bếp, con rối), tích hợp liên tục (jenkins, strider, travis), v.v. Docker đang nhanh chóng thiết lập nó như là tiêu chuẩn cho công cụ dựa trên container.

Tôi hi vọng cái này giúp được!


3
Khi bạn nói, "bất kỳ vùng chứa nào cũng có thể được sử dụng làm hình ảnh cơ sở", tôi cho rằng bạn có nghĩa là thùng chứa Docker, không phải là thùng chứa LXC được tạo độc lập với Docker. Theo như tôi có thể nói, người ta không thể tạo một Docker container từ đầu, nó phải luôn được kế thừa từ một container Docker khác (câu hỏi liên quan: stackoverflow.com/questions/18274088/ .)
Flimm

18
Bạn có thể dễ dàng tạo một thùng chứa mới từ bất kỳ tarball nào bằng "nhập docker". Ví dụ: "debootstrap raring ./rootfs; tar -C ./rootfs -c. | Docker nhập flimm / mybase".
Solomon Hykes

3
Bây giờ điều này vẫn đúng khi Docker có libcontainer (rằng nó không phải là sự thay thế)?
Garet Claborn

3
@GaretClaborn có, vì libcontainer chỉ là thư viện của riêng họ để truy cập vào không gian tên và nhóm, mọi thứ mà Solomon nói vẫn được áp dụng.
John Morales

10
Một thùng chứa Linux là kết quả của việc ràng buộc và cô lập một quy trình bằng cách sử dụng một bộ các phương tiện Linux: chroot, cgroups và không gian tên. LXC là một công cụ không gian người dùng thao túng các cơ sở đó. libcontainer là một thay thế cho LXC thao túng các cơ sở tương tự. Docker sử dụng libcontainer theo mặc định nhưng có thể sử dụng LXC thay thế. Điều đó nói rằng, Docker (nhiều hơn) một lớp tương thích trên đầu libcontainer / LXC; nó thêm các tính năng bổ sung mà các câu trả lời khác đã liệt kê.
100464

71

Chúng ta hãy xem danh sách các tính năng kỹ thuật của Docker và kiểm tra những tính năng nào được cung cấp bởi LXC và những tính năng nào không.

Đặc trưng:

1) Cách ly hệ thống tập tin : mỗi bộ chứa tiến trình chạy trong một hệ thống tập tin gốc hoàn toàn riêng biệt.

Được cung cấp với LXC đồng bằng.

2) Cách ly tài nguyên : tài nguyên hệ thống như cpu và bộ nhớ có thể được phân bổ khác nhau cho từng vùng chứa quy trình, sử dụng các nhóm.

Được cung cấp với LXC đồng bằng.

3) Cách ly mạng : mỗi vùng chứa tiến trình chạy trong không gian tên mạng riêng, với giao diện ảo và địa chỉ IP của chính nó.

Được cung cấp với LXC đồng bằng.

4) Copy-on-write : hệ thống tập tin gốc được tạo bằng cách sử dụng copy-on-write, giúp triển khai cực kỳ nhanh, rẻ bộ nhớ và rẻ đĩa.

Điều này được cung cấp bởi AUFS, một hệ thống tập tin liên kết mà Docker phụ thuộc vào. Bạn có thể tự thiết lập AUFS bằng LXC, nhưng Docker sử dụng nó làm tiêu chuẩn.

5) Ghi nhật ký : các luồng tiêu chuẩn (stdout / stderr / stdin) của mỗi bộ chứa quy trình được thu thập và ghi lại để truy xuất theo thời gian thực hoặc theo đợt.

Docker cung cấp điều này.

6) Quản lý thay đổi: các thay đổi đối với hệ thống tệp của bộ chứa có thể được cam kết thành một hình ảnh mới và được sử dụng lại để tạo thêm các thùng chứa. Không cần cấu hình khuôn mẫu hoặc thủ công.

"Cấu hình khuôn mẫu hoặc thủ công" là một tham chiếu đến LXC, nơi bạn sẽ cần tìm hiểu về cả hai điều này. Docker cho phép bạn xử lý các container theo cách bạn đã từng xử lý các máy ảo mà không cần tìm hiểu về cấu hình LXC.

7) Shell tương tác : docker có thể phân bổ giả và gắn vào đầu vào tiêu chuẩn của bất kỳ container nào, ví dụ để chạy shell tương tác vứt đi.

LXC đã cung cấp điều này.


Tôi chỉ mới bắt đầu tìm hiểu về LXC và Docker, vì vậy tôi hoan nghênh mọi sửa đổi hoặc câu trả lời tốt hơn.


35
IMHO, câu trả lời này bỏ lỡ điểm. Docker không "cung cấp" các tính năng đó; nó chỉ đơn giản là làm cho chúng dễ sử dụng. Nếu chúng ta muốn trở nên thật khoa trương, chúng ta có thể nói rằng LXC không cung cấp sự cô lập: không gian tên cung cấp cho nó và LXC chỉ là một công cụ sử dụng hàng hóa để làm cho chúng dễ sử dụng hơn so với unsharecông cụ cơ bản (hoặc trực tiếp là tòa nhà clone()). Tương tự như vậy, Docker làm cho những thứ đó dễ sử dụng hơn (và mang lại nhiều tính năng hơn trên bàn, như khả năng đẩy / kéo hình ảnh). 2c của tôi.
jpetazzo

6
@jpetazzo: LXC thực sự khá dễ dàng, làm thế nào Docker làm cho nó dễ dàng hơn (bên cạnh việc thêm các tính năng khác như đẩy và kéo hình ảnh)?
Flimm

31
@Flimm: Tôi thích sự so sánh trong số 16 của Tạp chí Quản trị , p. 34: Docker gói LXC cùng với một số công nghệ hỗ trợ khác và kết thúc nó trong giao diện dòng lệnh dễ sử dụng. Sử dụng container là một chút như cố gắng sử dụng Git với chỉ lệnh như update-indexread-tree, không cần dụng cụ quen thuộc như add, commit, và merge. Docker cung cấp lớp "sứ" đó qua "hệ thống ống nước" của LXC, cho phép bạn làm việc với các khái niệm cấp cao hơn và ít lo lắng hơn về các chi tiết cấp thấp.
0xC0000022L

4
Tôi đã chạy các điểm chuẩn UnixBench bên trong một container docker và LXC container, chạy cùng một hệ điều hành và LXC đã xuất sắc về điểm số. Là docker dựa trên LXC, tôi rất bối rối về kết quả của mình.
gextra

7
Tôi thấy rằng hiệu năng của Docker chậm hơn có liên quan đến I / O của đĩa, do đó có thể do việc áp dụng AUFS.
gextra

16

Bài đăng & câu trả lời ở trên đang nhanh chóng trở nên lỗi thời khi sự phát triển của LXD tiếp tục tăng cường LXC . Vâng, tôi biết Docker cũng không đứng yên.

LXD hiện triển khai một kho lưu trữ cho các hình ảnh chứa LXC mà người dùng có thể đẩy / kéo từ đó để đóng góp hoặc tái sử dụng.

Bây giờ REST api đến LXC của LXD cho phép tạo / quản lý / triển khai / quản lý các container LXC cục bộ và từ xa bằng cách sử dụng cú pháp lệnh rất đơn giản.

Các tính năng chính của LXD là:

  • Bảo mật theo thiết kế (container không có đặc quyền, hạn chế tài nguyên và nhiều hơn nữa)
  • Có thể mở rộng (từ các thùng chứa trên máy tính xách tay của bạn đến hàng ngàn nút tính toán)
  • Trực quan (đơn giản, API rõ ràng và trải nghiệm dòng lệnh rõ nét)
  • Dựa trên hình ảnh (không có nhiều mẫu phân phối, chỉ có hình ảnh tốt, đáng tin cậy) Di chuyển trực tiếp

Hiện tại đã có plugin NCLXD cho OpenStack, cho phép OpenStack sử dụng LXD để triển khai / quản lý các thùng chứa LXC dưới dạng VM trong OpenStack thay vì sử dụng KVM, vmware, v.v.

Tuy nhiên, NCLXD cũng cho phép một đám mây lai kết hợp giữa máy ảo CTNH và máy ảo LXC truyền thống.

Plugin nclxd OpenStack một danh sách các tính năng được hỗ trợ bao gồm:

stop/start/reboot/terminate container
Attach/detach network interface
Create container snapshot
Rescue/unrescue instance container
Pause/unpause/suspend/resume container
OVS/bridge networking
instance migration
firewall support

Vào thời điểm Ubuntu 16.04 được phát hành vào tháng 4 năm 2016, sẽ có thêm các tính năng thú vị như hỗ trợ thiết bị khối, hỗ trợ di chuyển trực tiếp .


4

Docker sử dụng hình ảnh được xây dựng trong lớp. Điều này bổ sung rất nhiều về tính di động, chia sẻ, phiên bản và các tính năng khác. Những hình ảnh này rất dễ dàng chuyển hoặc chuyển và vì chúng ở trong các lớp, những thay đổi trong các phiên bản tiếp theo được thêm vào dưới dạng các lớp so với các lớp trước đó. Vì vậy, trong khi chuyển nhiều lần, bạn không cần phải chuyển các lớp cơ sở. Docker có các container chạy các hình ảnh này với môi trường thực thi, chúng thêm các thay đổi khi các lớp mới cung cấp kiểm soát phiên bản dễ dàng.

Ngoài ra, Docker Hub là một sổ đăng ký tốt với hàng ngàn hình ảnh công cộng, nơi bạn có thể tìm thấy hình ảnh có cài đặt hệ điều hành và các phần mềm khác. Vì vậy, bạn có thể có được một khởi đầu khá tốt cho ứng dụng của bạn.


Khi bạn nói "được xây dựng trong các lớp" - điều đó có nghĩa là gì - (A) Một bản sao của các lớp cơ sở, được điều chỉnh và cam kết với một lớp "MỚI". Vì vậy, lớp cơ sở bị ngắt kết nối từ lớp tiếp theo? (B) (Các) lớp cơ sở là / được bao gồm trong lớp "MỚI" và cũng được liên kết. Vì vậy, những thay đổi đối với lớp cơ sở sẽ tự động được phản ánh lên lớp "MỚI". Xin lỗi, nếu làm rõ tìm kiếm là quá ngây thơ. :( Kapil
Kapil

Docker hình ảnh được xây dựng trong lớp. Để đưa vào các thuật ngữ chi tiết, tất cả các thay đổi cho đến một điểm khi một lớp được cam kết có mặt trong các lớp hình ảnh được thực hiện cho đến thời điểm đó. Mọi thay đổi được thực hiện sau đó sẽ được thêm vào các lớp tiếp theo và bên trên. Vì vậy, lớp mới được liên kết với lớp cơ sở. Tôi không nghĩ rằng cùng một lớp mới có thể được thêm vào một lớp cơ sở khác với những thay đổi bổ sung. Tuy nhiên, nếu nhiều thực thể muốn duy trì tính nhất quán và có cùng một lớp cơ sở, thì chỉ các lớp mới cần được cung cấp cho các thực thể này để đạt đến cùng một trạng thái.
div

Tuy nhiên, tôi không được cập nhật về các phát triển hiện tại trên docker và có thể có những thay đổi đối với việc thực hiện hình ảnh docker không được đề cập trong phần bình luận ở trên.
div

Cụ thể hơn, các lớp được xác định bằng một chữ ký (SHA-một cái gì đó, tôi tin) có nghĩa là nếu bạn thay đổi một lớp, nó là một lớp khác. @Kapil: Điều đó có nghĩa là trong khi hành vi của nó có phần gần với tùy chọn của bạn (B), bạn thực sự không thể thay đổi lớp cơ sở. (hoặc bất kỳ lớp nào, đối với vấn đề đó) Một hình ảnh được xây dựng từ một danh sách các lớp, mỗi lớp được áp dụng theo thứ tự; các lớp có thể được dọn sạch (và tôi nghĩ rằng chúng tự động được làm sạch bằng chính docker) khi không còn cần thiết; tức là khi tất cả các hình ảnh tham chiếu đã bị xóa.
codermonkeyfuel

@Kapil: Thành thật mà nói, câu hỏi của bạn có thể hoạt động tốt nhất như một câu hỏi mới, thay vì nhận xét về câu hỏi này, vì đây là câu hỏi hữu ích để mọi người có thể tự tìm kiếm. Nếu bạn muốn hỏi nó như một câu hỏi mới, tôi cũng sẽ trả lời ở đó.
codermonkeyfuel

0

Để giữ pithier này, điều này đã được hỏi và trả lời ở trên .

Tuy nhiên, tôi đã lùi lại và trả lời nó một chút khác nhau, chính động cơ docker bổ sung sự phối hợp như một trong những tính năng bổ sung của nó và đây là phần gây rối. Khi bạn bắt đầu chạy một ứng dụng dưới dạng kết hợp các container đang chạy 'ở đâu đó' trên nhiều công cụ chứa, nó sẽ thực sự thú vị. Mạnh mẽ, Mở rộng theo chiều ngang, trừu tượng hóa hoàn toàn từ phần cứng cơ bản, tôi có thể tiếp tục và tiếp tục ...

Docker không chỉ cung cấp cho bạn điều này, trên thực tế, tiêu chuẩn của Dàn nhạc Container thực tế là Kubernetes có rất nhiều hương vị, một Docker, mà còn cả OpenShift, SuSe, Azure, AWS ...

Sau đó, bên dưới K8S có các động cơ container thay thế; những cái thú vị là Docker và CRIO - được chế tạo gần đây, không có da, dự định là một công cụ chứa dành riêng cho Kubernetes nhưng chưa trưởng thành. Đó là sự cạnh tranh giữa những thứ mà tôi nghĩ sẽ là sự lựa chọn lâu dài thực sự cho động cơ container.

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.