Hiểu Docker

Tôi đã sử dụng Docker được vài tháng nay để cấu trúc quy trình phát triển/phân phối các dự án web. Tôi cung cấp cho độc giả Habrakhabr bản dịch bài viết giới thiệu về docker - "Hiểu docker".

Docker là gì?

Docker là một nền tảng mở để phát triển, phân phối và vận hành các ứng dụng. Docker được thiết kế để cung cấp ứng dụng của bạn nhanh hơn. Với docker, bạn có thể tách ứng dụng của mình khỏi cơ sở hạ tầng và xử lý cơ sở hạ tầng như một ứng dụng được quản lý. Docker giúp bạn gửi mã nhanh hơn, kiểm tra nhanh hơn, gửi ứng dụng nhanh hơn và giảm thời gian giữa việc viết mã và chạy mã. Docker thực hiện điều này thông qua nền tảng ảo hóa vùng chứa nhẹ, sử dụng các quy trình và tiện ích giúp bạn quản lý và lưu trữ ứng dụng của mình.

Về cốt lõi, docker cho phép bạn chạy hầu hết mọi ứng dụng, được cách ly an toàn trong một thùng chứa. Cách ly an toàn cho phép bạn chạy nhiều container trên cùng một máy chủ cùng một lúc. Bản chất nhẹ của vùng chứa, chạy mà không cần thêm gánh nặng của bộ ảo hóa, cho phép bạn tận dụng tối đa phần cứng của mình.

Nền tảng và công cụ ảo hóa vùng chứa có thể hữu ích trong các trường hợp sau:

  • đóng gói ứng dụng của bạn (và các thành phần bạn sử dụng) vào các thùng chứa docker;
  • phân phối và giao những vùng chứa này cho nhóm của bạn để phát triển và thử nghiệm;
  • bố trí các vùng chứa này trên địa điểm sản xuất của bạn, cả trong trung tâm dữ liệu và trên đám mây.

Tôi có thể sử dụng docker để làm gì?

Nhanh chóng xuất bản ứng dụng của bạn

Docker rất tốt cho việc tổ chức chu trình phát triển. Docker cho phép các nhà phát triển chạy các container cục bộ với các ứng dụng và dịch vụ. Điều này sau đó cho phép bạn tích hợp với quá trình tích hợp và triển khai liên tục.

Ví dụ: nhà phát triển của bạn viết mã cục bộ và chia sẻ ngăn xếp phát triển của họ (một tập hợp hình ảnh Docker) với đồng nghiệp. Khi đã sẵn sàng, họ sẽ đẩy mã và vùng chứa đến địa điểm thử nghiệm và chạy mọi thử nghiệm cần thiết. Từ địa điểm thử nghiệm, họ có thể gửi mã và hình ảnh đến nơi sản xuất.

Dễ dàng bố trí và mở ra hơn

Nền tảng dựa trên bộ chứa docker giúp bạn dễ dàng chuyển tải trọng của mình. Bộ chứa Docker có thể chạy trên máy cục bộ của bạn, máy thật hoặc trên máy ảo trong trung tâm dữ liệu hoặc trên đám mây.

Tính di động và tính chất nhẹ của docker giúp bạn dễ dàng quản lý khối lượng công việc của mình một cách linh hoạt. Bạn có thể sử dụng docker để triển khai hoặc tắt ứng dụng hoặc dịch vụ của mình. Tốc độ của docker cho phép việc này được thực hiện gần như trong thời gian thực.

Tải cao hơn và tải trọng nhiều hơn

Docker nhẹ và nhanh. Nó cung cấp một giải pháp thay thế linh hoạt, tiết kiệm chi phí cho các máy ảo dựa trên bộ ảo hóa. Nó đặc biệt hữu ích trong môi trường tải cao, chẳng hạn như khi tạo đám mây hoặc nền tảng dưới dạng dịch vụ của riêng bạn. Nhưng nó cũng hữu ích cho các ứng dụng vừa và nhỏ khi bạn muốn tận dụng tối đa tài nguyên mình có.

Các thành phần Docker chính

