Chuyển tới nội dung chính

Docker Phần 1 - Tìm hiểu Docker và các lệnh hay dùng

· 26 phút để đọc

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ạpMỗi server cần cấu hình riêngTốn thời gian, dễ sai sót
Tài nguyên cố địnhMỗi ứng dụng cần một server riêngLãng phí tài nguyên
Khó mở rộngThêm ứng dụng = thêm serverChi phí cao
Thời gian triển khaiMua server, cài đặt, cấu hìnhCó thể mất hàng tuần
Môi trường không đồng nhấtKhó đảm bảo môi trường giống nhau"Works on my machine" syndrome

Mô hình triển khai truyền thống

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ếnMô tảLợi ích
Tận dụng tài nguyênNhiề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ườngMỗi VM hoạt động độc lậpTăng tính ổn định và bảo mật
Quản lý linh hoạtDễ dàng tạo, sao chép, di chuyển VMGiảm thời gian triển khai
Khôi phục nhanhSnapshot và backup VMGiảm thời gian downtime

Mô hình ảo hóa với Hypervisor

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ểmMô tảHạn chế
Tài nguyên cố địnhMỗi VM cần phân bổ RAM, CPU cố địnhLãng phí khi VM không sử dụng hết
Kích thước lớnMỗi VM chứa toàn bộ hệ điều hànhChiếm nhiều dung lượng lưu trữ
Khởi động chậmVM cần khởi động toàn bộ OSMất từ vài phút đến hàng chục phút
Hiệu suất thấp hơnOverhead do ảo hóa phần cứngGiả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 íchSo với Server vật lýSo với Máy ảo
Tài nguyênTiết kiệm hơn nhiềuChỉ sử dụng tài nguyên khi cần
Khởi độngTừ hàng giờ xuống vài giâyTừ vài phút xuống vài giây
Kích thướcTừ hàng trăm GB xuống vài MBTừ hàng chục GB xuống vài MB
Tính nhất quánGiải quyết vấn đề "works on my machine"Môi trường đồng nhất hơn
Khả năng mở rộngDễ dàng triển khai hàng nghìn containerCó thể chạy nhiều container hơn VM
Quản lýTự động hóa caoDễ dàng quản lý qua Docker CLI/API

Mô hình Docker Container

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ầnMô tảVí dụ
Docker EngineNền tảng chạy và quản lý containerdockerd, containerd
Docker ImageTemplate chỉ đọc để tạo containernginx:latest, mysql:5.7
Docker ContainerInstance đang chạy của imageweb-server-1, db-mysql-prod
Docker RegistryKho lưu trữ và chia sẻ imageDocker Hub, Amazon ECR
DockerfileFile kịch bản để build imageChứa các lệnh như FROM, RUN, COPY
Docker ComposeCông cụ định nghĩa và chạy multi-containerdocker-compose.yml

Docker Logo và Khái niệm

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ể:

  1. 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"]
  1. 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:
  1. 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íDockerMáy ảo (VMware)
Chạy trênPhần mềm (Hệ điều hành OS)Phần cứng (Hardware)
Kích thướcNhỏ (MB)Lớn (GB)
Tốc độ triển khaiNhanh chóng, gọn gàng, không tốn nhiều tài nguyênPhải cung cấp nhiều tài nguyên như CPU, RAM,...
Tính linh hoạtDễ dàng di chuyển và thay đổiTốn nhiều thời gian để triển khai
Hệ điều hànhDùng chung kernel với hostMỗi VM có hệ điều hành riêng biệt
Thời gian khởi độngGiâyPhút
Cô lậpCô lập ở mức processCô lập hoàn toàn
Hiệu suấtGần bằng nativeThấp hơn do ảo hóa phần cứng
Tài nguyênChia sẻ độngPhân bổ cố định
Số lượng instanceHàng trăm container trên một hostThường chỉ vài chục VM trên một host

