About Me

header ads

Kiến trúc của docker

 Bài này chúng ta sẽ đi sâu hơn về kiến trúc của Docker. Các thành phần Docker, cách các Container được kết nối với Docker, v.v. và nhiều bài đăng khác sẽ sớm được chia sẻ, điều này giúp bạn bắt đầu thực hành với các container trong Lab của bạn.

Nhắc lại khái niệm Docker

Docker là một nền tảng nguồn mở, được sử dụng để đóng gói, phân phối và chạy các ứng dụng. Docker cung cấp một cách dễ dàng và hiệu quả để đóng gói các ứng dụng từ cơ sở hạ tầng để chạy dưới dạng một Image Docker duy nhất, được chia sẻ thông qua registry, được chia sẻ. Image Docker được sử dụng để khởi chạy một Docker container, làm cho ứng dụng chạy được từ máy chủ nơi container đang chạy.

Nói một cách đơn giản, Docker là một nền tảng container hóa, là phương thức ảo hóa ở cấp độ hệ điều hành được sử dụng để triển khai và chạy ứng dụng phân tán và tất cả các phụ thuộc của nó với nhau dưới dạng một Docker container. Nền tảng Docker loại bỏ lớp hypanneror khỏi Phần cứng của bạn, Nó chạy trực tiếp trên hệ điều hành. Bằng cách sử dụng Docker Platform, bạn có thể nhiều ứng dụng hoặc Service bị cô lập chạy trên một máy chủ, truy cập cùng một nhân hệ điều hành và đảm bảo ứng dụng đó hoạt động trơn tru trong mọi Environment.

Các container có thể chạy trên mọi hệ thống bare-metal với các phiên bản Linux, Windows, Mac và Cloud được hỗ trợ; nó cũng có thể chạy trên một máy ảo được triển khai trên bất kỳ trình ảo hóa nào.

Đối với các nhà phát triển có thể dễ dàng hiểu khái niệm Docker một cách dễ dàng nhưng đối với một hệ thống quản trị thì điều đó có thể khó khăn. Đừng lo lắng ở đây tôi sẽ giải thích các thành phần của Docker và cách sử dụng nó.

Docker có sẵn trong hai phiên bản:

  • Community Edition (CE)
  • Enterprise Edition (EE)

Docker Community Edition (CE) lý tưởng cho các nhà phát triển cá nhân và các nhóm nhỏ muốn bắt đầu với Docker và thử nghiệm các ứng dụng dựa trên container.

Docker Enterprise Edition (EE) được thiết kế cho các nhóm phát triển doanh nghiệp và CNTT, những người xây dựng, vận chuyển và chạy các ứng dụng kinh doanh quan trọng trong sản xuất ở quy mô.

Thành phần Docker

Docker Engine là gì?

Docker Engine là cốt lõi của hệ thống Docker; nó là ứng dụng được cài đặt trên máy chủ, Engine này là một ứng dụng Client-Server các thành phần bên dưới.

  • Server là một loại chương trình chạy ngầm, được gọi là tiến trình daemon (lệnh dockerd).
  • API REST, chỉ định các interface mà các chương trình có thể sử dụng để nói chuyện với daemon và hướng dẫn nó phải làm gì.
  • Command-line interface (CLI) client ( docker command ).

CLI sử dụng API REST Docker để kiểm soát hoặc tương tác với daemon Docker thông qua các lệnh CLI trực tiếp hoặc kịch bản. Nhiều ứng dụng Docker khác sử dụng API và CLI cơ bản.

Trình daemon và quản lý các đối tượng Docker, chẳng hạn như images, containers, networks, và volumes

Kiến trúc Docker

Docker sử dụng kiến ​​trúc Client-Server. Ứng dụng client Docker nói chuyện với daemon Docker thành phần thực hiện các công việc trong việc xây dựng, chạy và phân phối các container Docker của bạn. Trình client và trình daemon Docker có thể chạy trên cùng một hệ thống hoặc bạn có thể kết nối máy khách Docker với trình daemon Docker từ xa. Trình client và trình daemon của Docker giao tiếp bằng API REST, qua các port UNIX hoặc interface Network.

