Docker đã và đang cách mạng hóa cách chúng ta phát triển, triển khai và vận hành ứng dụng. "Container hóa" không còn là một thuật ngữ xa lạ mà đã trở thành một kỹ năng thiết yếu cho các lập trình viên và quản trị viên hệ thống. Trái tim của Docker chính là các container - những môi trường đóng gói, nhẹ và độc lập, đảm bảo ứng dụng của bạn chạy nhất quán trên mọi môi trường.
Bài viết này sẽ dẫn bạn đi từ những bước đầu tiên đến việc làm chủ cách chạy và quản lý Docker container một cách hiệu quả và chuyên nghiệp. Dù bạn là người mới tìm hiểu hay đã có kinh nghiệm, bạn đều sẽ tìm thấy những thông tin hữu ích và cuốn hút.
Docker Container là gì? Tại sao nó lại quan trọng?
Hãy tưởng tượng bạn đang đóng gói hành lý cho một chuyến đi. Thay vì vứt tất cả đồ đạc vào một chiếc vali lớn một cách lộn xộn, bạn sử dụng các túi đóng gói nhỏ hơn: một cho quần áo, một cho đồ vệ sinh cá nhân, một cho thiết bị điện tử. Mỗi chiếc túi này đều độc lập và chứa mọi thứ cần thiết cho một mục đích cụ thể.
Docker container cũng hoạt động tương tự. Nó là một gói tiêu chuẩn, thực thi được, bao gồm mọi thứ mà một ứng dụng cần để chạy: mã nguồn, runtime, các công cụ hệ thống, thư viện và cài đặt. Điều này đảm bảo rằng ứng dụng sẽ luôn hoạt động giống nhau, bất kể nó được triển khai ở đâu - trên máy tính cá nhân của bạn, trên máy chủ của đồng nghiệp hay trên đám mây.
Lợi ích chính:
- Tính nhất quán: Giải quyết triệt để vấn đề "trên máy tôi chạy được, sao trên máy anh lại lỗi?".
- Tính di động: Dễ dàng di chuyển ứng dụng giữa các môi trường khác nhau.
- Hiệu quả tài nguyên: Container nhẹ hơn và khởi động nhanh hơn nhiều so với máy ảo truyền thống.
- Khả năng mở rộng: Dễ dàng tạo ra nhiều phiên bản của một ứng dụng để xử lý tải cao.
Lệnh docker run: Khởi đầu mọi cuộc chơi
Lệnh docker run
là cánh cổng đầu tiên để bạn bước vào thế giới container. Về cơ bản, lệnh này sẽ tạo ra một container mới từ một image (khuôn mẫu) và khởi chạy nó.
Cú pháp cơ bản:
docker run [TÙY_CHỌN] TÊN_IMAGE[:TAG] [LỆNH] [THAM_SỐ...]
TÊN_IMAGE
: Tên của khuôn mẫu bạn muốn sử dụng (ví dụ:nginx
,ubuntu
,mysql
).TAG
: Phiên bản cụ thể của image (ví dụ:nginx:latest
,ubuntu:20.04
). Nếu bỏ qua, Docker sẽ mặc định sử dụng taglatest
.
Ví dụ kinh điển "Hello World": Hãy thử chạy container đầu tiên của bạn:
docker run hello-world
Nếu bạn chưa có image hello-world
trên máy, Docker sẽ tự động tìm và tải nó về từ Docker Hub (kho lưu trữ image công cộng lớn nhất), sau đó tạo và chạy container. Bạn sẽ thấy một thông điệp chào mừng, xác nhận rằng cài đặt Docker của bạn đã thành công!
Các tùy chọn phổ biến khi chạy Container
Để khai thác hết sức mạnh của docker run
, bạn cần làm quen với các tùy chọn (còn gọi là "cờ" hay "flags"). Dưới đây là những tùy chọn quan trọng nhất mà bạn sẽ sử dụng hàng ngày:
Chạy ngầm (Detached Mode) với -d
Khi bạn chạy một ứng dụng web (như Nginx), bạn không muốn terminal của mình bị "khóa" bởi tiến trình đó. Tùy chọn -d
(hoặc --detach
) sẽ giúp container chạy ở chế độ nền.
docker run -d --name my-web-server nginx
Lệnh này sẽ khởi chạy một container Nginx chạy ngầm và trả về cho bạn ID của container đó.
Ánh xạ cổng (Port Mapping) với -p
Container có hệ thống mạng riêng, biệt lập với máy chủ của bạn (host). Để có thể truy cập ứng dụng đang chạy trong container từ bên ngoài, bạn cần "ánh xạ" một cổng trên máy host vào một cổng trong container.
Cú pháp: -p HOST_PORT:CONTAINER_PORT
docker run -d -p 8080:80 --name my-web-server nginx
Với lệnh trên, mọi truy cập vào cổng 8080
của máy host sẽ được chuyển tiếp đến cổng 80
của container Nginx. Bây giờ, hãy mở trình duyệt và truy cập http://localhost:8080
, bạn sẽ thấy trang chào mừng của Nginx.
Đặt tên dễ nhớ với --name
Docker tự động tạo ra những cái tên ngẫu nhiên cho container (ví dụ: angry_torvalds
). Để dễ quản lý, bạn nên tự đặt tên cho chúng bằng tùy chọn --name
.
docker run -d -p 8080:80 --name my-nginx-app nginx
Tương tác trực tiếp với -it
Đôi khi, bạn muốn "chui vào" bên trong container để thực thi lệnh, chẳng hạn như truy cập vào một shell. Tùy chọn -it
(kết hợp của -i
cho interactive và -t
cho TTY) cho phép bạn làm điều đó.
docker run -it ubuntu bash
Lệnh này sẽ khởi chạy một container từ image Ubuntu và mở ra một giao diện dòng lệnh bash
bên trong container đó. Bạn sẽ thấy dấu nhắc lệnh thay đổi, cho biết bạn đang ở trong môi trường của container.
Gắn dữ liệu (Volumes) với -v
Dữ liệu được tạo ra bên trong một container sẽ bị mất khi container đó bị xóa. Để lưu trữ dữ liệu một cách bền vững, chúng ta sử dụng volumes. Volume sẽ liên kết một thư mục trên máy host với một thư mục bên trong container.
Cú pháp: -v /duong/dan/tren/may/host:/duong/dan/trong/container
docker run -d -p 8080:80 --name my-website -v /path/to/your/html:/usr/share/nginx/html nginx
Với lệnh này, bạn có thể chỉnh sửa các file HTML trong thư mục /path/to/your/html
trên máy host, và những thay đổi đó sẽ được phản ánh ngay lập tức trên trang web chạy trong container.
Quản lý vòng đời Container
Sau khi đã chạy container, bạn cần biết cách quản lý chúng.
Dưới đây là các lệnh thiết yếu:
- Liệt kê các container đang chạy:
docker ps
- Liệt kê tất cả container (kể cả đã dừng):
docker ps -a
- Dừng một container:
docker stop <container_id_hoac_ten>
- Khởi động lại một container đã dừng:
Lưu ý:docker start <container_id_hoac_ten>
docker run
là để tạo mới và chạy, trong khidocker start
là để chạy lại một container đã có sẵn (đã bị dừng). - Xem log của container:
Thêm tùy chọndocker logs <container_id_hoac_ten>
-f
để theo dõi log theo thời gian thực:docker logs -f <container_name>
. - Truy cập vào một container đang chạy:
Lệnhdocker exec -it <container_id_hoac_ten> bash
exec
cho phép bạn thực thi một lệnh mới bên trong một container đang chạy mà không cần phải dừng và khởi động lại nó. - Xóa một container:
Bạn chỉ có thể xóa các container đã dừng. Để xóa một container đang chạy, hãy thêm cờdocker rm <container_id_hoac_ten>
-f
(force):docker rm -f <container_name>
.
Bước tiếp theo: Docker Compose cho ứng dụng đa Container
Khi ứng dụng của bạn trở nên phức tạp hơn, bao gồm nhiều dịch vụ (ví dụ: một web server, một database, một cache), việc quản lý từng container bằng các lệnh docker run
dài ngoằng sẽ trở nên cồng kềnh.
Đây là lúc Docker Compose "bước ra và tỏa sáng". Nó là một công cụ cho phép bạn định nghĩa và chạy các ứng dụng Docker đa container bằng một file cấu hình duy nhất có tên là docker-compose.yml
.
Ví dụ file docker-compose.yml
cho một ứng dụng WordPress:
version: '3.8'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: somerootpassword
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpresspassword
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- '8000:80'
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpresspassword
volumes:
db_data:
Với file này, bạn chỉ cần chạy một lệnh duy nhất để khởi động toàn bộ ứng dụng:
docker-compose up -d
Và để dừng tất cả:
docker-compose down
Docker Compose giúp đơn giản hóa đáng kể việc quản lý các kiến trúc phức tạp, là một công cụ không thể thiếu trong quy trình làm việc hiện đại.
Kết luận: Khởi chạy Docker Container là một kỹ năng nền tảng
Khởi chạy container trong Docker là một kỹ năng nền tảng, tuy đơn giản nhưng vô cùng mạnh mẽ. Bằng cách nắm vững lệnh docker run
cùng các tùy chọn phổ biến và hiểu rõ cách quản lý vòng đời của container, bạn đã có trong tay chìa khóa để xây dựng và triển khai ứng dụng một cách hiệu quả, nhất quán và đáng tin cậy.
Hành trình với Docker còn rất nhiều điều thú vị phía trước như xây dựng image của riêng bạn với Dockerfile, tối ưu hóa bảo mật, hay khám phá các hệ thống điều phối container như Kubernetes. Hãy bắt đầu từ những lệnh cơ bản này, thực hành thường xuyên, và bạn sẽ sớm làm chủ được công nghệ tuyệt vời này. Chúc bạn thành công!