Chuyển đến nội dung chính

Chạy một Docker Image dưới dạng Container: Hướng dẫn thực hành cho người mới bắt đầu

Hướng dẫn này dạy bạn cách tự tin chạy Docker image bằng docker run, với ví dụ rõ ràng, mẹo thực tế và tư vấn khắc phục sự cố.
· 9 phút đọc

Khám phá cùng AI

Nếu bạn đang tự hỏi làm sao để chạy một Docker image, thì bạn không đơn độc. Dù bạn vừa kéo một image từ Docker Hub hay tự xây dựng, việc chạy nó là bước then chốt giúp ứng dụng hoạt động.

Hướng dẫn này thân thiện với người mới bắt đầu về lệnh docker run và hơn thế nữa. Bạn sẽ học:

  • Docker image và container thực chất là gì.
  • Cách chạy một image với các tùy chọn khác nhau.
  • Và cách dừng, xóa, cũng như khắc phục sự cố container như dân chuyên.

Kết thúc bài, bạn sẽ tự tin khởi chạy container của riêng mình và hiểu rõ những gì diễn ra bên trong.

Hiểu về Docker Images và Containers

Trước khi đi vào ví dụ lệnh, hãy hiểu Docker image và container theo cách đơn giản.

Nếu bạn đã quen với các khái niệm này, cứ thoải mái bỏ qua và sang phần tiếp theo!

Docker image là gì?

Docker image là một bản thiết kế bất biến cho ứng dụng của bạn. Nó định nghĩa mọi thứ container cần: mã nguồn, thư viện, môi trường và cấu hình. Khi đã có image, bạn có thể dùng nó để khởi tạo một hoặc hàng trăm container. Mọi lần đều nhất quán.

Vậy image đến từ đâu? Dockerfile tạo ra chúng. Dockerfile là nơi bạn định nghĩa image nền tảng, cài đặt phụ thuộc gì và ứng dụng chạy thế nào.

Khi Dockerfile đã sẵn sàng, bạn chạy lệnh docker build. Lệnh này làm theo các bước trong tệp và biến chúng thành một image có thể tái sử dụng.

Docker container là gì?

Docker container là phiên bản đang chạy của một Docker image. Nó cho phép ứng dụng của bạn chạy trong môi trường biệt lập riêng, đảm bảo hành vi nhất quán bất kể hệ thống máy chủ.

Nó tuân theo cách tiếp cận “build một lần, chạy mọi nơi”, nên bạn không phải thiết lập môi trường thủ công mỗi lần.

Image và container khác nhau thế nào

Bảng sau so sánh song song giữa image và container:

Image

Container 

Image là một gói tiêu chuẩn bao gồm tất cả tệp, binary, thư viện và cấu hình để chạy container.

Một phiên bản chạy (runtime instance) của image.

Image là bất biến. Nghĩa là nó không thay đổi trừ khi được build lại.

Container là có thể thay đổi. Bạn có thể chỉnh sửa trong lúc chạy, cài gói mới hoặc đổi tệp cấu hình.

Dockerfile (tập lệnh để build image) tạo ra image.

Image tạo ra container.

Máy tính của bạn lưu trữ các tệp image.

Container chạy trong bộ nhớ của bạn.

Nếu bạn hoàn toàn mới với containerization, khóa học Introduction to Docker của chúng tôi sẽ hướng dẫn bạn qua các khái niệm cốt lõi với ví dụ thực hành.

Lệnh docker run

Khi bạn chạy lệnh docker run, bạn đang yêu cầu Docker khởi tạo một container mới dựa trên một image.

Nói đơn giản, bạn đang khởi chạy một chương trình trong môi trường biệt lập. Chương trình đó có thể là bất kỳ thứ gì, từ web app đơn giản đến dịch vụ đầy đủ với nhiều tiến trình.

Cú pháp cơ bản

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

  • [OPTIONS] - Các cờ bổ sung để tùy chỉnh cách container chạy
  • IMAGE - Tên Docker image
  • [COMMAND] - (Tùy chọn) Ghi đè lệnh mặc định trong image.
  • [ARG...]- (Tùy chọn) Đối số.

Các cờ và tùy chọn thường dùng

  • -d: Chế độ tách (detached): chạy container ở nền
  • -p: Ánh xạ cổng: Để truy cập dịch vụ (như API hoặc web app) từ trình duyệt, bạn cần mở cổng. Ví dụ: -p 3000:3000 ánh xạ cổng 3000 trên máy của bạn tới cổng 3000 trong container.
  • --name: Docker gán tên mặc định cho container, nhưng bạn có thể dùng cờ này để đặt tên mới.
  • -v: Bạn dùng để tách dữ liệu khỏi container, đảm bảo dữ liệu vẫn còn ngay cả khi container bị dừng hoặc xóa.
  • --rm: Khi container dừng, cờ này sẽ tự động xóa nó.
  • -e: Dùng để truyền mật khẩu cơ sở dữ liệu hoặc API key mà không phải hardcode trong ứng dụng.