Lưu ý: – Thông tin kiến ​​trúc và công cụ Docker là từ Tài liệu Docker

Docker daemon

Trình nền Docker (dockerd) lắng nghe các yêu Bridge API Docker và quản lý các đối tượng Docker như Image, Container, Network và Volume. Một daemon cũng có thể giao tiếp với các daemon khác để quản lý các Service Docker.

Docker Client

Thành phần key Client Docker được nhiều người dùng Docker sử dụng tương tác với Docker. Khi bạn chạy các lệnh docker, Client sẽ gửi các lệnh này đến dockerd. Lệnh docker sử dụng API Docker và Client Docker có thể giao tiếp với nhiều hơn một daemon.

Docker registry

Docker registry là nơi lưu trữ Image Docker, nó có thể là public hoặc private registry. Docker Hub và Docker Cloud là các public registry có sẵn cho mọi người và tùy chọn khác là tạo đăng ký riêng của bạn. Docker được cấu hình để tìm kiếm Image trên Docker Hub theo mặc định và Nếu bạn sử dụng Docker Datacenter (DDC), nó bao gồm Docker Trusted Registry (DTR).

Docker Registry hoạt động như thế nào?

Khi bạn sử dụng các lệnh docker pull hoặc docker run, các Image được yêu cầu được pull từ registry được cấu hình của bạn. Khi bạn sử dụng lệnh docker push, Image của bạn sẽ được đẩy đến registry được cấu hình của bạn.

Docker store  cho phép bạn mua và bán Image Docker hoặc phân phối chúng miễn phí.

Ngoài ra, bạn có tùy chọn mua Image Docker chứa ứng dụng hoặc Service từ nhà cung cấp phần mềm và sử dụng Image để triển khai ứng dụng vào Environment thử nghiệm, dàn dựng và sản xuất của bạn. Bạn có thể nâng cấp ứng dụng bằng cách pull phiên bản mới của Image và triển khai lại các Container.

Docker Environment

Docker Environment là sự kết hợp của Docker Engine và Docker Object, tôi đã giải thích về công cụ Docker và một số đối tượng, Đối tượng của Docker là Image, Container, Network, Volume và các plugin.

Image

Một Image là một mẫu chỉ đọc với các hướng dẫn để tạo một Docker container. Bạn có thể tạo một Image với tùy chỉnh bổ sung từ một Base Image hoặc sử dụng những Image được tạo bởi người khác và được release trên registry

Docker sử dụng một hệ thống tập tin lớp thông minh, trong đó lớp cơ sở là chỉ đọc và lớp trên cùng có thể ghi. Khi bạn cố gắng ghi vào một lớp cơ sở, một bản sao được tạo ở lớp trên cùng và lớp cơ sở vẫn không thay đổi. Lớp cơ sở này có thể được chia sẻ vì nó chỉ đọc và không bao giờ thay đổi.

Ví dụ: bạn có thể xây dựng một Image, dựa trên Image Centos, nhưng cài đặt máy chủ Web và ứng dụng của bạn, cũng như các chi tiết cấu hình cần thiết để làm cho ứng dụng của bạn chạy.

Cách xây dựng Image của riêng bạn

Để xây dựng Image của riêng bạn, Tạo Dockerfile với cú pháp đơn giản để xác định các bước cần thiết để tạo Image và chạy nó. Mỗi hướng dẫn trong Dockerfile tạo một lớp trong Image. Khi bạn thay đổi Dockerfile và xây dựng lại Image, chỉ những lớp đã thay đổi mới được xây dựng lại và điều này làm cho Image rất nhẹ, nhỏ và nhanh.

Container

Trong các từ đơn giản, container là một ví dụ có thể chạy được của một Image. Bạn có thể create, start, stop, move hoặc delete một container bằng API Docker hoặc CLI. Bạn có thể kết nối một container với một hoặc nhiều Network, đính kèm registry vào nó hoặc thậm chí tạo một Image mới dựa trên trạng thái hiện tại của nó.

