Docker, nó là gì và mục đích là gì


111

Tôi đã nghe nói về Docker vài ngày trước và muốn xem qua.

Nhưng thực tế, tôi không biết mục đích của “thùng hàng” này là gì?

Container là gì?

Nó có thể thay thế một máy ảo dành riêng cho phát triển không?

Nói một cách đơn giản, mục đích của việc sử dụng Docker trong các công ty là gì? Lợi thế chính?



Câu trả lời:


115

VM: Sử dụng phần mềm VM, ví dụ, Ubuntu có thể được cài đặt bên trong Windows. Và cả hai sẽ chạy cùng một lúc. Nó giống như việc xây dựng một chiếc PC, với các thành phần cốt lõi của nó như CPU, RAM, Đĩa, Card mạng, v.v., trong một hệ điều hành và lắp ráp chúng để hoạt động như thể nó là một PC thực sự. Bằng cách này, PC ảo trở thành "khách" bên trong PC thực với hệ điều hành của nó, được gọi là máy chủ.

Vùng chứa: Nó giống như trên nhưng thay vì sử dụng toàn bộ hệ điều hành, nó cắt giảm các thành phần "không cần thiết" của hệ điều hành ảo để tạo ra một phiên bản tối thiểu của nó. Điều này dẫn đến việc tạo ra LXC (Linux Containers). Nó nhanh hơn VM Machines.

Docker: Vùng chứa docker, không giống như máy ảo và vùng chứa, không yêu cầu hoặc bao gồm một hệ điều hành riêng biệt. Thay vào đó, nó dựa vào chức năng của nhân Linux và sử dụng cách ly tài nguyên.
Mục đích của Docker: Trọng tâm chính của nó là tự động hóa việc triển khai các ứng dụng bên trong vùng chứa phần mềm và tự động hóa ảo hóa cấp hệ điều hành trên Linux. Nó nhẹ hơn Container tiêu chuẩn và khởi động trong vài giây. ggg

(Lưu ý rằng không yêu cầu Hệ điều hành khách trong trường hợp Docker)


1
Tôi đã thử tìm kiếm các tài nguyên liên quan đến quy trình phát triển-triển khai của docker nhưng dường như tôi không thể tìm thấy bất cứ điều gì. Cho ví dụ, tôi có một môi trường lampp với laravel + angle4. Tôi có chia sẻ một tệp nào đó cho đồng đội của mình không? Làm cách nào để chỉnh sửa nguồn ứng dụng (php html js / ts) nếu tôi đặt nó bên trong vùng chứa? Chúng ta vẫn có thể sử dụng git / svn trên mã nguồn của mình chứ?
anaval

13
VM là viết tắt của "Máy ảo". Không cần gọi nó là "VM Machine" vì khi đó nó sẽ trở thành "Virtual machine machine". :)
Dzhuneyt

32

[Lưu ý, câu trả lời này tập trung vào vùng chứa Linux và có thể không áp dụng đầy đủ cho các hệ điều hành khác. ]

Container là gì?

Đó là một Ứng dụng : Một vùng chứa là một cách để chạy các ứng dụng được tách biệt với nhau. Thay vì ảo hóa phần cứng để chạy nhiều hệ điều hành, bộ chứa dựa vào việc ảo hóa hệ điều hành để chạy nhiều ứng dụng. Điều này có nghĩa là bạn có thể chạy nhiều vùng chứa hơn trên cùng một phần cứng so với máy ảo vì bạn chỉ có một bản sao của HĐH đang chạy và bạn không cần phân bổ trước bộ nhớ và lõi CPU cho từng phiên bản ứng dụng của mình. Cũng giống như bất kỳ ứng dụng nào khác, khi một vùng chứa cần CPU hoặc Bộ nhớ, nó sẽ phân bổ chúng và sau đó giải phóng chúng khi hoàn tất, cho phép các ứng dụng khác sử dụng các tài nguyên giới hạn đó sau này.

Chúng tận dụng không gian tên hạt nhân : Theo mặc định, mỗi vùng chứa sẽ nhận được một môi trường nơi sau đây là không gian tên:

  • Mount: filesystems, /trong container sẽ khác với /trên host.
  • PID: process id's, pid 1 trong container là ứng dụng đã khởi chạy của bạn, pid này sẽ khác khi xem từ máy chủ.
  • Mạng: vùng chứa chạy với giao diện loopback riêng (127.0.0.1) và IP riêng theo mặc định. Docker sử dụng các công nghệ như mạng cầu nối Linux để kết nối nhiều vùng chứa với nhau trong mạng lan riêng của chúng.
  • IPC: giao tiếp giữa các quy trình
  • UTS: điều này bao gồm tên máy chủ
  • Người dùng: bạn có thể tùy ý thay đổi tất cả id người dùng để được bù trừ từ id của máy chủ

