1. Container Là Gì?
Container là một dạng ảo hóa nhẹ, dùng để đóng gói ứng dụng cùng các thành phần phụ thuộc của nó, cho phép di chuyển và chạy trên nhiều môi trường khác nhau.
1.1. Các Kho Ảnh Thường Dùng
- Harbor: https://goharbor.io/
- Alibaba Cloud: https://cr.console.aliyun.com/
- Docker Official: https://hub.docker.com/
1.2. Tại Sao Cần Sử Dụng Container?
- Đóng gói ứng dụng một lần và có thể chạy ở mọi nơi.
- Tăng tính nhất quán giữa các môi trường.
- Khả năng di chuyển cao.
- Tối ưu hóa việc sử dụng tài nguyên.
- Thời gian khởi tạo nhanh chóng.
- Cách ly tốt hơn giữa các tiến trình.
2. Docker
2.1. Docker Là Gì?
Docker là một nền tảng mã nguồn mở giúp kỹ sư phần mềm đóng gói ứng dụng cùng với tất cả các thành phần phụ thuộc vào một container nhẹ và có thể triển khai dễ dàng trên nhiều hệ điều hành Linux hoặc Windows.
2.2. Thành Phần Của Docker
- Docker Client: Công cụ tương tác với Docker thông qua lệnh dòng.
- Docker Daemon: Dịch vụ chạy trên máy chủ để quản lý container.
- Docker Image: Mẫu được dùng để tạo container mới.
- Docker Container: Một phiên bản đang chạy của image.
- Docker Registry: Nơi lưu trữ và chia sẻ các image.
2.3. Tại Sao Vẫn Nên Sử Dụng Docker?
- Docker vẫn là lựa chọn hàng đầu cho quá trình phân phối sản phẩm.
- Được ưu tiên trong phát triển và kiểm thử tại môi trường cục bộ.
- Quản lý image và container linh hoạt.
- Hệ sinh thái phong phú chưa thể thay thế hoàn toàn.
- Nhiều doanh nghiệp vẫn tin dùng Docker vì các yếu tố lịch sử.
2.4. Cài Đặt Docker
2.4.1. Cài Đặt Docker Trên CentOS
# Thêm kho chứa Docker
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Cài đặt Docker
sudo yum install docker-ce -y
# Bật dịch vụ Docker khi khởi động
sudo systemctl daemon-reload
sudo systemctl enable --now docker
2.4.2. Cấu Hình Tăng Tốc Kho Ảnh
# Tạo thư mục cấu hình nếu chưa tồn tại
sudo mkdir -p /etc/docker
# Thêm thông tin tăng tốc vào file cấu hình
echo '{"registry-mirrors": ["https://docker.m.daocloud.io", "https://docker.xuanyuan.me", "https://docker.1ms.run"]}' | sudo tee /etc/docker/daemon.json
# Áp dụng lại cấu hình và khởi động lại dịch vụ
sudo systemctl daemon-reload
sudo systemctl restart docker
2.5. Lệnh Cơ Bản Của Docker
2.5.1. Kiểm Tra Phiên Bản Docker
docker version
2.5.2. Thông Tin Chi Tiết Về Docker
docker info
2.5.3. Tìm Kiếm Ảnh
docker search nginx
2.5.4. Tải Xuống Ảnh
# Tải ảnh từ kho riêng
docker pull registry.cn-beijing.aliyuncs.com/dotbalo/counter:v1
# Tải ảnh mặc định từ Docker Hub
docker pull nginx
# Tải phiên bản cụ thể
docker pull nginx:1.15
2.5.5. Liệt Kê Các Ảnh Đã Tải
docker images
2.5.6. Thay Đổi Tag Cho Ảnh
docker tag registry.cn-beijing.aliyuncs.com/dotbalo/counter:v1 registry.cn-beijing.aliyuncs.com/dotbalo/counter:v2
2.5.7. Xóa Ảnh
docker rmi be69f2940aaf
2.5.8. Xuất Và Nhập Ảnh
# Xuất ảnh ra file
docker save nginx:1.15 > nginx.tar
# Nhập ảnh từ file
docker load < nginx.tar
2.5.9. Khởi Chạy Container
# Khởi chạy container ở chế độ tương tác
docker run -it nginx bash
# Khởi chạy container ở chế độ nền
docker run -d nginx bash
2.5.10. Kiểm Tra Container Đang Chạy
docker ps
2.5.11. Xem Thông Tin Container
docker inspect web01 | grep IPAddress
2.5.12. Xem Nhật Ký Container
docker logs -f web01 --tail 10
2.5.13. Truy Cập Vào Container
docker exec -it web01 bash
2.5.14. Ánh Xạ Cổng
docker run -d -p 88:80 nginx
2.5.15. Dừng Container
docker stop web01
2.5.16. Xóa Container
docker rm web01
2.5.17. Mount Tập Tin Và Thư Mục
docker run -itd --name web01 -v /tmp/test:/tmp/test nginx bash
2.5.18. Sao Chép File Giữa Host Và Container
# Sao chép từ host sang container
docker cp nginx.tar web02:/tmp
# Sao chép từ container về host
docker cp web02:/mnt/abc ./
3. Dockerfile
3.1. Dockerfile Là Gì?
Dockerfile là một tập tin văn bản định nghĩa các bước xây dựng một ảnh Docker. Nó bao gồm một loạt các chỉ thị, mỗi chỉ thị đại diện cho một bước trong quy trình xây dựng.
3.2. Các Chỉ Thị Trong Dockerfile
- FROM: Kế thừa từ một ảnh cơ sở.
- LABEL: Thêm thông tin metadata vào ảnh.
- RUN: Thực thi lệnh shell.
- EXPOSE: Phơi bày cổng.
- CMD: Mặc định lệnh chạy khi khởi tạo container.
- ENTRYPOINT: Lệnh thực thi chính khi container được khởi chạy.
- ENV: Thiết lập biến môi trường.
- ADD/COPY: Sao chép file vào container.
- WORKDIR: Thiết lập thư mục làm việc.
- USER: Chỉ định người dùng chạy container.
3.3. Ví Dụ Xây Dựng Dockerfile
# Tạo Dockerfile
FROM centos:7
LABEL maintainer="Mr.yang"
RUN useradd dot
ENV envir=test version=v1.0
CMD echo "envir:$envir version:$version"
# Xây dựng ảnh
docker build -t centos:env .
# Kiểm tra ảnh đã xây dựng
docker run --rm -it centos:env
4. Containerd
4.1. Container Runtime Interface (CRI)
CRI là giao diện chuẩn hóa cho phép Kubernetes tương tác với các runtime container khác nhau như Containerd, CRI-O,...
4.2. Containerd Là Gì?
Containerd là một runtime container quản lý vòng đời của container, bao gồm truyền tải ảnh, khởi tạo và giám sát container.
4.3. Cài Đặt Containerd
# Cài đặt nerdctl
wget https://github.com/containerd/nerdctl/releases/download/v1.7.6/nerdctl-1.7.6-linux-amd64.tar.gz
tar xf nerdctl-1.7.6-linux-amd64.tar.gz
mv nerdctl /usr/local/bin/
5. Quản Lý Containerd
5.1. Cấu Hình Registry Không Bảo Mật
# Sửa file cấu hình
sed -i '/\[plugins."io.containerd.grpc.v1.cri".registry.mirrors\]/a\ \ \ \ \ \ \ \ [plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.200.53"]' /etc/containerd/config.toml
echo 'endpoint = ["http://192.168.200.53"]' >> /etc/containerd/config.toml
# Khởi động lại dịch vụ
systemctl restart containerd
5.2. Quản Lý Namespace
# Liệt kê namespace
ctr ns ls
# Tạo namespace mới
ctr ns c test
# Xóa namespace
ctr ns rm test
5.3. Quản Lý Ảnh
# Tải xuống ảnh
ctr i pull 192.168.200.53/library/counter:v1 --plain-http
# Liệt kê ảnh
ctr i ls
# Thay đổi tag
ctr i tag 192.168.200.53/library/counter:v1 new-tag:v1
# Xóa ảnh
ctr i rm new-tag:v1