Docker bao gồm hai thành phần chính:

  • Docker: nền tảng ảo hóa nguồn mở;
  • Docker Hub: Nền tảng dưới dạng dịch vụ của chúng tôi để phân phối và quản lý các bộ chứa Docker.

Ghi chú! Docker được phân phối theo giấy phép Apache 2.0.

Kiến trúc Docker

Docker sử dụng kiến ​​trúc client-server. Máy khách Docker giao tiếp với daemon Docker, daemon này đảm nhận trách nhiệm tạo, chạy và phân phối vùng chứa của bạn. Cả máy khách và máy chủ đều có thể chạy trên cùng một hệ thống, bạn có thể kết nối máy khách với trình nền docker từ xa. Máy khách và máy chủ giao tiếp qua ổ cắm hoặc API RESTful.

Hiểu Docker

Trình nền Docker

Như được hiển thị trong sơ đồ, daemon chạy trên máy chủ. Người dùng không tương tác trực tiếp với máy chủ mà sử dụng máy khách cho việc này.

Máy khách Docker

Máy khách Docker, chương trình docker, là giao diện chính của Docker. Nó nhận lệnh từ người dùng và tương tác với daemon docker.

Docker bên trong

Để hiểu docker bao gồm những gì, bạn cần biết về ba thành phần:

  • hình ảnh
  • sổ đăng ký
  • container

Hình ảnh

Hình ảnh Docker là một mẫu chỉ đọc. Ví dụ: hình ảnh có thể chứa hệ điều hành Ubuntu với Apache và một ứng dụng trên đó. Hình ảnh được sử dụng để tạo container. Docker giúp bạn dễ dàng tạo hình ảnh mới, cập nhật hình ảnh hiện có hoặc bạn có thể tải xuống hình ảnh do người khác tạo. Hình ảnh là thành phần của bản dựng docker.

Đăng ký

Sổ đăng ký Docker lưu trữ hình ảnh. Có các cơ quan đăng ký công khai và riêng tư mà từ đó bạn có thể tải xuống hoặc tải lên hình ảnh. Một sổ đăng ký Docker công khai là Trung tâm Docker. Có một bộ sưu tập lớn các hình ảnh được lưu trữ ở đó. Như các bạn đã biết, hình ảnh có thể do chính bạn tạo ra hoặc có thể sử dụng hình ảnh do người khác tạo ra. Cơ quan đăng ký là một thành phần phân phối.

Container

Các thùng chứa tương tự như các thư mục. Các thùng chứa chứa mọi thứ mà ứng dụng cần để chạy. Mỗi vùng chứa được tạo từ một hình ảnh. Các vùng chứa có thể được tạo, bắt đầu, dừng, di chuyển hoặc xóa. Mỗi vùng chứa được cách ly và cung cấp nền tảng an toàn cho ứng dụng. Container là thành phần của công việc.

Vậy Docker hoạt động như thế nào?

Cho đến nay chúng ta biết rằng:

  • chúng tôi có thể tạo hình ảnh chứa ứng dụng của chúng tôi;
  • chúng ta có thể tạo các thùng chứa từ hình ảnh để chạy ứng dụng;
  • Chúng tôi có thể phân phối hình ảnh thông qua Docker Hub hoặc cơ quan đăng ký hình ảnh khác.

Hãy xem các thành phần này ăn khớp với nhau như thế nào nhé.

Hình ảnh hoạt động như thế nào?

Chúng ta đã biết rằng hình ảnh là một mẫu chỉ đọc mà từ đó một vùng chứa được tạo ra. Mỗi hình ảnh bao gồm một tập hợp các cấp độ. Docker sử dụng hệ thống tập tin công đoàn để kết hợp các cấp độ này thành một hình ảnh. Hệ thống tệp liên kết cho phép các tệp và thư mục từ các hệ thống tệp khác nhau (các nhánh khác nhau) chồng lên nhau một cách minh bạch, tạo ra một hệ thống tệp mạch lạc.