Theo mặc định, một container được cách ly tương đối tốt với các container khác và máy chủ của nó. Bạn có thể kiểm soát mức độ cô lập của Network chứa, bộ lưu trữ hoặc các hệ thống con cơ bản khác từ các Container khác hoặc từ máy chủ.

Một Container được xác định bởi Image của nó cũng như bất kỳ tùy chọn cấu hình nào bạn cung cấp cho nó khi bạn tạo hoặc khởi động nó. Khi một container được gỡ bỏ, mọi thay đổi về trạng thái của nó không được lưu trữ trong bộ lưu trữ liên tục sẽ biến mất.

Volume

Các volume là cơ chế ưa thích để duy trì dữ liệu được tạo bởi và được sử dụng bởi các container Docker. Mặc dù  Bind mount  phụ thuộc vào cấu trúc thư mục của máy chủ, volume hoàn toàn được quản lý bởi Docker.

Ưu điểm của volume so với bind mount

  • Các tập dễ dàng sao lưu hoặc di chuyển hơn các liên kết gắn kết.
  • Bạn có thể quản lý volume bằng cách sử dụng các lệnh Docker CLI hoặc API Docker.
  • Các volume làm việc trên cả container Linux và Windows.
  • volume có thể được chia sẻ an toàn hơn giữa nhiều container.
  • driver volume cho phép bạn lưu trữ volume trên máy chủ từ xa hoặc nhà cung cấp đám mây, để mã hóa nội dung của volume hoặc để thêm chức năng khác.
  • Các volume mới có thể có nội dung của chúng được thay đổi từ trước bởi một container.

Ngoài ra, volume thường là lựa chọn tốt hơn so với dữ liệu vẫn tồn tại trong lớp có thể ghi của bộ chứa, bởi vì một volume không làm tăng kích thước của các Container sử dụng nó và nội dung của volume tồn tại bên ngoài vòng đời của một Container nhất định.

Nếu container của bạn tạo dữ liệu trạng thái không liên tục, hãy cân nhắc sử dụng  tmpfs  để tránh lưu trữ dữ liệu ở bất cứ đâu vĩnh viễn và để tăng hiệu suất của container bằng cách tránh ghi vào lớp có thể ghi của container.

Một trong những lý do khiến các container và Service của Docker rất mạnh là bạn có thể kết nối chúng lại với nhau hoặc kết nối chúng với volume công việc không phải của Docker. Các container và Service của Docker thậm chí không cần phải biết rằng chúng được triển khai trên Docker, hoặc liệu các đồng nghiệp của chúng có phải là volume công việc của Docker hay không. Cho dù máy chủ Docker của bạn chạy Linux, Windows hoặc kết hợp cả hai, bạn có thể sử dụng Docker để quản lý chúng theo cách không thể biết về nền tảng.

Bind mounts

Bind mounts đã có từ những ngày đầu của Docker. Bind mounts có chức năng hạn chế so với volume. Khi bạn sử dụng một Bind mounts, một tập tin hoặc thư mục trên máy chủ được gắn vào một Container. Tệp hoặc thư mục được tham chiếu bởi đường dẫn đầy đủ hoặc tương đối của nó trên máy chủ. Ngược lại, khi bạn sử dụng một ổ đĩa, một thư mục mới sẽ được tạo trong thư mục lưu trữ của Docker trên máy chủ và Docker quản lý nội dung của thư mục đó.

Tệp hoặc thư mục không cần tồn tại trên máy chủ Docker. Nó được tạo ra theo yêu Bridge nếu nó chưa tồn tại. Gắn kết ràng buộc là rất hiệu quả, nhưng họ dựa vào hệ thống tập tin của máy chủ có sẵn một cấu trúc thư mục cụ thể. Nếu bạn đang phát triển các ứng dụng Docker mới, hãy xem xét sử dụng volume được đặt tên thay thế. Bạn không thể sử dụng các lệnh Docker CLI để trực tiếp quản lý các liên kết gắn kết.

Network