Mỗi không gian tên này cũng ngăn một vùng chứa nhìn thấy những thứ như hệ thống tệp hoặc quy trình trên máy chủ lưu trữ hoặc trong các vùng chứa khác, trừ khi bạn loại bỏ rõ ràng sự cô lập đó.

Và các công cụ bảo mật linux khác : Các vùng chứa cũng sử dụng các tính năng bảo mật khác như SELinux, AppArmor, Capabilities và Seccomp để hạn chế người dùng bên trong vùng chứa, bao gồm cả người dùng root, có thể thoát khỏi vùng chứa hoặc tác động tiêu cực đến máy chủ.

Đóng gói ứng dụng của bạn với các phụ thuộc của chúng để có thể di động : Đóng gói ứng dụng vào một vùng chứa bao gồm việc lắp ráp không chỉ bản thân ứng dụng đó mà tất cả các phụ thuộc cần thiết để chạy ứng dụng đó, thành một hình ảnh di động. Hình ảnh này là hệ thống tệp cơ sở được sử dụng để tạo vùng chứa. Vì chúng tôi chỉ cô lập ứng dụng, hệ thống tệp này không bao gồm hạt nhân và các tiện ích hệ điều hành khác cần thiết để ảo hóa toàn bộ hệ điều hành. Do đó, hình ảnh cho một vùng chứa phải nhỏ hơn đáng kể so với hình ảnh cho một máy ảo tương đương, giúp việc triển khai tới các nút trên toàn mạng nhanh hơn. Do đó, các thùng chứa đã trở thành một lựa chọn phổ biến để triển khai các ứng dụng vào đám mây và các trung tâm dữ liệu từ xa.

Nó có thể thay thế một máy ảo dành riêng cho phát triển không?

Điều đó phụ thuộc : Nếu môi trường phát triển của bạn đang chạy Linux và bạn không cần quyền truy cập vào các thiết bị phần cứng hoặc có thể chấp nhận quyền truy cập trực tiếp vào phần cứng vật lý, thì bạn sẽ thấy việc chuyển đổi sang vùng chứa Linux khá dễ dàng. Mục tiêu lý tưởng cho vùng chứa docker là các ứng dụng như API dựa trên web (ví dụ: ứng dụng REST), mà bạn truy cập qua mạng.

Nói một cách đơn giản, mục đích của việc sử dụng Docker trong các công ty là gì? Lợi thế chính ?

Dev hoặc Ops : Docker thường được đưa vào môi trường theo một trong hai con đường. Các nhà phát triển đang tìm cách phát triển nhanh hơn và kiểm tra cục bộ ứng dụng của họ cũng như các hoạt động tìm cách chạy nhiều khối lượng công việc hơn trên ít phần cứng hơn so với khả năng có thể với máy ảo.

Hoặc Devops : Một trong những mục tiêu lý tưởng là tận dụng Docker ngay lập tức từ công cụ triển khai CI / CD, biên dịch ứng dụng và ngay lập tức xây dựng một hình ảnh được triển khai để phát triển, CI, prod, v.v. Các container thường giảm thời gian di chuyển ứng dụng từ khi đăng ký mã cho đến khi mã có sẵn để thử nghiệm, giúp các nhà phát triển hoạt động hiệu quả hơn. Và khi được thiết kế đúng cách, cùng một hình ảnh đã được kiểm tra và phê duyệt bởi các nhà phát triển và các công cụ CI có thể được triển khai trong sản xuất. Vì hình ảnh đó bao gồm tất cả các phụ thuộc của ứng dụng, nên nguy cơ xảy ra sự cố nào đó trong quá trình sản xuất đã hoạt động trong quá trình phát triển giảm đáng kể.

Khả năng mở rộng : Một lợi ích quan trọng cuối cùng của các thùng chứa mà tôi sẽ đề cập là chúng được thiết kế cho khả năng mở rộng theo chiều ngang. Khi bạn có các ứng dụng không trạng thái đang tải nặng, vùng chứa sẽ dễ dàng và nhanh hơn nhiều để mở rộng quy mô do kích thước hình ảnh nhỏ hơn và giảm chi phí. Vì lý do này, bạn thấy các vùng chứa đang được sử dụng bởi nhiều công ty dựa trên web lớn hơn, như Google và Netflix.