Chạy container tương tác vs tách nền

Docker chạy container theo hai cách: chế độ tương tác (-it) và chế độ tách nền (-d). Mỗi chế độ có tình huống sử dụng tùy mục tiêu của bạn.

  • -it: Chế độ tương tác: Nếu bạn muốn làm việc trực tiếp bên trong container qua terminal, hãy dùng cờ -it. Nó đưa container vào chế độ tương tác, cho phép bạn gõ lệnh, xem đầu ra và làm việc theo thời gian thực.
    • -i: Giữ ngỏ đầu vào để bạn có thể gõ lệnh vào container
    • -t: Cung cấp giao diện kiểu terminal bên trong container
  • -d: Chế độ tách nền: Chạy container ở nền, giải phóng terminal cho tác vụ khác.

Giữ các lệnh chính và thực hành tốt nhất trong tầm tay với Docker for Data Science Cheat Sheet.

Kéo và chạy Docker Image

Giờ bạn đã biết cú pháp lệnh docker run, phần này sẽ chỉ cho bạn cách tạo image tùy chỉnh và chạy chúng.

Sử dụng image từ Docker Hub

Docker Hub giống như thư viện trực tuyến cho image container. Bạn có thể lấy các image dựng sẵn hoặc tải lên của mình để chia sẻ. Nó hỗ trợ cả kho công khai lẫn riêng tư, nên bạn có thể chia sẻ mở với cộng đồng hoặc thiết lập kiểm soát truy cập cho đội nội bộ.

Chạy image tùy chỉnh 

Để chạy một Docker image, trước tiên bạn cần build nó bằng Dockerfile. Sau đó, bạn có thể chạy cục bộ hoặc đẩy lên Docker Hub để chia sẻ.

Vậy, trước tiên hãy tạo Dockerfile. Đây là một ví dụ:

# Use official Python base image
FROM python:3.11-slim
# Set working directory in the container
WORKDIR /app
# Copy requirements file and install dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy the rest of the app code
COPY . .
EXPOSE 5000
# Set default command
CMD ["python", "app.py"]

Dockerfile trên có nghĩa là gì?

  • FROM python:3.11-slim: image nền tảng với phiên bản python 3.11
  • WORKDIR /app: Đặt /app làm thư mục làm việc bên trong container.
  • COPY requirements.txt . : chuyển mọi phụ thuộc từ máy cục bộ vào thư mục ứng dụng của container.
  • RUN pip install --no-cache-dir -r requirements.txt: cài đặt các phụ thuộc trong requirements.txt.
  • COPY . . : sao chép mã nguồn thư mục hiện tại (ứng dụng, tệp cấu hình, và khác) vào thư mục ứng dụng của container.
  • CMD ["python", "app.py"]: chạy app.py khi khởi động container từ image này.

Bước 1. Build Dockerfile 

Hãy xem điều gì xảy ra khi bạn build Dockerfile này.

  • Chạy lệnh sau:
docker build -t my-python-app .

Lưu ý: Để lệnh này chạy được, trước hết bạn cần cài đặt Docker trên hệ thống; hướng dẫn này sẽ giúp bạn.

Hình ảnh hiển thị kết quả thực thi docker build -t my-python-app trong terminal.

Những gì diễn ra phía sau khi bạn chạy lệnh build:

  1. Docker đọc Dockerfile
  2. Image Python nền tảng được kéo từ Docker Hub
  3. Thư mục làm việc được đặt thành /app.
  4. requirements.txt được sao chép vào container.
  5. Các phụ thuộc được cài đặt bằng pip install.
  6. Phần còn lại của mã nguồn được sao chép vào /app.
  7. Image cuối cùng được gắn thẻ là my-python-app.

Bước 2: Chạy Dockerfile

Khi image đã được build, bạn có thể chạy nó bằng:

docker run -p 5000:5000 my-python-app

Khi bạn chạy lệnh này, sẽ xảy ra: 

  • Một container mới từ image tùy chỉnh của bạn, my-python-app, được tạo.
  • Cổng 5000 trên máy bạn được ánh xạ tới cổng 5000 trong container (-p 5000:5000).
  • Lệnh CMD ["python", "app.py"] được chạy và khởi động ứng dụng.
  • Container chạy nền nhờ tùy chọn -d (chế độ tách).

Lúc này, bạn có thể truy cập http://localhost:5000 trong trình duyệt và sẽ thấy giống như sau, nghĩa là ứng dụng đã chạy:

