Docker
| Nhà phát triển | Docker, Inc. |
|---|---|
| Phát hành lần đầu | 13 tháng 3 năm 2013 |
| Phiên bản ổn định | 26.1.0
/ 23 tháng 4 năm 2024 |
| Viết bằng | Go |
| Hệ điều hành | Linux, Windows, macOS |
| Nền tảng | x86-64, ARM |
| Thể loại | Container hóa, Ảo hóa mức hệ điều hành |
| Giấy phép | Apache License 2.0 |
| Website | www |
Docker là một nền tảng phần mềm mã nguồn mở cho phép các nhà phát triển tự động hóa việc xây dựng, vận chuyển và chạy các ứng dụng bên trong các container (thùng chứa) – một hình thức ảo hóa nhẹ ở cấp độ hệ điều hành.[citation:1][citation:6] Docker cung cấp một lớp trừu tượng hóa và tự động hóa cho việc triển khai ứng dụng trên nhiều môi trường khác nhau, từ máy tính cá nhân đến các máy chủ trên đám mây, bằng cách đóng gói ứng dụng cùng tất cả các thư viện và phụ thuộc cần thiết vào một gói phần mềm di động và nhất quán.[citation:6][citation:7]
Kể từ khi phát hành lần đầu vào năm 2013, Docker đã được áp dụng rộng rãi trong nhiều lĩnh vực, từ các mô phỏng vật lý thiên văn tại Proxima Fusion cho đến các dịch vụ phát trực tuyến của Netflix và triển khai phần mềm trong không gian vũ trụ với BalenaOS.[citation:1] Docker liên tục được xếp hạng là công cụ "được sử dụng nhiều nhất" và "được mong muốn nhất" trong các cuộc khảo sát của Stack Overflow, và Docker Hub, kho lưu trữ hình ảnh container trung tâm, đã ghi nhận hơn 14 triệu hình ảnh ứng dụng và hơn 11 tỷ lượt tải xuống mỗi tháng.[citation:1]
Lịch sử
Docker được phát triển bởi công ty dotCloud (sau đổi tên thành Docker, Inc.) và được công bố rộng rãi lần đầu vào tháng 3 năm 2013.[citation:1] Ý tưởng ban đầu của Docker là đơn giản hóa việc đóng gói và chạy ứng dụng trong các container, cho phép các nhà phát triển xây dựng, vận chuyển và chạy ứng dụng ở bất kỳ đâu.
Ban đầu, Docker sử dụng Linux Containers (LXC) để cô lập các tiến trình thông qua cgroups và namespaces.[citation:2] Tuy nhiên, từ phiên bản 0.9, Docker đã giới thiệu Libcontainer, một thư viện Go cho phép Docker tương tác trực tiếp với các nguyên hàm của nhân Linux, thay thế hoàn toàn LXC và đơn giản hóa việc quản lý container.[citation:2]
Năm 2015, Docker cùng với CoreOS và các nhà lãnh đạo ngành công nghiệp khác đã thành lập Open Container Initiative (OCI) – một dự án nhằm chuẩn hóa các định dạng và thời gian chạy container. OCI đã xác định hai tiêu chuẩn cốt lõi: Specification Image (định dạng hình ảnh container) và Runtime Specification (vòng đời của container). Các tiêu chuẩn này đã giúp tạo ra một hệ sinh thái container thống nhất và mở, với các công cụ như `runC` – một runtime OCI cấp thấp – trở thành xương sống của nhiều nền tảng container.[citation:2]
Trong những năm tiếp theo, Docker đã liên tục tái cấu trúc và tách biệt các thành phần của mình. Khoảng năm 2015, Docker Engine đã được chia thành các phần chuyên biệt hơn, bao gồm `buildkit` (dùng để xây dựng hình ảnh) và `containerd` (dùng để quản lý vòng đời container và lưu trữ hình ảnh).[citation:1][citation:2]
| Phiên bản | Ngày phát hành | Thay đổi chính |
|---|---|---|
| 0.1.0 | 13 tháng 3 năm 2013 | Phiên bản đầu tiên sử dụng LXC |
| 0.9.0 | 14 tháng 1 năm 2014 | Giới thiệu Libcontainer, hỗ trợ Windows |
| 1.0.0 | 9 tháng 6 năm 2014 | Phiên bản ổn định đầu tiên |
| 1.11.0 | 13 tháng 4 năm 2016 | Chuyển sang sử dụng `containerd` và `runC` |
| 17.03.0 | 1 tháng 3 năm 2017 | Đổi cách đặt số phiên bản theo năm/tháng |
| 20.10.0 | 8 tháng 12 năm 2020 | Hỗ trợ chế độ không cần quyền root (rootless mode) |
| 26.1.0 | 23 tháng 4 năm 2024 | Các cải tiến về hiệu năng và bảo mật |
Kiến trúc
Docker sử dụng kiến trúc client-server, trong đó các thành phần chính bao gồm Docker Client, Docker Daemon, REST API và các thành phần cấp thấp hơn để quản lý container.[citation:2][citation:8]
Docker Daemon (dockerd)
`dockerd` là tiến trình nền chạy trên máy chủ, chịu trách nhiệm quản lý các đối tượng Docker như hình ảnh (images), container, mạng (networks) và khối lượng lưu trữ (volumes). Daemon cũng cung cấp một API RESTful để cho phép các ứng dụng và công cụ tương tác với nó.[citation:2][citation:5][citation:8]
Docker Client (docker)
`docker` là công cụ dòng lệnh giao tiếp với Docker Daemon thông qua REST API. Người dùng sử dụng các lệnh như `docker build`, `docker run` và `docker push` để tương tác với daemon. Điều đáng chú ý là client có thể được cài đặt trên một máy khác và điều khiển daemon từ xa.[citation:2][citation:5][citation:8]
Open Container Initiative (OCI) Runtime và Standards
Sự hợp tác giữa Docker và các công ty khác đã tạo ra OCI, tổ chức duy trì các tiêu chuẩn mở cho container. Các tiêu chuẩn này bao gồm:
- **Runtime Specification**: Định nghĩa cách một container được tạo, bắt đầu và dừng.
- **Image Specification**: Định nghĩa cấu trúc và định dạng của một image container.
- **`runC`**: Runtime tham chiếu OCI, là công cụ cấp thấp thực hiện việc khởi tạo và cô lập container.[citation:2]
containerd
`containerd` là một daemon chịu trách nhiệm quản lý vòng đời container ở cấp độ máy chủ, bao gồm việc truyền và lưu trữ hình ảnh, cũng như quản lý các tiến trình `runC`.[citation:1][citation:2] `containerd` được thiết kế để có thể nhúng vào các hệ thống lớn hơn như Kubernetes và thực hiện các nhiệm vụ cốt lõi một cách hiệu quả.
`containerd-shim`
`containerd-shim` là một tiến trình nhẹ được sử dụng để tách biệt container khỏi `containerd`. Khi `containerd` được khởi động lại, các container vẫn tiếp tục chạy vì chúng được quản lý bởi các tiến trình `shim` độc lập.[citation:2]
Docker Desktop
Docker Desktop là một ứng dụng dành cho máy tính để bàn (macOS, Windows) giúp đơn giản hóa việc cài đặt và quản lý Docker. Nó cung cấp một giao diện đồ họa (GUI) cho phép người dùng trực quan hóa và quản lý container cũng như các tài nguyên khác. Docker Desktop thường đóng gói Docker Engine và các thành phần cần thiết trong một máy ảo nhẹ để đảm bảo tính nhất quán trên các nền tảng khác nhau.[citation:8]
Các đối tượng cốt lõi (Core Objects)
Docker quản lý bốn loại tài nguyên chính:[citation:2][citation:8]
- Images (Hình ảnh): Các tệp chỉ đọc (read-only) bao gồm các lớp filesystem (lớp hệ thống tệp) và siêu dữ liệu. Image là khuôn mẫu để tạo ra container.
- Containers (Thùng chứa): Là phiên bản thực thi của một image. Mỗi container có một lớp ghi (writable layer) và các tiến trình đang chạy.
- Networks (Mạng): Là các mạng ảo cho phép các container giao tiếp với nhau và với bên ngoài.
- Volumes (Khối lượng lưu trữ): Là các đơn vị lưu trữ bền vững, tách biệt với vòng đời của container, cho phép dữ liệu tồn tại ngay cả khi container bị xóa.
Cách thức hoạt động
Công nghệ nền tảng: Namespaces và Cgroups
Docker sử dụng các tính năng của nhân Linux để cô lập container:
- **Namespaces**: Cung cấp một lớp cô lập cho các tiến trình. Docker sử dụng nhiều loại namespace khác nhau để tạo ra môi trường độc lập cho mỗi container:
* **Process ID (PID) Namespace**: Cô lập cây tiến trình. Tiến trình đầu tiên bên trong container có PID là 1, không ảnh hưởng đến các tiến trình khác trên host.[citation:5] * **Network Namespace**: Cung cấp một ngăn xếp mạng riêng biệt (giao diện mạng, bảng định tuyến, tường lửa) cho container. * **Mount (MNT) Namespace**: Cô lập các điểm gắn kết filesystem, cho phép container có hệ thống tệp gốc (root filesystem) riêng.[citation:1] * **User Namespace**: Cô lập các ID người dùng (UID) và nhóm (GID) bên trong container.
- **Control Groups (Cgroups)**: Giới hạn và giám sát việc sử dụng tài nguyên (CPU, bộ nhớ, đĩa, I/O) của container, đảm bảo một container không chiếm dụng hết tài nguyên của host.[citation:5]
Hình ảnh (Images) và Lớp (Layers)
Docker image được xây dựng từ các lớp (layers), trong đó mỗi lớp tương ứng với một chỉ thị (instruction) trong Dockerfile. Cơ chế này cho phép:
- **Tối ưu hóa bộ nhớ**: Các lớp dùng chung có thể được chia sẻ giữa các image khác nhau, tiết kiệm không gian lưu trữ.
- **Xây dựng nhanh hơn**: Khi một layer thay đổi, Docker chỉ cần xây dựng lại layer đó và các layer tiếp theo, tận dụng cache từ các lần build trước.
Quy trình tạo container (Container Creation Flow)
Khi người dùng chạy lệnh `docker run`:[citation:2][citation:8] 1. Docker CLI chuyển lệnh thành một yêu cầu REST API và gửi đến Docker Daemon. 2. Daemon kiểm tra xem image có sẵn ở local hay không. Nếu không, nó sẽ tải image từ registry (ví dụ: Docker Hub). 3. Daemon chuyển đổi image thành một `OCI bundle` – một gói chứa cấu hình và các lớp filesystem. 4. `containerd` nhận bundle từ daemon. 5. `containerd` tạo một tiến trình `containerd-shim` để quản lý container. 6. `containerd-shim` truyền bundle cho `runC`. 7. `runC` sử dụng các namespace và cgroups của nhân Linux để tạo và khởi chạy container. 8. Container được cô lập và bắt đầu chạy ứng dụng bên trong.
Docker Registry và Docker Hub
Registry là một dịch vụ lưu trữ và phân phối Docker images. Docker Hub là registry công cộng mặc định, cung cấp một kho lưu trữ khổng lồ cho các image do cộng đồng chia sẻ.[citation:2][citation:8] Người dùng cũng có thể tự thiết lập các registry riêng tư.
Docker Compose
Docker Compose là một công cụ cho phép định nghĩa và chạy các ứng dụng đa container. Sử dụng một tệp YAML (`docker-compose.yml`), người dùng có thể cấu hình các dịch vụ, mạng và volumes cho toàn bộ ứng dụng, sau đó khởi chạy tất cả chỉ với một lệnh duy nhất.[citation:8]
So sánh với Máy ảo (VM)
Docker container khác với máy ảo (VM) ở nhiều điểm quan trọng:[citation:1][citation:6][citation:12]
| Đặc điểm | Docker Container | Máy ảo (VM) |
|---|---|---|
| Cách ly | Cô lập ở cấp độ tiến trình, chia sẻ nhân (kernel) với host. | Cô lập ở cấp độ hệ thống, có nhân (kernel) riêng. |
| Khởi động | Nhanh (dưới 1 giây). | Chậm (vài phút). |
| Tài nguyên | Nhẹ, sử dụng tài nguyên hiệu quả hơn. | Nặng, cần tài nguyên riêng cho mỗi VM (RAM, CPU, lưu trữ). [citation:12] |
| Dung lượng | Nhỏ (vài MB đến vài trăm MB). | Lớn (vài GB). |
| Tính di động | Cao. Chạy trên bất kỳ hệ thống nào có Docker Engine. | Trung bình. Phụ thuộc vào nền tảng ảo hóa. |
| Khả năng mở rộng | Dễ dàng mở rộng, khởi tạo nhiều container nhanh chóng. | Mở rộng chậm hơn, tốn nhiều tài nguyên hơn. |
Máy ảo cung cấp một lớp cách ly mạnh mẽ hơn, trong khi container nhẹ và nhanh hơn, phù hợp hơn cho phát triển và triển khai các ứng dụng phân tán (microservices).[citation:1][citation:12]
Lợi ích và Ứng dụng
Lợi ích
- **Phân phối nhanh và nhất quán**: Xóa bỏ vấn đề "chạy được trên máy tôi" bằng cách cung cấp một môi trường nhất quán từ phát triển đến sản xuất.[citation:6][citation:9]
- **Tích hợp CI/CD**: Container là đơn vị lý tưởng cho các pipeline tích hợp liên tục và triển khai liên tục (CI/CD).[citation:9][citation:12]
- **Triển khai linh hoạt**: Có thể triển khai container trên nhiều nền tảng khác nhau (local, máy chủ vật lý, cloud) mà không cần thay đổi mã nguồn.[citation:6][citation:7]
- **Sử dụng tài nguyên hiệu quả**: Container nhẹ hơn và có thể chạy nhiều hơn trên cùng một phần cứng so với VM.[citation:6][citation:7]
- **Quản lý dễ dàng**: Cho phép chia tách trách nhiệm giữa nhà phát triển (xây dựng ứng dụng bên trong container) và nhà vận hành (quản lý container trong sản xuất).[citation:7][citation:12]
Ứng dụng
Docker được sử dụng rộng rãi trong nhiều lĩnh vực khác nhau:
- **Phát triển phần mềm**: Tạo ra các môi trường phát triển và thử nghiệm nhất quán.[citation:4]
- **DevOps**: Tự động hóa quy trình triển khai và vận hành ứng dụng.[citation:9]
- **Kiến trúc Microservices**: Chạy và quản lý các dịch vụ nhỏ, độc lập.[citation:1][citation:9]
- **Học máy và Trí tuệ nhân tạo (AI/ML)**: Đóng gói các mô hình, thư viện và môi trường để dễ dàng triển khai và tái tạo kết quả.[citation:3]
- **Cloud Computing**: Là nền tảng cho nhiều dịch vụ điện toán đám mây như Amazon ECS, Azure Container Instances, và Google Kubernetes Engine.[citation:12]
Hạn chế
Mặc dù rất mạnh mẽ, Docker cũng có một số hạn chế:
- **Chia sẻ nhân (Kernel)**: Nếu nhân của host gặp sự cố, tất cả các container đều bị ảnh hưởng.[citation:12]
- **Bảo mật**: Cần được cấu hình cẩn thận để ngăn chặn các lỗ hổng bảo mật.
- **Lưu trữ dữ liệu**: Quản lý dữ liệu bền vững với các volume có thể phức tạp hơn so với VM.[citation:12]
- **Đường cong học tập**: Đòi hỏi sự hiểu biết về các khái niệm container và các công cụ liên quan.
Xem thêm
Tham khảo
Liên kết ngoài
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.