2
+1 Tôi hoàn toàn đồng ý với câu trả lời của bạn, đặc biệt với phần "nó có thể thay thế (các) máy ảo". Tôi thấy nhiều bình luận ở nơi khác nhấn mạnh rằng Docker không phải là Máy ảo, nhưng theo kinh nghiệm, đối với nhiều trường hợp sử dụng, nó hoạt động tốt hoặc thậm chí là một giải pháp thay thế tốt hơn. Ý bạn là gì khi bạn nói "chấp nhận được quyền truy cập trực tiếp vào phần cứng vật lý"?
Tyress

2
@tyress nếu máy chủ của bạn là Linux, bạn có thể gắn thiết bị trực tiếp vào vùng chứa Linux. Tôi đã thấy nó được thực hiện với các thiết bị âm thanh, nhưng mọi thứ trong / dev đều có thể được thêm vào. Điều này bỏ qua một số cách ly vùng chứa, nhưng có ý nghĩa đối với các tác vụ cụ thể như ứng dụng máy tính để bàn.
BMitch

Thật là tuyệt vời. Tôi không nghĩ về điều đó.
Tyress

@BMitch: câu trả lời rất rõ ràng và thanh lịch, thx !! Tôi nghĩ bây giờ tôi có thể hình dung container là gì..however, sẽ thật tuyệt nếu bạn có thể cập nhật câu trả lời của mình về cách container liên quan đến docker? So sánh giữa container và VM, docker có tương đương với hypervisor không?
rahulaga_dev

1
Docker là một công cụ triển khai các vùng chứa, cùng với việc cung cấp phần còn lại của hệ sinh thái cần thiết như sổ đăng ký trên trung tâm docker và các môi trường máy tính để bàn nhúng một máy ảo để chạy các vùng chứa Linux.
BMitch

6

Những câu hỏi tương tự đã ập vào đầu tôi vài ngày trước và những gì tôi tìm thấy sau khi tìm hiểu nó, hãy hiểu bằng những từ rất đơn giản.

Tại sao người ta lại nghĩ về docker và container khi mọi thứ có vẻ ổn với quá trình phát triển và kiến ​​trúc ứng dụng hiện tại !!

Hãy lấy một ví dụ rằng chúng tôi đang phát triển một ứng dụng sử dụng các dịch vụ nodeJs, MongoDB, Redis, RabbitMQ, v.v. [bạn có thể nghĩ đến bất kỳ dịch vụ nào khác].

Bây giờ chúng ta phải đối mặt với những điều sau đây là các vấn đề trong quá trình phát triển ứng dụng và vận chuyển nếu chúng ta quên mất sự tồn tại của docker hoặc các lựa chọn thay thế khác của các ứng dụng container.

  1. Khả năng tương thích của các dịch vụ (nodeJs, mongoDB, Redis, RabbitMQ, v.v.) với hệ điều hành (ngay cả sau khi tìm thấy các phiên bản tương thích với hệ điều hành, nếu có điều gì đó không mong muốn xảy ra liên quan đến các phiên bản thì chúng tôi cần xem lại khả năng tương thích và khắc phục điều đó).

  2. Nếu hai thành phần hệ thống yêu cầu thư viện / phụ thuộc với các phiên bản khác nhau trong ứng dụng trong hệ điều hành (Điều đó cần xem lại mọi lúc trong trường hợp ứng dụng có hành vi không mong muốn do vấn đề về thư viện và phiên bản phụ thuộc).

  3. Quan trọng nhất, nếu một người mới tham gia vào nhóm, chúng tôi cảm thấy rất khó khăn trong việc thiết lập môi trường mới, người đó phải tuân theo một loạt các hướng dẫn và chạy hàng trăm lệnh để cuối cùng thiết lập môi trường và rất mất thời gian và công sức.

    Mọi người phải đảm bảo rằng họ đang sử dụng đúng phiên bản hệ điều hành và kiểm tra tính tương thích của các dịch vụ với hệ điều hành. Và mỗi nhà phát triển phải tuân theo điều này mỗi lần trong khi thiết lập.

  4. Chúng tôi cũng có môi trường khác nhau như dev, test và production . Nếu một nhà phát triển cảm thấy thoải mái khi sử dụng một hệ điều hành và một nhà phát triển cảm thấy thoải mái với hệ điều hành khác Và trong trường hợp này, chúng tôi không thể đảm bảo rằng ứng dụng của chúng tôi sẽ hoạt động theo cùng một cách trong hai tình huống khác nhau này .