Ảnh chụp màn hình trình duyệt tại http://localhost:5000 hiển thị thông điệp "Hello from Docker!".

Nếu bạn làm việc trong lĩnh vực machine learning, những Docker image hàng đầu cho ML và AI này có thể giúp tăng tốc thiết lập môi trường của bạn.

Chạy image với cấu hình

Với một số ứng dụng, bạn có thể cần chạy image với cấu hình cụ thể. Dưới đây là hai ví dụ phổ biến.

Lưu trữ dữ liệu bền vững

Container lưu dữ liệu tạm thời. Khi bạn xóa chúng, dữ liệu sẽ mất. Volume là cách để lưu dữ liệu bên ngoài container để dữ liệu vẫn tồn tại ngay cả khi container bị xóa hoặc khởi động lại.

Để gắn volume, bạn cần chạy lệnh như sau:

docker run -v my-volume:/app/data my-image

Dữ liệu ghi vào /app/data sẽ được lưu trong volume ngay cả sau khi container bị xóa.

Truyền biến môi trường

Biến môi trường truyền cài đặt cấu hình cho Docker container tại thời điểm chạy. Điều này giúp tùy biến container mà không cần sửa Docker image.

Bạn có hai cách để truyền biến môi trường:

  1. Bạn có thể truyền biến môi trường bằng tham số -e. Ví dụ lệnh:
docker run -e ENV=production -e DEBUG=False my-image
  1. Bạn có thể tạo tệp .env với tất cả biến môi trường và truyền vào lệnh. Ví dụ:
docker run --env-file .env my-image

Ví dụ tệp .env:

ENV=staging
DEBUG=True
SECRET_KEY=mysecret

Quản lý Container đang chạy

Khi container đang chạy, bạn có thể xem, dừng và truy cập nó. Hãy xem cách thực hiện.

Xem các container hoạt động

Để liệt kê tất cả Docker container đang chạy trên hệ thống, chạy lệnh docker ps hoặc docker container ls. Lệnh này hiển thị ID container, image, lệnh, cổng, trạng thái và chi tiết khác.

docker ps
# or
docker container ls

Để bao gồm tất cả container — không chỉ các container đang chạy — như những cái đã thoát hoặc được tạo nhưng chưa khởi động, dùng cờ -a:

docker ps -a

Để chỉ xem container được tạo gần đây nhất, dùng cờ -l (latest):

docker ps -l

Nếu bạn muốn xem tất cả container được sắp theo thời gian tạo, với cái mới nhất liệt kê đầu tiên, chạy:

docker ps -a --sort=created

Dừng và xóa container

Để dừng một container cụ thể đang chạy, dùng lệnh docker stop kèm ID hoặc tên container:

docker stop <container_id_or_name>

Để dừng tất cả container đang chạy, dùng:

docker stop $(docker ps -q)
  • $(docker ps -q) trả về danh sách ID của tất cả container đang chạy.

Khi container đã dừng, bạn có thể xóa nó bằng:

docker rm <container_id_or_name>

Để xóa tất cả container đã dừng, chạy:

docker container prune

Để đi xa hơn và xóa các container, volume, network và image không dùng đến, hãy xem hướng dẫn Docker prune.

Truy cập nhật ký và shell của container

  • docker logs - Lệnh docker logs truy xuất theo lô các log có tại thời điểm thực thi.
  • docker exec - docker exec cho phép bạn chạy một lệnh mới bên trong container đang chạy mà không cần dừng hay khởi động lại. Hãy nghĩ nó như mở một terminal mới bên trong container — để bạn có thể xem xét, chạy script, kiểm tra log hoặc gỡ lỗi.
  • docker attach - docker attach kết nối terminal của bạn trực tiếp tới tiến trình chính đang chạy của container. Bạn có thể xem đầu ra trực tiếp (log, prompt, v.v.) và thậm chí tương tác nếu tiến trình chấp nhận đầu vào.

Khắc phục sự cố thường gặp

Giải pháp đơn giản cho các vấn đề phổ biến. Dưới đây là một số lỗi thường gặp khi chạy Docker image và cách tiếp cận.

Lỗi 1: “Error response from daemon: pull access denied for alpine-python, repository does not exist or may require ‘docker login’: denied: requested access to the resource is denied.”

  • Ý nghĩa: Docker cố kéo một image, ở đây là image alpine-python từ Docker Hub, nhưng image không tồn tại hoặc là riêng tư và bạn chưa xác thực.
  • Cách khắc phục:
    • Kiểm tra lại tên image và tag trên Docker Hub.
    • Nếu là image riêng tư, chạy docker login để xác thực.
    • Đảm bảo image tồn tại nếu bạn kéo từ registry tùy chỉnh.

