Docker Phần 1 - Tìm hiểu Docker và các lệnh hay dùng
Docker là một nền tảng mạnh mẽ giúp người dùng có thể build và run các dịch vụ bằng cách sử dụng Container. Bài viết này sẽ giới thiệu về Docker, so sánh với máy ảo truyền thống, phân tích kiến trúc Docker và hướng dẫn các lệnh hay dùng để làm việc với Docker.
1. Tại sao phải sử dụng Docker?
Để hiểu được tại sao Docker trở nên phổ biến và cần thiết, chúng ta cần nhìn lại lịch sử phát triển của việc triển khai ứng dụng.
1.1. Thời kỳ sơ khai (trước khi có công nghệ ảo hóa)
Trước khi có công nghệ ảo hóa, việc triển khai dịch vụ gặp nhiều khó khăn:
- Để deploy được dịch vụ cần phải có server vật lý riêng biệt
- Phải thiết lập môi trường và cấu hình phức tạp cho từng server
- Cần thiết lập mạng cho mỗi server
Nhược điểm:
- Quá trình cấu hình phức tạp và tốn thời gian
- Khó khăn trong việc giám sát và quản lý khi số lượng server lớn
- Thiếu linh hoạt trong việc thay đổi môi trường
- Quá trình khởi động server có thể mất nhiều thời gian
- Chi phí cao để mở rộng và duy trì hệ thống
Vấn đề | Mô tả | Tác động |
---|---|---|
Cấu hình phức tạp | Mỗi server cần cấu hình riêng | Tốn thời gian, dễ sai sót |
Tài nguyên cố định | Mỗi ứng dụng cần một server riêng | Lãng phí tài nguyên |
Khó mở rộng | Thêm ứng dụng = thêm server | Chi phí cao |
Thời gian triển khai | Mua server, cài đặt, cấu hình | Có thể mất hàng tuần |
Môi trường không đồng nhất | Khó đảm bảo môi trường giống nhau | "Works on my machine" syndrome |
1.2. Thời kỳ ảo hóa (Virtualization)
Công nghệ ảo hóa đã giải quyết một số vấn đề của mô hình truyền thống:
- Có thể cài đặt các phần mềm ảo hóa như VMware, VirtualBox trên server vật lý
- Thiết lập được nhiều môi trường độc lập trên cùng một server
- Dễ dàng thao tác tạo, xóa máy ảo
Cách thức hoạt động:
- Ảo hóa hoạt động như một phần mềm mô phỏng các tính năng của phần cứng
- Hypervisor là phần mềm tạo ra và quản lý các máy ảo (Virtual Machine)
- Mỗi máy ảo là một bản sao hoàn chỉnh của máy tính vật lý, bao gồm hệ điều hành riêng
Cải tiến | Mô tả | Lợi ích |
---|---|---|
Tận dụng tài nguyên | Nhiều VM trên cùng một server vật lý | Tiết kiệm chi phí phần cứng |
Cô lập môi trường | Mỗi VM hoạt động độc lập | Tăng tính ổn định và bảo mật |
Quản lý linh hoạt | Dễ dàng tạo, sao chép, di chuyển VM | Giảm thời gian triển khai |
Khôi phục nhanh | Snapshot và backup VM | Giảm thời gian downtime |
Nhược điểm:
- Tốn một phần tài nguyên cố định của server cho mỗi máy ảo
- Không thể tạo được nhiều máy ảo do giới hạn tài nguyên
- Quá trình khởi tạo và khởi động vẫn mất thời gian đáng kể
- Khó quản lý khi số lượng máy ảo lớn
Nhược điểm | Mô tả | Hạn chế |
---|---|---|
Tài nguyên cố định | Mỗi VM cần phân bổ RAM, CPU cố định | Lãng phí khi VM không sử dụng hết |
Kích thước lớn | Mỗi VM chứa toàn bộ hệ điều hành | Chiếm nhiều dung lượng lưu trữ |
Khởi động chậm | VM cần khởi động toàn bộ OS | Mất từ vài phút đến hàng chục phút |
Hiệu suất thấp hơn | Overhead do ảo hóa phần cứng | Giảm hiệu suất so với bare metal |
1.3. Lý do Docker ra đời
Docker ra đời để khắc phục những hạn chế của cả hai mô hình trên, mang lại nhiều lợi ích:
- Cài đặt nhanh chóng và dễ dàng
- Có thể triển khai trên nhiều môi trường khác nhau
- Kích thước nhỏ gọn nên việc khởi tạo được rút ngắn đáng kể
- Linh động trong việc thay đổi môi trường hoặc cài đặt
- Chiếm ít tài nguyên của server nên có thể tạo được nhiều container hơn so với máy ảo
- Khả năng mở rộng và thu gọn linh hoạt
Lợi ích | So với Server vật lý | So với Máy ảo |
---|---|---|
Tài nguyên | Tiết kiệm hơn nhiều | Chỉ sử dụng tài nguyên khi cần |
Khởi động | Từ hàng giờ xuống vài giây | Từ vài phút xuống vài giây |
Kích thước | Từ hàng trăm GB xuống vài MB | Từ hàng chục GB xuống vài MB |
Tính nhất quán | Giải quyết vấn đề "works on my machine" | Môi trường đồng nhất hơn |
Khả năng mở rộng | Dễ dàng triển khai hàng nghìn container | Có thể chạy nhiều container hơn VM |
Quản lý | Tự động hóa cao | Dễ dàng quản lý qua Docker CLI/API |
2. Docker là gì?
Docker là một nền tảng mã nguồn mở cung cấp các tính năng giúp người sử dụng có thể build, đóng gói và run các dịch vụ bằng cách sử dụng Container. Container là các đơn vị phần mềm tiêu chuẩn hóa, chứa mọi thứ mà ứng dụng cần để chạy: mã nguồn, runtime, thư viện, biến môi trường và các file cấu hình.
Docker sử dụng công nghệ container hóa để "đóng gói" ứng dụng và các phụ thuộc của nó vào một đơn vị tiêu chuẩn hóa. Điều này đảm bảo ứng dụng sẽ chạy giống nhau trong mọi môi trường, từ máy tính cá nhân của developer đến server sản xuất.
Thành phần | Mô tả | Ví dụ |
---|---|---|
Docker Engine | Nền tảng chạy và quản lý container | dockerd, containerd |
Docker Image | Template chỉ đọc để tạo container | nginx:latest, mysql:5.7 |
Docker Container | Instance đang chạy của image | web-server-1, db-mysql-prod |
Docker Registry | Kho lưu trữ và chia sẻ image | Docker Hub, Amazon ECR |
Dockerfile | File kịch bản để build image | Chứa các lệnh như FROM, RUN, COPY |
Docker Compose | Công cụ định nghĩa và chạy multi-container | docker-compose.yml |
Ví dụ thực tế về Docker
Giả sử bạn đang phát triển một ứng dụng web sử dụng Node.js và MongoDB. Với Docker, bạn có thể:
- Tạo một Dockerfile để đóng gói ứng dụng Node.js:
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
- Sử dụng Docker Compose để định nghĩa và chạy cả ứng dụng Node.js và MongoDB:
version: '3'
services:
app:
build: .
ports:
- "3000:3000"
depends_on:
- mongo
mongo:
image: mongo:4.4
volumes:
- mongo-data:/data/db
volumes:
mongo-data:
- Chạy ứng dụng với một lệnh duy nhất:
docker-compose up
Điều này đảm bảo rằng bất kỳ ai trong team của bạn đều có thể chạy ứng dụng với cùng một môi trường, không cần quan tâm đến việc cài đặt Node.js hay MongoDB trên máy của họ.
3. Sự khác nhau giữa Docker và máy ảo
Docker và máy ảo (VM) đều giúp cô lập tài nguyên, nhưng có những khác biệt cơ bản:
Tiêu chí | Docker | Máy ảo (VMware) |
---|---|---|
Chạy trên | Phần mềm (Hệ điều hành OS) | Phần cứng (Hardware) |
Kích thước | Nhỏ (MB) | Lớn (GB) |
Tốc độ triển khai | Nhanh chóng, gọn gàng, không tốn nhiều tài nguyên | Phải cung cấp nhiều tài nguyên như CPU, RAM,... |
Tính linh hoạt | Dễ dàng di chuyển và thay đổi | Tốn nhiều thời gian để triển khai |
Hệ điều hành | Dùng chung kernel với host | Mỗi VM có hệ điều hành riêng biệt |
Thời gian khởi động | Giây | Phút |
Cô lập | Cô lập ở mức process | Cô lập hoàn toàn |
Hiệu suất | Gần bằng native | Thấp hơn do ảo hóa phần cứng |
Tài nguyên | Chia sẻ động | Phân bổ cố định |
Số lượng instance | Hàng trăm container trên một host | Thường chỉ vài chục VM trên một host |
3.1. Ưu điểm của Docker so với máy ảo
- Hiệu suất cao hơn: Docker container chia sẻ kernel của hệ điều hành host, không cần hệ điều hành riêng, nên nhẹ hơn và sử dụng ít tài nguyên hơn.
- Khởi động nhanh hơn: Container có thể khởi động trong vài giây, trong khi máy ảo có thể mất vài phút.
- Tính nhất quán: Đảm bảo ứng dụng chạy giống nhau trong mọi môi trường.
- Khả năng mở rộng: Dễ dàng mở rộng và quản lý số lượng lớn container.
- Tự động hóa: Dễ dàng tích hợp vào quy trình CI/CD.
Ưu điểm | Chi tiết | Ví dụ thực tế |
---|---|---|
Hiệu suất | Overhead thấp, gần bằng native | Benchmark cho thấy container chỉ chậm hơn 1-5% so với bare metal |
Tốc độ khởi động | Khởi động trong vài giây | docker run nginx chỉ mất 1-2 giây để sẵn sàng phục vụ |
Tính di động | Chạy giống nhau trên mọi môi trường | Từ laptop dev đến server production không cần thay đổi |
Quản lý phụ thuộc | Đóng gói mọi phụ thuộc trong image | Không cần lo về xung đột phiên bản thư viện |
Tự động hóa | Dễ tích hợp vào CI/CD | Jenkins, GitHub Actions có thể build và deploy container |
Khả năng mở rộng | Orchestration với Kubernetes, Swarm | Tự động scale từ vài container đến hàng nghìn container |
3.2. Nhược điểm của Docker so với máy ảo
- Cô lập kém hơn: Container chia sẻ kernel với host nên không cô lập hoàn toàn như máy ảo.
- Vấn đề bảo mật: Nếu có lỗ hổng trong kernel, tất cả container có thể bị ảnh hưởng.
- Hỗ trợ hệ điều hành: Container Linux không thể chạy trực tiếp trên Windows mà không có lớp ảo hóa.
Nhược điểm | Chi tiết | Giải pháp |
---|---|---|
Cô lập kém hơn | Container chia sẻ kernel với host | Sử dụng các security context, seccomp profiles |
Bảo mật | Lỗ hổng kernel ảnh hưởng tất cả container | Cập nhật kernel thường xuyên, giới hạn quyền container |
Tương thích OS | Container Linux không chạy trực tiếp trên Windows | Sử dụng WSL2 trên Windows để chạy container Linux |
Dữ liệu persistent | Container mặc định là ephemeral | Sử dụng Docker volumes hoặc bind mounts |
Hiệu suất I/O | Có thể chậm hơn với volume | Tối ưu cấu hình storage driver |
3.3. Ví dụ thực tế về sự khác biệt
Kịch bản: Triển khai một ứng dụng web NGINX
Với máy ảo:
- Tạo VM mới (10-20GB disk)
- Cài đặt hệ điều hành (15-30 phút)
- Cài đặt NGINX (5-10 phút)
- Cấu hình NGINX (5-10 phút)
- Khởi động dịch vụ Tổng thời gian: 25-50 phút, kích thước: 10-20GB
Với Docker:
- Chạy lệnh
docker run -d -p 80:80 nginx
(2-5 giây) Tổng thời gian: 2-5 giây, kích thước: ~20MB
4. Kiến trúc Docker
Docker sử dụng kiến trúc client-server. Docker client giao tiếp với Docker daemon, là thành phần thực hiện các tác vụ xây dựng, chạy và phân phối container Docker.
Thành phần | Vai trò | Chức năng chính |
---|---|---|
Docker Client | Giao diện người dùng | Gửi lệnh đến Docker daemon |
Docker Daemon (Server) | Quản lý Docker objects | Xử lý API requests, quản lý container, image |
Docker Registry | Lưu trữ Docker images | Lưu trữ và phân phối images |
Docker Objects | Các đối tượng trong Docker | Images, containers, networks, volumes |
4.1. Docker Client
Docker Client là giao diện chính để người dùng tương tác với Docker. Client cung cấp các chức năng để thay đổi các thành phần của Docker như Container, Image, Network, Volume bằng cách sử dụng RestAPI hoặc Socket để giao tiếp với Server.
Khi bạn chạy lệnh như docker run
hoặc docker build
, client sẽ gửi các lệnh này đến Docker daemon để thực thi.
Ví dụ luồng hoạt động của Docker Client:
# Khi bạn chạy lệnh
docker run -d -p 80:80 nginx
# Docker Client sẽ:
# 1. Phân tích lệnh và tham số
# 2. Gửi yêu cầu API đến Docker daemon
# 3. Hiển thị kết quả từ daemon
4.2. Docker Server
Docker Server (hay Docker daemon - dockerd) là nơi nhận request từ Client để thực thi và cũng là nơi chứa các thành phần quan trọng như Container, Image. Docker daemon là một process daemon dùng để quản lý (create, remove, build) Container, Image và các thành phần khác của Docker.
Docker daemon có thể giao tiếp với các daemon khác để quản lý các dịch vụ Docker.
Thành phần của Docker Server | Chức năng |
---|---|
dockerd | Daemon chính, xử lý API requests |
containerd | Quản lý vòng đời container |
runc | Tạo và chạy container |
shim | Giữ STDIN/STDOUT mở khi containerd restart |
[Hình ảnh 7: Các thành phần của Docker Server - cần thêm hình ảnh minh họa các thành phần của Docker daemon]
4.3. Docker Registry
Docker Registry là nơi lưu trữ và chia sẻ Docker Image. Docker Hub là registry công cộng mặc định của Docker, nơi lưu trữ hàng nghìn image có sẵn mà bạn có thể sử dụng.
Khi bạn chạy lệnh docker pull
hoặc docker run
, các image cần thiết sẽ được tải từ registry đã cấu hình. Khi bạn chạy docker push
, image của bạn sẽ được đẩy lên registry đã cấu hình.
Link Docker Hub: https://hub.docker.com/
Registry phổ biến | Mô tả | Đặc điểm |
---|---|---|
Docker Hub | Registry công cộng chính thức | Miễn phí cho public images, giới hạn cho private images |
Amazon ECR | Registry của AWS | Tích hợp với AWS, bảo mật cao |
Google Container Registry | Registry của Google Cloud | Tích hợp với GCP, tốc độ cao |
Azure Container Registry | Registry của Microsoft | Tích hợp với Azure, hỗ trợ CI/CD |
Harbor | Registry mã nguồn mở | Tự host, quản lý users, scanning bảo mật |
Ví dụ về luồng làm việc với Registry:
# Tải image từ Docker Hub
docker pull nginx:latest
# Đổi tag image để chuẩn bị đẩy lên registry khác
docker tag nginx:latest myregistry.com/myuser/nginx:v1
# Đẩy image lên registry
docker push myregistry.com/myuser/nginx:v1
[Hình ảnh 8: Docker Registry và luồng làm việc - cần thêm hình ảnh minh họa cách Docker client tương tác với registry]
5. Các thư mục và tập tin trong Docker
Để hiểu rõ cách Docker hoạt động, chúng ta cần tìm hiểu về cấu trúc thư mục trong Linux, vì Docker container thường chạy trên nền tảng Linux.
Trong Linux, các tập tin được cấu trúc theo dạng cây (Tree), với điểm bắt đầu là root. Hiểu đúng mục đích sử dụng của các thư mục sẽ giúp hệ thống và ứng dụng dễ dàng quản lý và an toàn hơn.
5.1. Các thư mục quan trọng trong Linux
Thư mục | Mục đích | Ví dụ sử dụng trong Docker |
---|---|---|
/root | Thư mục cao nhất và tất cả các file sẽ nằm trong thư mục này | Điểm bắt đầu của filesystem trong container |
/bin | Chứa các file thực thi binary cho người dùng | Chứa các lệnh cơ bản như ls, cp, mv trong container |
/sbin | Chứa các file thực thi binary cho admin | Chứa các lệnh quản trị như ifconfig, iptables |
/etc | Chứa các file cấu hình | Lưu cấu hình nginx, mysql trong container |
/mnt | Chứa các file mount tạm thời | Mount volumes từ host vào container |
/tmp | Chứa các file tạm thời | Lưu trữ tạm thời trong quá trình xử lý |
/var | Chứa các file thường xuyên thay đổi | Lưu logs (/var/log) và dữ liệu web (/var/www) |
/home | Chứa thông tin, cấu hình cho từng user | Ít khi dùng trong container vì thường chạy với một user |
/proc | Chứa thông tin xử lý của hệ thống | Truy cập thông tin về container như CPU, memory |
[Hình ảnh 9: Cấu trúc thư mục Linux trong Docker - cần thêm hình ảnh minh họa cấu trúc thư mục trong container]
5.2. Các thư mục và tập tin trong Docker
Khi làm việc với Docker, bạn sẽ thường xuyên tương tác với các thư mục và tập tin sau:
Thư mục/Tập tin | Mục đích | Ví dụ thực tế |
---|---|---|
/var/lib/docker | Thư mục chính chứa tất cả dữ liệu Docker | Nơi lưu trữ tất cả dữ liệu Docker trên host |
/var/lib/docker/containers | Chứa dữ liệu của tất cả các container | Mỗi container có một thư mục con với ID |
/var/lib/docker/volumes | Chứa các volume được tạo bởi Docker | Dữ liệu persistent của container |
/var/lib/docker/image | Chứa các image Docker đã được tải về | Các layer của image được lưu ở đây |
/etc/docker | Chứa các file cấu hình Docker | daemon.json để cấu hình Docker daemon |
Dockerfile | File cấu hình để build Docker image | Định nghĩa cách tạo image |
docker-compose.yml | File cấu hình để định nghĩa multi-container | Định nghĩa các service, network, volume |
Ví dụ về Dockerfile:
# Sử dụng image cơ sở
FROM ubuntu:20.04
# Cài đặt các package cần thiết
RUN apt-get update && apt-get install -y \
nginx \
curl \
&& rm -rf /var/lib/apt/lists/*
# Sao chép file cấu hình
COPY nginx.conf /etc/nginx/nginx.conf
# Mở port
EXPOSE 80
# Lệnh khởi động
CMD ["nginx", "-g", "daemon off;"]
Ví dụ về docker-compose.yml:
version: '3'
services:
web:
build: ./web
ports:
- "80:80"
volumes:
- ./web/html:/usr/share/nginx/html
depends_on:
- db
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: myapp
volumes:
db_data:
[Hình ảnh 10: Cấu trúc thư mục Docker trên host - cần thêm hình ảnh minh họa cấu trúc thư mục Docker trên máy host]
6. Các lệnh hay dùng với Docker
Docker cung cấp nhiều lệnh để quản lý container, image, network và volume. Dưới đây là các lệnh thường được sử dụng:
6.1. Quản lý Container
Lệnh | Mục đích | Ví dụ |
---|---|---|
docker run | Tạo và chạy một container từ image | docker run -d -p 80:80 --name webserver nginx |
docker ps | Liệt kê các container đang chạy | docker ps |
docker ps -a | Liệt kê tất cả các container | docker ps -a |
docker stop | Dừng một container đang chạy | docker stop webserver |
docker start | Khởi động lại một container đã dừng | docker start webserver |
docker rm | Xóa một container | docker rm webserver |
docker logs | Xem logs của container | docker logs -f webserver |
docker exec | Thực thi lệnh trong container đang chạy | docker exec -it webserver bash |
Ví dụ thực tế: Chạy một web server NGINX và truy cập vào container
# Chạy container NGINX với port mapping
docker run -d -p 80:80 --name webserver nginx
# Kiểm tra container đang chạy
docker ps
# Xem logs của container
docker logs webserver
# Truy cập vào container để thực hiện các lệnh
docker exec -it webserver bash
# Trong container, kiểm tra cấu hình NGINX
cat /etc/nginx/nginx.conf
# Thoát khỏi container
exit
# Dừng và xóa container
docker stop webserver
docker rm webserver
6.2. Quản lý Image
Lệnh | Mục đích | Ví dụ |
---|---|---|
docker pull | Tải một image từ Docker Hub | docker pull python:3.9 |
docker images | Liệt kê các image đã tải về | docker images |
docker rmi | Xóa một image | docker rmi python:3.9 |
docker build | Build một image từ Dockerfile | docker build -t myapp:1.0 . |
docker push | Đẩy image lên Docker Hub hoặc registry khác | docker push username/myapp:1.0 |
docker tag | Gán tag mới cho image | docker tag myapp:1.0 username/myapp:latest |
Ví dụ thực tế: Build và push một Docker image
# Tạo một Dockerfile đơn giản
cat > Dockerfile << EOF
FROM python:3.9-slim
WORKDIR /app
COPY app.py .
CMD ["python", "app.py"]
EOF
# Tạo file app.py
echo 'print("Hello from Docker!")' > app.py
# Build image
docker build -t mypythonapp:1.0 .
# Kiểm tra image đã được tạo
docker images
# Chạy container từ image
docker run mypythonapp:1.0
# Tag image để push lên Docker Hub
docker tag mypythonapp:1.0 username/mypythonapp:1.0
# Push image lên Docker Hub (cần đăng nhập trước với docker login)
docker push username/mypythonapp:1.0
6.3. Quản lý Network
Lệnh | Mục đích | Ví dụ |
---|---|---|
docker network ls | Liệt kê các network | docker network ls |
docker network create | Tạo một network mới | docker network create mynetwork |
docker network connect | Kết nối container với network | docker network connect mynetwork container_id |
docker network disconnect | Ngắt kết nối container khỏi network | docker network disconnect mynetwork container_id |
docker network rm | Xóa một network | docker network rm mynetwork |
docker network inspect | Xem chi tiết về network | docker network inspect mynetwork |
Ví dụ thực tế: Tạo network và kết nối các container
# Tạo một network mới
docker network create myapp-network
# Chạy container MySQL và kết nối với network
docker run -d --name db --network myapp-network \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=myapp \
mysql:5.7
# Chạy container web và kết nối với network
docker run -d --name web --network myapp-network \
-p 80:80 \
nginx:latest
# Kiểm tra các container trong network
docker network inspect myapp-network
# Thử kết nối từ container web đến container db
docker exec -it web ping db
6.4. Quản lý Volume
Lệnh | Mục đích | Ví dụ |
---|---|---|
docker volume ls | Liệt kê các volume | docker volume ls |
docker volume create | Tạo một volume mới | docker volume create mydata |
docker volume rm | Xóa một volume | docker volume rm mydata |
docker volume inspect | Xem thông tin chi tiết về volume | docker volume inspect mydata |
docker volume prune | Xóa tất cả các volume không sử dụng | docker volume prune |
Ví dụ thực tế: Sử dụng volume để lưu trữ dữ liệu persistent
# Tạo một volume mới
docker volume create mysql-data
# Chạy container MySQL với volume
docker run -d --name mysql-db \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
mysql:5.7
# Kiểm tra volume đã được mount
docker inspect mysql-db
# Dừng và xóa container
docker stop mysql-db
docker rm mysql-db
# Chạy container mới với cùng volume
docker run -d --name mysql-db2 \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
mysql:5.7
# Dữ liệu vẫn được giữ nguyên từ container trước
6.5. Các lệnh hệ thống
Lệnh | Mục đích | Ví dụ |
---|---|---|
docker info | Xem thông tin hệ thống Docker | docker info |
docker version | Xem phiên bản Docker | docker version |
docker system prune | Xóa tất cả container, network, image không sử dụng | docker system prune |
docker stats | Xem thống kê sử dụng tài nguyên của container | docker stats |
docker events | Xem các sự kiện real-time từ Docker daemon | docker events |
docker top | Xem các process đang chạy trong container | docker top container_id |
Ví dụ thực tế: Giám sát và dọn dẹp hệ thống Docker
# Xem thông tin hệ thống Docker
docker info
# Chạy một số container để demo
docker run -d --name web1 nginx
docker run -d --name web2 nginx
docker run -d --name web3 nginx
# Xem thống kê sử dụng tài nguyên
docker stats --no-stream
# Dừng một container
docker stop web3
# Dọn dẹp tài nguyên không sử dụng
docker system prune -f
# Xác nhận các container đã dừng đã bị xóa
docker ps -a
[Hình ảnh 11: Docker CLI và các lệnh phổ biến - cần thêm hình ảnh minh họa các nhóm lệnh Docker]
7. Hướng dẫn cài đặt Docker
7.1. Cài đặt Docker trên Windows
Yêu cầu hệ thống:
- Windows 10 64-bit: Pro, Enterprise, hoặc Education (Build 16299 hoặc mới hơn)
- Bật tính năng Hyper-V và Containers Windows
Bước | Mô tả | Lưu ý |
---|---|---|
1 | Tải Docker Desktop | Từ trang chủ Docker |
2 | Chạy file cài đặt | Cần quyền admin |
3 | Chọn cấu hình | WSL 2 hoặc Hyper-V |
4 | Khởi động lại máy | Nếu được yêu cầu |
5 | Khởi động Docker Desktop | Từ menu Start |
6 | Kiểm tra cài đặt | Chạy lệnh kiểm tra |
Các bước cài đặt chi tiết:
-
Tải Docker Desktop cho Windows từ trang chủ Docker: https://www.docker.com/products/docker-desktop
-
Chạy file cài đặt Docker Desktop Installer.exe
-
Làm theo hướng dẫn trong trình cài đặt, chọn "Use WSL 2 instead of Hyper-V" nếu bạn muốn sử dụng WSL 2
-
Khởi động lại máy tính nếu được yêu cầu
-
Khởi động Docker Desktop từ menu Start
-
Kiểm tra cài đặt bằng cách mở Command Prompt hoặc PowerShell và chạy:
docker --version
docker run hello-world
[Hình ảnh 12: Cài đặt Docker trên Windows - cần thêm hình ảnh minh họa các bước cài đặt Docker Desktop trên Windows]
7.2. Cài đặt Docker trên Ubuntu Linux
Bước | Mô tả | Lệnh |
---|---|---|
1 | Cập nhật apt | sudo apt-get update |
2 | Cài đặt các package cần thiết | sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release |
3 | Thêm GPG key | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg |
4 | Thiết lập repository | echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null |
5 | Cập nhật apt | sudo apt-get update |
6 | Cài đặt Docker Engine | sudo apt-get install docker-ce docker-ce-cli containerd.io |
7 | Kiểm tra cài đặt | sudo docker run hello-world |
8 | Cấu hình không cần sudo | sudo usermod -aG docker $USER |
Cài đặt sử dụng repository:
# Cập nhật apt package index
sudo apt-get update
# Cài đặt các package cần thiết
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
# Thêm Docker's official GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Thiết lập repository
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Cài đặt Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# Kiểm tra cài đặt
sudo docker run hello-world
Cấu hình để chạy Docker không cần sudo:
# Thêm user hiện tại vào nhóm docker
sudo usermod -aG docker $USER
# Áp dụng thay đổi nhóm
newgrp docker
# Kiểm tra
docker run hello-world
[Hình ảnh 13: Cài đặt Docker trên Ubuntu - cần thêm hình ảnh minh họa quá trình cài đặt Docker trên Ubuntu]
7.3. Kiểm tra cài đặt Docker
Sau khi cài đặt, bạn nên kiểm tra xem Docker đã hoạt động đúng chưa:
# Kiểm tra phiên bản Docker
docker --version
# Kiểm tra cài đặt chi tiết
docker info
# Chạy container hello-world để xác nhận Docker hoạt động đúng
docker run hello-world
Nếu bạn thấy thông báo "Hello from Docker!" từ container hello-world, điều đó có nghĩa là Docker đã được cài đặt thành công và đang hoạt động.
Kết luận
Docker đã cách mạng hóa cách chúng ta phát triển, triển khai và chạy ứng dụng. Với khả năng đóng gói ứng dụng cùng với tất cả các phụ thuộc của nó vào một container nhẹ, Docker giúp giải quyết vấn đề "works on my machine" và đảm bảo ứng dụng chạy nhất quán trong mọi môi trường.
Lợi ích chính của Docker | Tác động |
---|---|
Nhất quán môi trường | Giảm lỗi triển khai |
Tốc độ triển khai | Tăng tốc độ phát triển và release |
Tối ưu tài nguyên | Tiết kiệm chi phí hạ tầng |
Cô lập ứng dụng | Tăng tính bảo mật |
Khả năng mở rộng | Dễ dàng scale theo nhu cầu |
Tự động hóa | Tích hợp tốt với CI/CD |
Trong phần tiếp theo, chúng ta sẽ tìm hiểu sâu hơn về Dockerfile và Docker Registry, cách tạo image tùy chỉnh và quản lý chúng trên Docker Hub cũng như các registry tự host.
Tài liệu tham khảo
- Tài liệu chính thức của Docker: https://docs.docker.com/
- Docker Hub: https://hub.docker.com/