1 Giớithiệu 3 1.1 Tổngquanvềcontainerization . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2 MụcđíchvàýnghĩacủaDocker . . . . . . . . . . . . . . . . . . . . . . . 3 1.3 Mụctiêucủabàibáocáo. . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2 BốicảnhcủaDocker 3 2.1 Sựtiếnhóacủacáccôngnghệcontainerization . . . . . . . . . . . . . . 4 2.2 TạisaoDockertrởthànhmộtnềntảngcontainerphổbiến . . . . . . . . 4 3 Dockerlàgì? 5 3.1 ĐịnhnghĩavàcáckháiniệmcốtlõicủaDocker . . . . . . . . . . . . . . 5 3.2 Sosánhvớimáyảo(VMs) . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.3 KiếntrúcvàcácthànhphầncủaDocker . . . . . . . . . . . . . . . . . . 6 4 DockerUseCases 8 5 BắtđầuvớiDocker 8 5.1 Càiđặtvàthiếtlậptrêncácnềntảngkhácnhau(Windows,macOS,Linux) 8 5.2 Chạycontainerđầutiêncủabạn . . . . . . . . . . . . . . . . . . . . . . 9 5.3 CáclệnhvàthaotáccơbảncủaDocker . . . . . . . . . . . . . . . . . . 9 6 CáckháiniệmcốtlõicủaContainer 10 6.1 ContainerLifeCircle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 6.2 CáccâulệnhbêntrongContainer . . . . . . . . . . . . . . . . . . . . . . 10 6.3 PortMapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 6.4 LogsTrace. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 6.5 Volumebindmount . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 7 DockerfilevàDockerCompose 12 7.1 ViếtDockerfilesđểxâydựngcácảnhtùychỉnh . . . . . . . . . . . . . . 12 7.2 BuildContext .dockerignore . . . . . . . . . . . . . . . . . . . . . . . . 13 7.3 SửdụngDockerComposechocácứngdụngđacontainer . . . . . . . . . 13 1 8 Mạng và Volumes 15 8.1 Hiểu về mạng Docker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 8.2 Quản lý dữ liệu với Docker volumes . . . . . . . . . . . . . . . . . . . . . 16 9 Docker Demo 10 Thách thức và những điều cần cân nhắc 11 References 16 16 18
Trang 1Khoa Công nghệ thông tin Đại học Công nghệ – Đại học Quốc gia Hà Nội
Tìm hiểu về Docker
Nguyễn Xuân Hòa 21020072@vnu.edu.vn
Trịnh Văn Khánh 21020343@vnu.edu.vn
Trang 2Mục lục
1.1 Tổng quan về containerization 3
1.2 Mục đích và ý nghĩa của Docker 3
1.3 Mục tiêu của bài báo cáo 3
2 Bối cảnh của Docker 3 2.1 Sự tiến hóa của các công nghệ containerization 4
2.2 Tại sao Docker trở thành một nền tảng container phổ biến 4
3 Docker là gì? 5 3.1 Định nghĩa và các khái niệm cốt lõi của Docker 5
3.2 So sánh với máy ảo (VMs) 6
3.3 Kiến trúc và các thành phần của Docker 6
4 Docker Use Cases 8 5 Bắt đầu với Docker 8 5.1 Cài đặt và thiết lập trên các nền tảng khác nhau (Windows, macOS, Linux) 8 5.2 Chạy container đầu tiên của bạn 9
5.3 Các lệnh và thao tác cơ bản của Docker 9
6 Các khái niệm cốt lõi của Container 10 6.1 Container Life Circle 10
6.2 Các câu lệnh bên trong Container 10
6.3 Port Mapping 11
6.4 Logs Trace 11
6.5 Volume - bind mount 11
7 Dockerfile và Docker Compose 12 7.1 Viết Dockerfiles để xây dựng các ảnh tùy chỉnh 12
7.2 Build Context - dockerignore 13
7.3 Sử dụng Docker Compose cho các ứng dụng đa container 13
Trang 38 Mạng và Volumes 15
8.1 Hiểu về mạng Docker 15 8.2 Quản lý dữ liệu với Docker volumes 16
Trang 41 Giới thiệu
1.1 Tổng quan về containerization
- Containerization là một kỹ thuật cho phép các ứng dụng chạy trên các nền tảng khác nhau mà không cần phải cài đặt các thành phần phụ thuộc (dependencies) của chúng Các ứng dụng được đóng gói trong các container, mỗi container chứa tất cả các thành phần cần thiết để chạy ứng dụng đó Các container này có thể được chạy trên các máy chủ vật lý hoặc máy ảo, và có thể được chuyển giữa các máy chủ một cách dễ dàng
1.2 Mục đích và ý nghĩa của Docker
- Docker là một nền tảng containerization phổ biến nhất hiện nay Nó cung cấp một cách tiếp cận đơn giản và hiệu quả để phát triển, chạy và quản lý các ứng dụng trong các container Docker cũng cung cấp một hệ sinh thái phong phú các công cụ và dịch vụ hỗ trợ cho việc phát triển và triển khai các ứng dụng trong các container
- Docker là một công nghệ quan trọng trong việc phát triển phần mềm hiện đại Nó giúp các nhà phát triển phần mềm có thể phát triển và chạy các ứng dụng của họ trên nhiều nền tảng khác nhau một cách dễ dàng Nó cũng giúp các nhà quản trị hệ thống có thể quản lý các ứng dụng một cách hiệu quả hơn
1.3 Mục tiêu của bài báo cáo
- Bài báo cáo này sẽ cung cấp một cái nhìn tổng quan về Docker, bao gồm các khái niệm
cơ bản, lợi ích, các trường hợp sử dụng, các thành phần của hệ sinh thái Docker Nó cũng
sẽ đề cập đến một số thách thức và hạn chế của Docker, cũng như những xu hướng và phát triển trong tương lai
Hình 1: Docker là công nghệ container phổ biến nhất hiện nay
Trang 52.1 Sự tiến hóa của các công nghệ containerization
- Các công nghệ containerization đã tồn tại từ nhiều năm trước khi Docker ra đời Các công nghệ này bao gồm các công nghệ như chroot, Solaris Zones, FreeBSD Jails, Linux-VServer, OpenVZ, LXC, Warden, cgroups, namespaces, và AUFS Các công nghệ này đều có mục đích chung là cô lập các ứng dụng trong các môi trường độc lập với nhau, nhưng chúng có những hạn chế khác nhau
- Containerization trước đây thường chỉ hỗ trợ cho các ứng dụng chạy trên một nền tảng
cụ thể Docker ra đời với mục tiêu là cung cấp một nền tảng containerization độc lập với nền tảng, cho phép các ứng dụng có thể chạy trên nhiều nền tảng khác nhau
2.2 Tại sao Docker trở thành một nền tảng container phổ biến
- Tính di động: Docker cho phép đóng gói ứng dụng và môi trường của chúng vào các
container Điều này đồng nghĩa rằng một ứng dụng Docker sẽ hoạt động tương tự trên mọi máy chủ hỗ trợ Docker, bất kể môi trường máy chủ đó cài đặt
- Tính cô đọng: Docker containers sử dụng cùng một hạt nhân của hệ điều hành và
chia sẻ các tài nguyên hệ thống với host OS Điều này giúp tiết kiệm tài nguyên hơn so với việc chạy các máy ảo đầy đủ
- Tính nhẹ nhàng: Containers Docker khởi động nhanh hơn so với máy ảo truyền thống,
vì chúng không cần chạy một hệ điều hành đầy đủ
- Quản lý tài nguyên tốt hơn: Docker cung cấp các công cụ để quản lý tài nguyên
của containers, cho phép bạn giới hạn mức tiêu tốn tài nguyên như CPU, RAM, mạng, v.v
- Quản lý ứng dụng dễ dàng: Docker Compose và các công cụ quản lý tương tự giúp
triển khai và quản lý các ứng dụng đa container một cách dễ dàng Điều này giúp tổ chức phát triển và triển khai ứng dụng một cách hiệu quả hơn
- Tích hợp liền mạch với các công cụ và hệ thống khác: Docker cung cấp các
API và tiêu chuẩn mở, cho phép tích hợp với các công cụ quản lý và hệ thống khác như Kubernetes, Jenkins, CI/CD pipelines, v.v
- Cộng đồng hỗ trợ mạnh mẽ: Docker có một cộng đồng lớn và tích cực, điều này
có nghĩa là có nhiều tài liệu, hướng dẫn và hỗ trợ từ cộng đồng để giúp người dùng giải quyết vấn đề và tận dụng tối đa lợi ích từ Docker
- Hỗ trợ đa nền tảng: Docker hỗ trợ nhiều nền tảng hệ điều hành như Linux, Windows,
MacOS và có thể chạy trên nhiều loại hạ tầng khác nhau như trên máy tính cá nhân, trên đám mây công cộng, hay trong môi trường tự lập
Trang 63 Docker là gì?
3.1 Định nghĩa và các khái niệm cốt lõi của Docker
- Docker là một nền tảng phần mềm giúp người phát triển có khả năng đóng gói ứng dụng và các phụ thuộc của nó vào trong một container độc lập Container này chứa môi trường và tài nguyên cần thiết để ứng dụng hoạt động một cách đáng tin cậy và nhất quán trên bất kỳ máy chủ nào
- Các khái niệm cốt lõi của Docker bao gồm:
• Image: Một hình ảnh Docker là một gói 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, thư viện, biến môi trường và cài đặt khác Images được sử dụng để tạo các container
• Container: Một container Docker là một thực thể chạy của một hình ảnh Nó chứa
tất cả những gì cần thiết để thực thi ứng dụng, bao gồm hệ điều hành, môi trường thực thi, mã nguồn, thư viện, biến môi trường và cài đặt
• Registry: Docker Registry là nơi lưu trữ các hình ảnh Docker Docker Hub là một
ví dụ phổ biến về public registry, nơi các nhà phát triển có thể chia sẻ và tìm kiếm các hình ảnh
• Dockerfile: Dockerfile là một tệp văn bản chứa các hướng dẫn để xây dựng một
hình ảnh Docker Nó mô tả cách sắp xếp các thành phần của hình ảnh, cài đặt các phụ thuộc, và cấu hình môi trường
• Compose: Docker Compose là một công cụ giúp định nghĩa và quản lý các ứng
dụng multi-container Nó sử dụng một tệp YAML để mô tả cấu hình của các container, mạng và lưu trữ dữ liệu
• Volume: Docker Volume là một cách để lưu trữ và quản lý dữ liệu giữa các container
một cách độc lập Điều này cho phép dữ liệu được duy trì và chia sẻ giữa các container khác nhau
• Network: Docker Network cung cấp một cách để các container giao tiếp với nhau
hoặc với mạng bên ngoài Điều này cho phép các container hoạt động như các máy
ảo độc lập với địa chỉ IP và cổng riêng
• Swarm: Docker Swarm là một công cụ tích hợp sẵn cho việc quản lý và triển khai
các ứng dụng được đóng gói trong Docker Nó cho phép tổ chức các container thành các nhóm, gọi là services, để tăng tính sẵn sàng và mở rộng
Trang 7Hình 2: So sánh giữa Docker và VMs
3.2 So sánh với máy ảo (VMs)
Sử dụng lại OS máy chủ Chia sẻ kernel OS máy chủ Chạy hệ điều hành độc lập Tài nguyên hệ thống Yêu cầu ít tài nguyên hơn Yêu cầu nhiều tài nguyên
hơn
(tính bằng giây)
Mất thời gian khởi đầu lâu hơn (tính bằng phút)
khai
Yêu cầu cài đặt hệ điều hành
hệ điều hành Hiệu suất tài nguyên Tận dụng tài nguyên kernel
OS máy chủ
Yêu cầu tài nguyên riêng biệt
trong môi trường phát triển
Được sử dụng cho ảo hóa
hệ thống và phát triển
Bảng 1: So sánh giữa Docker và VMs
3.3 Kiến trúc và các thành phần của Docker
- Docker sử dụng kiến trúc client – server Docker client sử dụng một REST API (thông qua UNIX socket, hoặc cổng mạng) để có thể giao tiếp với Docker daemon, tiến trình này thực hiện công việc tạo, chạy và phân phối các Docker container Docker client và daemon có thể chạy trên cùng một hệ thống hoặc có thể kết nối Docker client với Docker daemon từ xa Kiến trúc của Docker sẽ bao gồm:
Trang 8Hình 3: Kiến trúc của Docker
• Docker daemon: Daemon Docker lắng nghe các yêu cầu của người dùng thông
qua Docker API và quản lý các đối tượng Docker như image, container, network
và volume Một daemon cũng có thể giao tiếp với các daemon khác để quản lý các Docker service
• Docker client: Docker client (docker) là cách thức mà nhiều người dùng tương tác
với Docker Khi bạn sử dụng các câu lệnh như docker run, client thông qua Docker API sẽ gửi các lệnh này đến dockerd, nơi thực hiện chúng Docker client có thể giao tiếp với nhiều hơn một Docker daemon
• Docker registry: Docker registry sẽ là nơi lưu trữ các Docker image Docker Hub
là nơi lưu trữ Docker image công khai (public registry) mà bất kỳ ai cũng có thể sử dụng và Docker được định cấu hình mặc định để tìm image trên Docker Hub Ngoài
ra người dùng có thể cấu hình các registry riêng tư khác để lưu trữ Docker image Khi người dùng sử dụng câu lệnh “docker pull” hoặc “docker run”, các image chỉ định sẽ được tải về dựa trên registry đã được cấu hình trước đó Khi người dùng sử dụng câu lệnh “docker push”, image cũng sẽ được tải lên registry mà người dùng
đã cấu hình từ trước đó
• Docker image: Docker Image là template read-only (chỉ cho phép đọc) với các
hướng dẫn để tạo Docker container Image sẽ được sử dụng để đóng gói các ứng dụng và các thành phần đi kèm của ứng dụng, được lưu trữ ở server hoặc trên registry Ví dụ bạn có thể sử dụng Dockerfile để tạo ra một Docker image sử dụng
hệ điều hành Ubuntu và cài đặt Apache server với những cài đặt, cấu hình tùy chỉnh của riêng mình
• Docker container: Container là 1 “runable instance” của image Bạn có thể khởi
tạo, dừng hoặc xóa container bằng cách sử dụng Docker API hoặc CLI Bạn có thể kết nối container đến 1 hoặc nhiều network, thư mục lưu trữ, hoặc thậm chí tạo ra
1 image mới dựa trên tình trạng hiện tại của container Mặc định 1 container được
“cách ly” với các container và server nếu người dùng không có các cài đặt gì thêm
• Docker volume: Volume được thiết kể để làm nơi lưu trữ các dữ liệu độc lập với
vòng đời của container
Trang 9• Docker network: Cung cấp một private network mà chỉ tồn tại giữa container và
server, giúp các container có thể giao tiếp được với nhau một cách dễ dàng
• Docker service: Service cho phép bạn mở rộng các contaner thông qua nhiều
Docker daemon, chúng giao tiếp với nhau thông qua swarm cluster bao gồm nhiều manager và worker Mỗi một node của swarm là 1 Docker daemon giao tiếp với nhau bằng cách sử dụng Docker API Theo mặc định thì service được cân bằng tải trên các node
Tính năng Mô tả
Cô lập ứng
dụng
Các container Docker cung cấp môi trường nhẹ và cô lập, cho phép ứng dụng chạy độc lập
Kiến trúc
Microservices
Docker hỗ trợ triển khai các dịch vụ nhỏ gọn, giúp dễ dàng phát triển, triển khai và mở rộ các thành phần
Tích hợp và
Triển khai liên
tục (CI/CD)
Docker giúp tạo ra môi trường đáng tin cậy cho việc xây dựng, kiểm tra và triển khai ứng dụng
Thực hành
DevOps
Docker là công cụ cốt lõi trong bộ công cụ DevOps, hỗ trợ tự động hóa, triển khai liên tục và cơ sở hạ tầng dưới dạng mã
Bảng 2: Các trường hợp sử dụng của Docker
5.1 Cài đặt và thiết lập trên các nền tảng khác nhau (Windows,
macOS, Linux)
- Set up Docker’s apt repository:
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg |
sudo gpg dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch="$(dpkg print-architecture)" signed-by=\
/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu
Trang 10"$( /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
- Install the Docker packages:
sudo apt-get install docker-ce docker-ce-cli \
containerd.io docker-buildx-plugin docker-compose-plugin
5.2 Chạy container đầu tiên của bạn
- Pull image Ubuntu 20.04 từ Docker Hub:
docker pull ubuntu:20.04
- Chạy container Ubuntu 20.04:
docker run -it rm ubuntu:20.04
Chú ý quan trọng:
• Khi chạy Container ở chế độ -it (interactive mode), để thoát ra khỏi Container, ta
có thể sử dụng tổ hợp phím ”Ctrl D”, đồng nghĩa Container này sẽ dừng lại Trong trường hợp ta chỉ muốn thoát ra tạm thời và không muốn dừng Container, phải sử dụng tổ hợp phím ”Ctrl + P + Q” (Attach -detach mode)
• Để trở lại Container (re-attach Container), sử dụng lệnh:
docker attach <container_id>
5.3 Các lệnh và thao tác cơ bản của Docker
docker ps Liệt kê các container đang chạy
docker ps -a Liệt kê tất cả các container
docker rm <container_id> Xóa container
docker rmi <image_id> Xóa image
docker build -t <image_name>
<path_to_Dockerfile>
Tạo image từ Dockerfile
docker run -it –rm <image_name> Chạy container
Bảng 3: Các lệnh và thao tác cơ bản của Docker
Trang 116 Các khái niệm cốt lõi của Container
6.1 Container Life Circle
Hình 4: Chu kỳ sống của Container
- Chu kỳ sống của Container được quyết định bởi tiến trình có PID = 1 chạy bên trong
nó (tiến trình chủ đạo) Tiến trình PID 1 còn sống đồng nghĩa rằng Container còn hoạt động
- Khi sử dụng ‘docker stop‘, Docker sẽ gửi tín hiệu SIGTERM (terminating signal) để dừng tiến trình PID 1, sau đó Container sẽ dừng với EXITED(0) Trong vòng 10 giây, nếu Container chưa dừng lại, Docker sẽ gửi tín hiệu SIGKILL (kill signal) và Container
sẽ dừng lại ngay lập tức với exit code là EXITED(137)
6.2 Các câu lệnh bên trong Container
- Syntax: docker exec <containerId> <command>
- Example Commands:
• docker exec <containerId> echo Helloworld
• docker exec <containerId> sh -c ”echo PATH ”
• docker exec <containerId> echo PATH
- SSH (Secure Shell) trong Container: Docker cho phép người dùng kết nối từ xa tới Container chủ đạo bằng câu lệnh:
• docker exec -it <containerId> sh
• docker exec -it <containerId> bash
Các câu lệnh này sẽ được demo ở những chương tiếp theo
Trang 126.3 Port Mapping
- Trong thực tế, hành động SSH trực tiếp vào trong Container không phải là một hành động tốt Việc người dùng truy cập vào Container từ xa là khó khăn vì hầu hết người dùng không rõ khái niệm của SSH, hơn nữa truy cập Container trực tiếp như vậy sẽ ảnh hướng đến bảo mật của ứng dụng
- Khái niệm Port Mapping sẽ giải quyết vấn đề trên, cho phép chuyển tiếp các kết nối mạng từ máy chủ host vào container Docker, các ứng dụng trong container có thể truy cập từ bên ngoài qua các cổng được chỉ định
- Syntax:
docker run -p <target_port>:<container_port>
- Example
docker run -p 80:80 nginx
6.4 Logs Trace
- Logs trace cho phép giám sát hoạt động của Container Docker, bao gồm thông tin về quá trình khởi động, lỗi, cảnh báo và hoạt động của ứng dụng bên trong container Điều này giúp bạn kiểm soát và quản lý container một cách hiệu quả, phát hiện và xử lý sự
cố một cách nhanh chóng
- Syntax:
docker logs -f <container_id>
• -f : keep following the log output
6.5 Volume - bind mount
- Docker Engine đóng gói ứng dụng thành các Images, các Image trong Docker có tính chất bất biến (immutable), không thể chỉnh sửa được Do vậy, việc sửa đổi dữ liệu bên trong Container sẽ không gây ảnh hưởng đến Images gốc ban đầu và các Container khác Tuy nhiên điều đó đồng nghĩa rằng, khi tắt Container hoặc vì một sự cố nào đó Container
tự động exit, mọi dữ liệu sẽ bị mất (Stateless Container) Trong tình huống trên, việc chạy các ứng dụng database để lưu trữ dữ liệu sẽ trở nên không hiệu quả
- Volume: phần bộ nhớ Docker dùng để lưu trữ bộ nhớ cho Container (một thư mục ảo
do Docker quản lý)
- Bind mount: là thao tác gắn Volume vào Container nhằm giải quyết tính chất stateless
của Container
Syntax