Docker là một nền tảng mã nguồn mở giúp các nhà phát triển xây dựng, triển khai, chạy, cập nhật và quản lý các ứng dụng container hóa. Docker cho phép đóng gói ứng dụng và tất cả các phụ thuộc của nó vào một đơn vị tiêu chuẩn gọi là container, giúp ứng dụng có thể chạy một cách nhất quán trên nhiều môi trường khác nhau.
Lịch sử và sự phát triển của Docker
Docker được ra mắt vào năm 2013 bởi công ty Docker, Inc. Ban đầu, Docker được phát triển để giải quyết vấn đề "chạy trên máy của tôi" mà nhiều nhà phát triển gặp phải khi ứng dụng hoạt động trên máy phát triển nhưng không hoạt động trên máy chủ sản xuất. Docker đã nhanh chóng trở thành một công cụ phổ biến trong cộng đồng phát triển phần mềm và DevOps nhờ khả năng đơn giản hóa quá trình phát triển, kiểm thử và triển khai ứng dụng.
Kiến trúc của Docker
Docker sử dụng mô hình kiến trúc client-server, bao gồm các thành phần chính sau:
-
Docker Client: Docker client là giao diện dòng lệnh (CLI) cho phép người dùng tương tác với Docker daemon. Người dùng có thể sử dụng Docker client để gửi các lệnh như
docker build
,docker pull
,docker run
đến Docker daemon. -
Docker Daemon: Docker daemon chạy trên hệ điều hành máy chủ và chịu trách nhiệm quản lý các container Docker. Docker daemon nhận các lệnh từ Docker client và thực hiện các tác vụ như xây dựng, chạy và phân phối các container.
-
Docker Registry: Docker registry là nơi lưu trữ các Docker image. Docker Hub là một registry công cộng phổ biến, nhưng người dùng cũng có thể thiết lập registry riêng của mình. Docker client có thể kéo (pull) các image từ registry và đẩy (push) các image lên registry.
-
Docker Objects: Các đối tượng Docker bao gồm Docker images, containers, networks và volumes. Docker images là các mẫu chỉ đọc dùng để tạo container. Docker containers là các instance đang chạy của Docker images. Docker networks cho phép các container giao tiếp với nhau. Docker volumes cung cấp khả năng lưu trữ dữ liệu bền vững cho các container.
Docker Images và Docker Containers
- Docker Images: Docker image là một mẫu chỉ đọc chứa tất cả các thành phần cần thiết để chạy một ứng dụng, bao gồm mã nguồn, runtime, thư viện, và các công cụ hệ thống. Docker image được xây dựng từ một file cấu hình gọi là Dockerfile. Dockerfile chứa các lệnh để xây dựng image, chẳng hạn như cài đặt các gói phần mềm và sao chép mã nguồn vào image.
- Docker Containers: Docker container là một instance đang chạy của Docker image. Container cung cấp một môi trường cách ly để chạy ứng dụng, giúp đảm bảo rằng ứng dụng sẽ hoạt động nhất quán trên nhiều môi trường khác nhau. Container chia sẻ kernel của hệ điều hành chủ, nhưng có hệ thống file, mạng và không gian tiến trình riêng.
Các lệnh Docker cơ bản
Dưới đây là một số lệnh Docker cơ bản mà bạn sẽ sử dụng thường xuyên khi làm việc với Docker:
-
docker --version: Hiển thị phiên bản Docker hiện tại.
bashdocker --version
-
docker pull: Kéo một Docker image từ Docker Hub.
bashdocker pull <image_name>
-
docker run: Tạo và chạy một container từ một Docker image.
bashdocker run <image_name>
-
docker ps: Liệt kê các container đang chạy.
bashdocker ps
-
docker ps -a: Liệt kê tất cả các container, bao gồm cả các container đã dừng.
bashdocker ps -a
-
docker stop: Dừng một container đang chạy.
bashdocker stop <container_id>
-
docker start: Khởi động lại một container đã dừng.
bashdocker start <container_id>
-
docker rm: Xóa một container đã dừng.
bashdocker rm <container_id>
-
docker rmi: Xóa một Docker image.
bashdocker rmi <image_name>
Ví dụ: Tạo và chạy một ứng dụng web đơn giản với Docker
Trong ví dụ này, chúng ta sẽ tạo và chạy một ứng dụng web đơn giản sử dụng Docker.
-
Tạo Dockerfile
Tạo một file có tên là
Dockerfile
với nội dung sau:Dockerfile# Sử dụng image chính thức của Node.js làm base image FROM node:14 # Tạo thư mục làm việc trong container WORKDIR /app # Sao chép package.json và package-lock.json vào thư mục làm việc COPY package*.json ./ # Cài đặt các phụ thuộc của ứng dụng RUN npm install # Sao chép mã nguồn ứng dụng vào thư mục làm việc COPY . . # Mở cổng 8080 để truy cập ứng dụng EXPOSE 8080 # Chạy ứng dụng khi container khởi động CMD ["node", "app.js"]
-
Tạo file package.json
Tạo một file có tên là
package.json
với nội dung sau:json{ "name": "docker-example", "version": "1.0.0", "description": "A simple web application", "main": "app.js", "scripts": { "start": "node app.js" }, "dependencies": { "express": "^4.17.1" } }
-
Tạo file app.js
Tạo một file có tên là
app.js
với nội dung sau:javascriptconst express = require('express'); const app = express(); const port = 8080; app.get('/', (req, res) => { res.send('Hello, Docker!'); }); app.listen(port, () => { console.log(`App running at http://localhost:${port}`); });
-
Xây dựng Docker image
Sử dụng lệnh
docker build
để xây dựng Docker image từ Dockerfile:bashdocker build -t docker-example .
-
Chạy Docker container
Sử dụng lệnh
docker run
để tạo và chạy một container từ Docker image vừa xây dựng:bashdocker run -p 8080:8080 docker-example
-
Truy cập ứng dụng
Mở trình duyệt web và truy cập
http://localhost:8080
. Bạn sẽ thấy thông báo "Hello, Docker!".
Lợi ích của Docker
Docker mang lại nhiều lợi ích cho quá trình phát triển và triển khai ứng dụng:
- Tính nhất quán: Docker đảm bảo rằng ứng dụng sẽ hoạt động nhất quán trên nhiều môi trường khác nhau, từ máy phát triển đến máy chủ sản xuất.
- Tính di động: Docker container có thể chạy trên nhiều nền tảng khác nhau, bao gồm máy tính cá nhân, máy chủ vật lý, máy ảo, và các dịch vụ đám mây.
- Hiệu quả tài nguyên: Docker container nhẹ hơn so với máy ảo vì chúng chia sẻ kernel của hệ điều hành chủ và chỉ bao gồm các thành phần cần thiết để chạy ứng dụng.
- Tính linh hoạt: Docker cho phép dễ dàng mở rộng và thu nhỏ ứng dụng bằng cách thêm hoặc xóa các container.
- Tích hợp CI/CD: Docker tích hợp tốt với các công cụ CI/CD, giúp tự động hóa quá trình xây dựng, kiểm thử và triển khai ứng dụng.
Kết luận
Docker là một công cụ mạnh mẽ giúp đơn giản hóa quá trình phát triển, kiểm thử và triển khai ứng dụng. Bằng cách sử dụng Docker, các nhà phát triển có thể đảm bảo rằng ứng dụng của họ sẽ hoạt động nhất quán trên nhiều môi trường khác nhau, từ máy phát triển đến máy chủ sản xuất. Docker cũng mang lại nhiều lợi ích về tính di động, hiệu quả tài nguyên, và tính linh hoạt, giúp tối ưu hóa quá trình phát triển và triển khai ứng dụng.