Lỗi 2: “No such image found: <image-name>:<tag>”

  • Ý nghĩa: Bạn cố chạy hoặc gán tag cho image cục bộ, nhưng image (hoặc tag chỉ định) không có trên hệ thống.
  • Cách khắc phục:
    • Dung docker images để kiểm tra các image sẵn có.
    • Kéo image một cách tường minh:
docker pull <image-name>:<tag>

Lỗi 3: “manifest for <image>:<tag> not found: manifest unknown: The named manifest is not known to the registry.”

  • Ý nghĩa: Lỗi này thường xảy ra khi image hoặc tag chỉ định không tồn tại.
  • Cách khắc phục khả dĩ: Những mẹo này sẽ xử lý hầu hết lỗi phổ biến: 
    • Xác minh tên image và tag chính xác.
    • Tham khảo các tag của image trên Docker Hub hoặc registry tùy chỉnh của bạn.
    • Dùng docker pull <image>:<tag> để lấy một phiên bản hợp lệ.
    • Nếu build cục bộ, dùng Dockerfile đúng và build image bằng:
docker build -t <image>:<tag> .

Xung đột cổng và lỗi bind

Xung đột cổng xảy ra khi nhiều container hoặc container và ứng dụng khác cố truy cập cùng một cổng.

  • Cách khắc phục:
    • Dùng cổng host khác khi chạy container:
docker run -p 8081:80 <image>
  • Dừng dịch vụ hiện đang dùng cổng.
  • Xác định thứ gì đang dùng một cổng (ví dụ, 8080) bằng:
lsof -i :8080

Kết luận 

Chạy một Docker image là một trong những bước quan trọng và “mở khóa sức mạnh” khi dùng container, dù bạn đang bật một web server đơn giản hay triển khai ứng dụng phức tạp. Chỉ với vài lệnh như docker run, docker ps và docker stop, giờ bạn đã sẵn sàng khởi chạy, quản lý và khắc phục sự cố container một cách tự tin.

Nếu bạn muốn đi xa hơn, hãy thử tự build image bằng Dockerfile, khám phá các cờ nâng cao của docker run, hoặc học cách quản lý nhiều container với Docker Compose.

Xem các khóa học sau để tiếp tục hành trình Docker của bạn:

Câu hỏi thường gặp

Tôi có thể chạy nhiều container từ cùng một Docker image không?

Có, bạn có thể chạy nhiều container từ cùng một image. Mỗi container là biệt lập và có thể có cài đặt, cổng và biến môi trường riêng.

Làm sao tôi truyền secrets hoặc API key an toàn vào Docker container?

Dùng cờ -e để đặt biến môi trường hoặc dùng tệp .env và --env-file để truyền secrets khi chạy mà không phải hardcode.

Làm sao chạy Docker image ở chế độ nền?

Dùng cờ -d với docker run để khởi động container ở chế độ tách nền, cho phép terminal rảnh cho lệnh khác.

Sự khác nhau giữa docker exec và docker attach là gì?

 docker exec mở một phiên shell mới bên trong container, trong khi docker attach kết nối tới tiến trình chính của container và luồng đầu ra trực tiếp của nó.

Tại sao tôi nhận 'pull access denied' khi chạy một image?

Điều này thường có nghĩa image là riêng tư hoặc bị gõ sai. Hãy kiểm tra tên, tag và đảm bảo bạn đã đăng nhập Docker Hub với docker login.

Làm sao tôi lưu dữ liệu sau khi container dừng?

Dùng cờ -v để gắn volume, đảm bảo dữ liệu được lưu bên ngoài container và vẫn còn ngay cả sau khi container bị xóa.

Cách tốt nhất để chạy container phục vụ phát triển là gì?

Dùng các cờ -it cho chế độ tương tác, kết hợp gắn volume và biến môi trường để mô phỏng môi trường phát triển cục bộ.

Làm sao tôi biết cổng nào đang xung đột trên máy?

Dùng lsof -i :<port> để xác định tiến trình nào đang dùng một cổng cụ thể, sau đó dừng nó hoặc dùng cổng host khác cho container.

Làm sao tôi xem log từ một Docker container đang chạy?

Dùng lệnh docker logs <container_id> để truy xuất và xem log từ luồng tiêu chuẩn và lỗi tiêu chuẩn của container.

Srujana Maddula

Tác giả

Srujana Maddula

Srujana là một cây bút công nghệ tự do với bằng Cử nhân Khoa học Máy tính. Việc viết về nhiều chủ đề như khoa học dữ liệu, điện toán đám mây, phát triển, lập trình, bảo mật và nhiều lĩnh vực khác đến với cô một cách tự nhiên. Cô yêu thích văn học kinh điển và khám phá những điểm đến mới.

Chủ đề

Liên quan