Hệ thống con của Docker có thể cắm, sử dụng driver. Một số driver tồn tại theo mặc định và cung cấp chức năng core-networking:

  • Bridge : Bridger là driver Network mặc định được sử dụng trong Docker. Docker có các tùy chọn driver Network khác và nếu bạn không chỉ định Network Bridge điều khiển sẽ được tạo làm mặc định. Network Bridge thường được sử dụng khi các ứng dụng của bạn chạy trong các Container độc lập cần liên lạc.
  • Host : Sử dụng Network máy chủ trong các Container độc lập, bạn có thể loại bỏ cách ly Network giữa container và máy chủ chạy Docker.

Lưu ý: – Network máy chủ chỉ khả dụng cho các Service swarm trên Docker 17,06 trở lên.

  • Overlay : Các overlay Network kết nối nhiều daemon Docker với nhau và cho phép các Service swarm liên lạc với nhau. Bạn cũng có thể sử dụng các overlay Network để tạo điều kiện liên lạc giữa Service swarm và container độc lập hoặc giữa hai container độc lập trên các daemon Docker khác nhau. Chiến lược này loại bỏ sự cần thiết phải thực hiện định tuyến cấp hệ điều hành giữa các container này.
  • Macvlan : Network Macvlan cho phép bạn gán địa chỉ MAC cho vùng chứa, làm cho nó xuất hiện dưới dạng thiết bị vật lý trên Network của bạn. Trình nền Docker định tuyến lưu lượng đến các container theo địa chỉ MAC của chúng. Sử dụng macvlandriver đôi khi là lựa chọn tốt nhất khi xử lý các ứng dụng cũ dự kiến ​​sẽ được kết nối trực tiếp với Network vật lý, thay vì được chuyển qua ngăn xếp Network của máy chủ Docker.
  • None : Đối với container này, vô hiệu hóa tất cả các Network. Thường được sử dụng cùng với driver Network tùy chỉnh.

Lưu ý : – không có sẵn cho các Service swarm.

  • Plugin Network : Bạn có thể cài đặt và sử dụng plugin Network của bên thứ ba với Docker. Các plugin này có sẵn từ Docker Storeor từ các nhà cung cấp bên thứ ba.

driver Network nào phù hợp?

  • User-defined bridge networks là tốt nhất khi bạn cần nhiều container để giao tiếp trên cùng một máy chủ Docker.
  • Network host là tốt nhất khi không nên tách biệt ngăn xếp Network khỏi máy chủ Docker, nhưng khi bạn muốn tách biệt các khía cạnh khác của container.
  • Network overlay  là tốt nhất khi bạn cần các container chạy trên các máy chủ Docker khác nhau để liên lạc hoặc khi nhiều ứng dụng hoạt động cùng nhau bằng các Service swarm.
  • Network Macvlan  là tốt nhất khi bạn di chuyển từ thiết lập VM hoặc cần các Container của bạn trông giống như máy chủ vật lý trên Network của bạn, mỗi máy chủ có một địa chỉ MAC duy nhất.
  • Các plugin Network của bên thứ ba  cho phép bạn tích hợp Docker với các ngăn xếp Network chuyên dụng.

Hầu hết các chế độ Network ở trên áp dụng cho tất cả các cài đặt Docker. Tuy nhiên, một vài tính năng nâng cao chỉ dành cho khách hàng của Docker EE.

Tính năng kết nối Network Docker EE

Hai tính năng chỉ có thể có khi sử dụng Docker EE và quản lý Service Docker của bạn bằng Máy bay điều khiển chung (UCP):

  • Network định tuyến HTTP cho phép bạn chia sẻ cùng một địa chỉ IP và cổng Network giữa nhiều Service. UCP định tuyến lưu lượng đến Service phù hợp bằng cách sử dụng kết hợp tên máy chủ và cổng, theo yêu Bridge từ máy khách.
  • Session sẽ cho phép bạn chỉ định thông tin trong tiêu đề HTTP, UCP sử dụng để định tuyến các yêu Bridge tiếp theo đến cùng một nhiệm vụ Service, cho các ứng dụng yêu Bridge các phiên có trạng thái.

Service