So sánh Docker vs Virtual Machine

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ểmChi tiếtVí dụ thực tế
Hiệu suấtOverhead thấp, gần bằng nativeBenchmark cho thấy container chỉ chậm hơn 1-5% so với bare metal
Tốc độ khởi độngKhởi động trong vài giâydocker run nginx chỉ mất 1-2 giây để sẵn sàng phục vụ
Tính di độngChạy giống nhau trên mọi môi trườngTừ 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 imageKhông cần lo về xung đột phiên bản thư viện
Tự động hóaDễ tích hợp vào CI/CDJenkins, GitHub Actions có thể build và deploy container
Khả năng mở rộngOrchestration với Kubernetes, SwarmTự độ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ểmChi tiếtGiải pháp
Cô lập kém hơnContainer chia sẻ kernel với hostSử dụng các security context, seccomp profiles
Bảo mậtLỗ hổng kernel ảnh hưởng tất cả containerCập nhật kernel thường xuyên, giới hạn quyền container
Tương thích OSContainer Linux không chạy trực tiếp trên WindowsSử dụng WSL2 trên Windows để chạy container Linux
Dữ liệu persistentContainer mặc định là ephemeralSử dụng Docker volumes hoặc bind mounts
Hiệu suất I/OCó thể chậm hơn với volumeTố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:

  1. Tạo VM mới (10-20GB disk)
  2. Cài đặt hệ điều hành (15-30 phút)
  3. Cài đặt NGINX (5-10 phút)
  4. Cấu hình NGINX (5-10 phút)
  5. Khởi động dịch vụ Tổng thời gian: 25-50 phút, kích thước: 10-20GB

Với Docker:

  1. 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ầnVai tròChức năng chính
Docker ClientGiao diện người dùngGửi lệnh đến Docker daemon
Docker Daemon (Server)Quản lý Docker objectsXử lý API requests, quản lý container, image
Docker RegistryLưu trữ Docker imagesLưu trữ và phân phối images
Docker ObjectsCác đối tượng trong DockerImages, containers, networks, volumes