Tất cả những điều này làm cho cuộc sống của chúng tôi khó khăn trong quá trình phát triển , thử nghiệmvận chuyển các ứng dụng.

Vì vậy, chúng tôi cần một thứ gì đó xử lý vấn đề tương thích và cho phép chúng tôi thực hiện các thay đổi và sửa đổi trong bất kỳ thành phần hệ thống nào mà không ảnh hưởng đến các thành phần khác.

Bây giờ chúng ta nghĩ về docker vì mục đích của nó là chứa các ứng dụng và tự động hóa việc triển khai các ứng dụng và vận chuyển chúng rất dễ dàng.

nhập mô tả hình ảnh ở đây

Cách docker giải quyết các vấn đề trên-

  1. Chúng ta có thể chạy từng thành phần dịch vụ (nodeJs, MongoDB, Redis, RabbitMQ) trong các vùng chứa khác nhau với các thư việnphụ thuộc riêng của nó trong cùng một hệ điều hành nhưng với các môi trường khác nhau.

  2. Chúng tôi chỉ phải chạy cấu hình docker một lần sau đó tất cả các nhà phát triển trong nhóm của chúng tôi có thể bắt đầu với lệnh chạy docker đơn giản, chúng tôi đã tiết kiệm được rất nhiều thời gian và nỗ lực ở đây :) .

Vì vậy, vùng chứa là môi trường biệt lập với tất cả các phụ thuộc và thư viện được đóng gói cùng với quy trìnhgiao diện mạnggắn kết của riêng chúng .

Tất cả các bộ chứa đều sử dụng cùng một tài nguyên hệ điều hành, do đó chúng mất ít thời gian hơn để khởi động và sử dụng CPU hiệu quả với chi phí phần cứng thấp hơn.

Tôi hy vọng điều này sẽ hữu ích.


2

Hãy để tôi cố gắng cung cấp các câu trả lời đơn giản nhất có thể:

Nhưng thực tế, tôi không biết mục đích của “thùng hàng” này là gì?

Container là gì?

Nói một cách đơn giản: một gói chứa phần mềm . Cụ thể hơn, một ứng dụng và tất cả các phụ thuộc của nó được nhóm lại với nhau. Môi trường ứng dụng thông thường, không dày đặc được nối trực tiếp với Hệ điều hành, trong khi vùng chứa Docker là một lớp trừu tượng của Hệ điều hành.

Và một vùng chứa khác với một hình ảnh ở chỗ một vùng chứa là một thể hiện thời gian chạy của một hình ảnh - tương tự như cách các đối tượng là thể hiện thời gian chạy của các lớp trong trường hợp bạn đã quen với OOP.

Nó có thể thay thế một máy ảo dành riêng cho phát triển không?

Cả VM và Docker container đều là kỹ thuật ảo hóa, trong đó chúng cung cấp tính trừu tượng trên cơ sở hạ tầng hệ thống.

Một máy ảo chạy một hệ điều hành “khách” đầy đủ với quyền truy cập ảo vào tài nguyên máy chủ thông qua một siêu giám sát. Điều này có nghĩa là VM thường cung cấp cho môi trường nhiều tài nguyên hơn nó thực sự cần Nói chung, VM cung cấp một môi trường với nhiều tài nguyên hơn nhu cầu của hầu hết các ứng dụng. Do đó, container là một kỹ thuật có trọng lượng nhẹ hơn. Hai người giải quyết các vấn đề khác nhau.

Nói một cách đơn giản, mục đích của việc sử dụng Docker trong các công ty là gì? Lợi thế chính?

Việc chứa đựng đồng hành với các dịch vụ nhỏ. Các dịch vụ nhỏ hơn tạo nên ứng dụng lớn hơn thường được thử nghiệm và chạy trong vùng chứa Docker. Điều này làm cho việc kiểm tra liên tục dễ dàng hơn.

Ngoài ra, vì các vùng chứa Docker ở chế độ chỉ đọc nên chúng thực thi nguyên tắc DevOps chính: các dịch vụ sản xuất không được thay đổi

Một số lợi ích chung của việc sử dụng chúng:

  • Sự cô lập tuyệt vời của các dịch vụ
  • Khả năng quản lý tuyệt vời vì các thùng chứa chứa mọi thứ mà ứng dụng cần
  • Đóng gói công nghệ thực hiện (trong các thùng chứa)
  • Sử dụng tài nguyên hiệu quả (do ảo hóa hệ điều hành nhẹ) so với máy ảo
  • Triển khai nhanh chóng
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.