Các Service cho phép bạn chia tỷ lệ các container trên nhiều trình nền Docker, tất cả đều hoạt động cùng nhau như một bầy với nhiều người quản lý và công nhân. Mỗi thành viên của một bầy là một daemon Docker và tất cả các daemon đều giao tiếp bằng cách sử dụng API Docker. Một Service cho phép bạn xác định trạng thái mong muốn, chẳng hạn như số lượng bản sao của Service phải có sẵn tại bất kỳ thời điểm nào. Theo mặc định, Service được cân bằng tải trên tất cả các node worker. Đối với người tiêu dùng, Service Docker dường như là một ứng dụng duy nhất. Docker Engine hỗ trợ chế độ swarm trong Docker 1.12 trở lên.

swarm

Trong Docker cũng có sẵn tính khả dụng cao và nó được gọi là Swarm. Bằng cách sử dụng swarm, bạn có thể sử dụng các tính năng như Scaling, LoadBalancing …. Ngoài ra, còn nhiều tính năng khác, thông tin chi tiết từ đây 

Trong Swarm, bạn có thể triển khai ứng dụng của mình tới một số node chạy trên một số công cụ Docker và các công cụ này có thể trên các máy khác nhau hoặc thậm chí ở các trung tâm dữ liệu khác nhau hoặc một số trong Azure và một số trong AWS. Nếu bất kỳ một trong các node gặp sự cố hoặc ngắt kết nối, các node khác sẽ tự động tiếp nhận tải và tạo một node mới để thay thế node bị thiếu.

Lưu ý: – Đây là một trong những chủ đề quan trọng mà bạn phải hiểu thêm chi tiết không thể giải thích được mặc dù bài đăng này, tôi sẽ chia sẻ qua một bài đăng khác với các ví dụ. Mặc dù bạn có thể tìm hiểu thêm chi tiết về Docker Docs

Công nghệ Docker Underlying

Docker được viết bằng Go và tận dụng một số tính năng của nhân Linux để cung cấp chức năng của nó.

Namespace

Docker sử dụng một công nghệ được gọi là  Namespace  để cung cấp không gian làm việc bị cô lập được gọi là container. Khi bạn chạy một container, Docker tạo một tập hợp các Namespace cho container đó.

Những Namespace này cung cấp một lớp cô lập. Mỗi khía cạnh của một container chạy trong một Namespace riêng biệt và quyền truy cập của nó bị giới hạn trong Namespace đó.

Docker Engine sử dụng các Namespace như sau trên Linux:

  • Pid namespace: Cách ly tiến trình (PID: ID tiến trình).
  • Network namespace:  Quản lý Network Interface (NET: Network).
  • Ipc namespace:  Quản lý quyền truy cập vào tài nguyên IPC (IPC: InterProcess Communication).
  • Mnt namespace:  Quản lý các điểm gắn kết hệ thống tập tin (MNT: Mount).
  • Uts namespace:  Cô lập kernel và định danh phiên bản. (UTS: Hệ thống chia sẻ thời gian Unix).

Control groups

Docker Engine trên Linux cũng dựa vào một công nghệ khác gọi là Control groups (cgroups). Một nhóm giới hạn một ứng dụng cho một bộ tài nguyên cụ thể. Các Control groups cho phép Docker Engine chia sẻ tài nguyên phần cứng có sẵn cho các Container và tùy chọn thực thi các giới hạn và ràng buộc. Ví dụ: bạn có thể giới hạn bộ nhớ khả dụng cho một vùng chứa cụ thể.

Union file systems

Các hệ thống tệp Union, hay UnionFS, là các hệ thống tệp hoạt động bằng cách tạo các lớp, làm cho chúng rất nhẹ và nhanh. Docker Engine sử dụng UnionFS để cung cấp các khối xây dựng cho container. Docker Engine có thể sử dụng nhiều biến thể UnionFS, bao gồm AUFS, btrfs, vfs và DeviceMapper.

Định dạng container

Docker Engine kết hợp các Namespace, Control groups và UnionFS thành một trình bao bọc được gọi là container format. Container format mặc định là libcontainer. Trong tương lai, Docker có thể hỗ trợ các container format khác bằng cách tích hợp với các công nghệ như BSD Jails hoặc Solaris Zones.

--ST--

Đăng nhận xét

0 Nhận xét