Một trong những lý do khiến docker nhẹ là vì nó sử dụng các lớp như thế này. Khi bạn thay đổi hình ảnh, chẳng hạn như cập nhật ứng dụng, một lớp mới sẽ được tạo. Vì vậy, không cần thay thế toàn bộ hình ảnh hoặc xây dựng lại nó, như bạn có thể phải làm với máy ảo, chỉ có lớp được thêm hoặc cập nhật. Và bạn không phải phân phối toàn bộ hình ảnh mới, chỉ có bản cập nhật được phân phối, giúp việc phân phối hình ảnh trở nên dễ dàng và nhanh chóng hơn.

Trung tâm của mỗi hình ảnh là một hình ảnh cơ bản. Ví dụ: ubuntu, hình ảnh cơ sở của Ubuntu hoặc fedora, hình ảnh cơ sở của bản phân phối Fedora. Bạn cũng có thể sử dụng hình ảnh làm cơ sở để tạo hình ảnh mới. Ví dụ: nếu bạn có hình ảnh apache, bạn có thể sử dụng hình ảnh đó làm hình ảnh cơ sở cho các ứng dụng web của mình.

Ghi chú! Docker thường lấy hình ảnh từ sổ đăng ký Docker Hub.

Hình ảnh Docker có thể được tạo từ những hình ảnh cơ sở này; chúng tôi gọi các bước để tạo những hình ảnh này là hướng dẫn. Mỗi hướng dẫn tạo ra một hình ảnh hoặc cấp độ mới. Các hướng dẫn sẽ như sau:

  • lệnh chạy
  • thêm một tập tin hoặc thư mục
  • tạo một biến môi trường
  • hướng dẫn về những gì cần chạy khi vùng chứa hình ảnh này được khởi chạy

Các hướng dẫn này được lưu trữ trong một tập tin Dockerfile. Docker đọc cái này Dockerfile, khi bạn xây dựng hình ảnh, hãy thực hiện các hướng dẫn này và trả về hình ảnh cuối cùng.

Đăng ký docker hoạt động như thế nào?

Sổ đăng ký là một kho lưu trữ hình ảnh docker. Sau khi hình ảnh được tạo, bạn có thể xuất bản nó lên sổ đăng ký Docker Hub công khai hoặc sổ đăng ký cá nhân của bạn.

Với ứng dụng khách docker, bạn có thể tìm kiếm các hình ảnh đã được xuất bản và tải chúng xuống máy docker của mình để tạo vùng chứa.

Docker Hub cung cấp kho lưu trữ hình ảnh công khai và riêng tư. Mọi người đều có thể tìm kiếm và tải xuống hình ảnh từ kho lưu trữ công cộng. Nội dung của kho lưu trữ riêng không được đưa vào kết quả tìm kiếm. Và chỉ bạn và người dùng của bạn mới có thể nhận được những hình ảnh này và tạo vùng chứa từ chúng.

Thùng chứa hoạt động như thế nào?

Vùng chứa bao gồm hệ điều hành, tệp người dùng và siêu dữ liệu. Như chúng ta đã biết, mỗi container được tạo từ một image. Hình ảnh này cho Docker biết có gì trong vùng chứa, quá trình nào sẽ bắt đầu, thời điểm vùng chứa khởi động và các dữ liệu cấu hình khác. Hình ảnh Docker ở chế độ chỉ đọc. Khi docker khởi động một vùng chứa, nó sẽ tạo một lớp đọc/ghi phía trên hình ảnh (sử dụng hệ thống tệp hợp nhất như đã nêu trước đó) trong đó ứng dụng có thể chạy.

Điều gì xảy ra khi container khởi động?

Hoặc sử dụng chương trình dockerhoặc sử dụng API RESTful, máy khách docker sẽ yêu cầu trình nền của docker khởi động vùng chứa.

$ sudo docker run -i -t ubuntu /bin/bash

Chúng ta hãy xem lệnh này. Máy khách được khởi chạy bằng lệnh docker, với tùy chọn run, cho biết một container mới sẽ được tung ra. Các yêu cầu tối thiểu để chạy một container là các thuộc tính sau:

  • sử dụng hình ảnh nào để tạo vùng chứa. Trong trường hợp của chúng ta ubuntu
  • lệnh bạn muốn chạy khi vùng chứa được khởi động. Trong trường hợp của chúng ta /bin/bash

Điều gì xảy ra khi chúng ta chạy lệnh này?