Kiến trúc Docker

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 ServerChức năng
dockerdDaemon chính, xử lý API requests
containerdQuản lý vòng đời container
runcTạo và chạy container
shimGiữ 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ếnMô tảĐặc điểm
Docker HubRegistry công cộng chính thứcMiễn phí cho public images, giới hạn cho private images
Amazon ECRRegistry của AWSTích hợp với AWS, bảo mật cao
Google Container RegistryRegistry của Google CloudTích hợp với GCP, tốc độ cao
Azure Container RegistryRegistry của MicrosoftTích hợp với Azure, hỗ trợ CI/CD
HarborRegistry 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ụcMục đíchVí dụ sử dụng trong Docker
/rootThư 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
/binChứa các file thực thi binary cho người dùngChứa các lệnh cơ bản như ls, cp, mv trong container
/sbinChứa các file thực thi binary cho adminChứa các lệnh quản trị như ifconfig, iptables
/etcChứa các file cấu hìnhLưu cấu hình nginx, mysql trong container
/mntChứa các file mount tạm thờiMount volumes từ host vào container
/tmpChứa các file tạm thờiLưu trữ tạm thời trong quá trình xử lý
/varChứa các file thường xuyên thay đổiLưu logs (/var/log) và dữ liệu web (/var/www)
/homeChứ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
/procChứa thông tin xử lý của hệ thốngTruy 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 tinMục đíchVí dụ thực tế
/var/lib/dockerThư mục chính chứa tất cả dữ liệu DockerNơi lưu trữ tất cả dữ liệu Docker trên host
/var/lib/docker/containersChứa dữ liệu của tất cả các containerMỗi container có một thư mục con với ID
/var/lib/docker/volumesChứa các volume được tạo bởi DockerDữ liệu persistent của container
/var/lib/docker/imageChứa các image Docker đã được tải vềCác layer của image được lưu ở đây
/etc/dockerChứa các file cấu hình Dockerdaemon.json để cấu hình Docker daemon
DockerfileFile cấu hình để build Docker imageĐịnh nghĩa cách tạo image
docker-compose.ymlFile 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ệnhMục đíchVí dụ
docker runTạo và chạy một container từ imagedocker run -d -p 80:80 --name webserver nginx
docker psLiệt kê các container đang chạydocker ps
docker ps -aLiệt kê tất cả các containerdocker ps -a
docker stopDừng một container đang chạydocker stop webserver
docker startKhởi động lại một container đã dừngdocker start webserver
docker rmXóa một containerdocker rm webserver
docker logsXem logs của containerdocker logs -f webserver
docker execThực thi lệnh trong container đang chạydocker 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ệnhMục đíchVí dụ
docker pullTải một image từ Docker Hubdocker pull python:3.9
docker imagesLiệt kê các image đã tải vềdocker images
docker rmiXóa một imagedocker rmi python:3.9
docker buildBuild một image từ Dockerfiledocker build -t myapp:1.0 .
docker pushĐẩy image lên Docker Hub hoặc registry khácdocker push username/myapp:1.0
docker tagGán tag mới cho imagedocker 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ệnhMục đíchVí dụ
docker network lsLiệt kê các networkdocker network ls
docker network createTạo một network mớidocker network create mynetwork
docker network connectKết nối container với networkdocker network connect mynetwork container_id
docker network disconnectNgắt kết nối container khỏi networkdocker network disconnect mynetwork container_id
docker network rmXóa một networkdocker network rm mynetwork
docker network inspectXem chi tiết về networkdocker 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ệnhMục đíchVí dụ
docker volume lsLiệt kê các volumedocker volume ls
docker volume createTạo một volume mớidocker volume create mydata
docker volume rmXóa một volumedocker volume rm mydata
docker volume inspectXem thông tin chi tiết về volumedocker volume inspect mydata
docker volume pruneXóa tất cả các volume không sử dụngdocker 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ệnhMục đíchVí dụ
docker infoXem thông tin hệ thống Dockerdocker info
docker versionXem phiên bản Dockerdocker version
docker system pruneXóa tất cả container, network, image không sử dụngdocker system prune
docker statsXem thống kê sử dụng tài nguyên của containerdocker stats
docker eventsXem các sự kiện real-time từ Docker daemondocker events
docker topXem các process đang chạy trong containerdocker 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ướcMô tảLưu ý
1Tải Docker DesktopTừ trang chủ Docker
2Chạy file cài đặtCần quyền admin
3Chọn cấu hìnhWSL 2 hoặc Hyper-V
4Khởi động lại máyNếu được yêu cầu
5Khởi động Docker DesktopTừ menu Start
6Kiểm tra cài đặtChạy lệnh kiểm tra

Các bước cài đặt chi tiết:

  1. Tải Docker Desktop cho Windows từ trang chủ Docker: https://www.docker.com/products/docker-desktop

  2. Chạy file cài đặt Docker Desktop Installer.exe

  3. 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

  4. Khởi động lại máy tính nếu được yêu cầu

  5. Khởi động Docker Desktop từ menu Start

  6. 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ướcMô tảLệnh
1Cập nhật aptsudo apt-get update
2Cài đặt các package cần thiếtsudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
3Thêm GPG keycurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
4Thiết lập repositoryecho "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
5Cập nhật aptsudo apt-get update
6Cài đặt Docker Enginesudo apt-get install docker-ce docker-ce-cli containerd.io
7Kiểm tra cài đặtsudo docker run hello-world
8Cấu hình không cần sudosudo 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 DockerTác động
Nhất quán môi trườngGiảm lỗi triển khai
Tốc độ triển khaiTăng tốc độ phát triển và release
Tối ưu tài nguyênTiết kiệm chi phí hạ tầng
Cô lập ứng dụngTăng tính bảo mật
Khả năng mở rộngDễ dàng scale theo nhu cầu
Tự động hóaTí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