Docker, theo thứ tự, thực hiện như sau:

  • tải xuống hình ảnh Ubuntu: docker kiểm tra tính khả dụng của hình ảnh ubuntu trên máy cục bộ và nếu nó không có ở đó thì hãy tải xuống từ Trung tâm Docker. Nếu có một hình ảnh, nó sẽ sử dụng hình ảnh đó để tạo vùng chứa;
  • tạo một thùng chứa: khi nhận được hình ảnh, docker sử dụng nó để tạo vùng chứa;
  • khởi tạo hệ thống tập tin và gắn kết mức chỉ đọc: vùng chứa được tạo trong hệ thống tệp và hình ảnh được thêm vào mức chỉ đọc;
  • khởi tạo mạng/cầu: tạo giao diện mạng cho phép docker giao tiếp với máy chủ;
  • Cài đặt địa chỉ IP: tìm và đặt địa chỉ;
  • Bắt đầu quá trình được chỉ định: khởi chạy ứng dụng của bạn;
  • Xử lý và tạo đầu ra từ ứng dụng của bạn: kết nối và ghi lại luồng đầu vào, đầu ra và lỗi tiêu chuẩn của ứng dụng để bạn có thể theo dõi ứng dụng của mình đang hoạt động như thế nào.

Bây giờ bạn có một container đang hoạt động. Bạn có thể quản lý vùng chứa, tương tác với ứng dụng của mình. Khi bạn quyết định dừng ứng dụng, hãy xóa vùng chứa.

Công nghệ được sử dụng

Docker được viết bằng Go và sử dụng một số tính năng của nhân Linux để triển khai chức năng trên.

Không gian tên

Docker sử dụng công nghệ namespaces để tổ chức các không gian làm việc biệt lập mà chúng tôi gọi là vùng chứa. Khi chúng ta khởi động một vùng chứa, docker sẽ tạo một tập hợp các không gian tên cho vùng chứa đó.

Điều này tạo ra một lớp biệt lập, với mỗi khía cạnh của vùng chứa chạy trong không gian tên riêng và không có quyền truy cập vào hệ thống bên ngoài.

Danh sách một số namespace docker sử dụng:

  • pid: để cô lập quá trình;
  • mạng lưới: để quản lý giao diện mạng;
  • ipc: để quản lý tài nguyên IPC. (ICP: Giao tiếp giữa các quá trình);
  • nhớ: để quản lý các điểm gắn kết;
  • utc: để cô lập kernel và điều khiển việc tạo phiên bản (UTC: hệ thống chia sẻ thời gian Unix).

Nhóm kiểm soát

Docker cũng sử dụng công nghệ cgroups hoặc nhóm kiểm soát. Chìa khóa để chạy một ứng dụng một cách riêng biệt là chỉ cung cấp cho ứng dụng những tài nguyên bạn muốn cung cấp. Điều này đảm bảo rằng các container sẽ là hàng xóm tốt. Các nhóm kiểm soát cho phép bạn chia sẻ tài nguyên phần cứng có sẵn và nếu cần, đặt giới hạn và hạn chế. Ví dụ: giới hạn dung lượng bộ nhớ có thể có cho vùng chứa.

Hệ thống tập tin liên minh

Union File Sysem hoặc UnionFS là một hệ thống tệp hoạt động bằng cách tạo các lớp, làm cho nó rất nhẹ và nhanh. Docker sử dụng UnionFS để tạo các khối mà từ đó container được xây dựng. Docker có thể sử dụng một số biến thể của UnionFS bao gồm: AUFS, btrfs, vfs và DeviceMapper.

Định dạng vùng chứa

Docker kết hợp các thành phần này thành một trình bao bọc mà chúng tôi gọi là định dạng vùng chứa. Định dạng mặc định được gọi libcontainer. Docker cũng hỗ trợ định dạng container truyền thống trên Linux bằng cách sử dụng LXC. Trong tương lai, Docker có thể hỗ trợ các định dạng vùng chứa khác. Ví dụ: tích hợp với BSD Jails hoặc Solaris Zone.

Nguồn: www.habr.com

Thêm một lời nhận xét