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

Bảng Tổng Hợp Lệnh Docker Cơ Bản Cho Người Mới Bắt Đầu

Bài viết này cung cấp một bảng tổng hợp chi tiết về các lệnh và khái niệm cơ bản trong Docker, dành cho những người mới bắt đầu. Nội dung được biên soạn dựa trên các thông tin từ tài liệu "Docker Beginner Cheat Sheet".

Thông tin: Đây là một bảng tổng hợp các thông tin chính từ tài liệu gốc. Để hiểu sâu hơn và khám phá toàn bộ các tùy chọn của lệnh, bạn nên tham khảo tài liệu chính thức của Docker.

Giới Thiệu về Docker

Container là một phương pháp để đóng gói ứng dụng của bạn cùng với tất cả những gì cần thiết để chạy nó vào trong một ảnh container (container image). Ảnh container có thể bao gồm hệ điều hành cơ bản, các thư viện cần thiết, tệp và thư mục cấu hình, biến môi trường, v.v.

Ảnh container đóng vai trò như một khuôn mẫu cho việc thực thi container. Điều này có nghĩa là nhiều container khác nhau có thể được khởi tạo và chạy từ cùng một ảnh duy nhất, và tất cả chúng sẽ chia sẻ chung một hành việc và môi trường được định nghĩa trong ảnh. Cơ chế này giúp cải thiện khả năng mở rộngphân phối ứng dụng một cách hiệu quả.

Các ảnh container sau khi được tạo ra có thể được lưu trữ tại một remote registry (như Docker Hub) để thuận tiện cho việc phân phối và chia sẻ.

Docker đặc biệt hữu ích cho các mô hình học máy (Machine Learning). Nó cung cấp các lợi ích quan trọng như:

  • Khả năng tái lập (reproducibility): Đảm bảo môi trường chạy mô hình luôn nhất quán.
  • Quản lý phiên bản (versioning): Dễ dàng theo dõi các phiên bản khác nhau của môi hình và môi trường chạy.
  • Cô lập (isolation): Mỗi mô hình chạy trong một môi trường riêng biệt, tránh xung đột giữa các ứng dụng hoặc thư viện.
  • Tính di động (portability): Dễ dàng di chuyển và triển khai mô hình cùng môi trường của nó trên các hệ thống khác nhau.

Docker cho phép bạn tạo ra một môi trường nhất quáncó thể tái lập cho các mô hình ML của mình, quản lý các phiên bản của chúng, và triển khai chúng một cách dễ dàng trên các môi trường làm việc đa dạng.

Kiến trúc Container (Container Architecture)

Kiến trúc Docker cơ bản bao gồm ba thành phần chính:

  • Docker Client (Máy khách Docker): Đây là giao diện chính mà người dùng tương tác với Docker. Khi bạn gõ các lệnh như docker run, docker build, bạn đang sử dụng Docker client. Client này sẽ gửi các lệnh đó đến Docker Daemon.
  • Docker Host (Máy chủ Docker): Đây là nơi Docker Daemon chạy và quản lý các đối tượng Docker.
    • Docker Daemon (Trình nền Docker): Lắng nghe các yêu cầu từ Docker API (mà Docker Client sử dụng) và quản lý các đối tượng Docker như ảnh (images), container, network, và volume. Daemon chịu trách nhiệm build ảnh, chạy container, v.v.
    • Images (Ảnh): Là các khuôn mẫu chỉ đọc (read-only templates) dùng để tạo container. Ảnh có thể dựa trên các ảnh khác và được tùy chỉnh thêm.
    • Containers (Bộ chứa): Là các thực thể chạy được của ảnh. Bạn có thể tạo, khởi động, dừng, di chuyển, hoặc xóa container bằng Docker API hoặc CLI.
  • Registry (Kho lưu trữ): Là nơi lưu trữ các ảnh Docker. Docker Hub là một registry công cộng lớn mà mọi người đều có thể sử dụng, và bạn cũng có thể chạy các private registry. Khi bạn chạy lệnh docker pull, Docker sẽ tải ảnh từ registry đã cấu hình. Khi bạn chạy docker push, Docker sẽ đẩy ảnh lên registry.

Luồng hoạt động cơ bản thường như sau:

  1. Người dùng sử dụng Docker Client để gửi lệnh (ví dụ: docker build, docker pull, docker run).
  2. Docker Client chuyển lệnh này đến Docker Daemon.
  3. Docker Daemon thực hiện lệnh:
    • Nếu là docker build, daemon sẽ xây dựng một ảnh dựa trên Dockerfile.
    • Nếu là docker pull, daemon sẽ tải ảnh từ Registry.
    • Nếu là docker run, daemon sẽ tạo và chạy một container từ một ảnh (nếu ảnh chưa có local, nó sẽ được pull từ Registry trước).

Kiến trúc Container (Container Architecture) Container Architecture

Dockerfile

Dockerfile là một tệp văn bản chứa các hướng dẫn mà Docker sử dụng để tự động xây dựng (build) một ảnh Docker. Dockerfile được viết theo một cú pháp cụ thể, và thứ tự của các lệnh trong tệp rất quan trọng bởi vì Docker sẽ thực thi chúng theo trình tự đó trong quá trình build ảnh.

Một số lệnh trong Dockerfile là tùy chọn, trong khi những lệnh khác có thể được sử dụng nhiều lần tùy thuộc vào yêu cầu cụ thể khi xây dựng ảnh của bạn. Các lệnh này được thực hiện ở hai giai đoạn khác nhau: build time (trong quá trình tạo ảnh) và runtime (khi container được khởi chạy từ ảnh).

LệnhÝ nghĩaVí dụ
FROMChỉ định base image mà bạn sẽ xây dựng image mới của mình dựa trên đó. Đây là lệnh bắt buộc và thường là lệnh đầu tiên.FROM ubuntu:20.04
RUNThực thi các lệnh trong container trong quá trình build. Dùng để cài đặt phần mềm, thư viện, hoặc cấu hình khác.RUN pip install --upgrade -r requirements.txt
COPYCopy file hoặc thư mục từ host machine vào container image tại một đường dẫn chỉ định.COPY . /app
ENVĐặt environment variables bên trong container image.ENV NGINX_PORT=80
EXPOSEThông báo rằng container sẽ listen trên các port được chỉ định tại runtime. Chỉ mang tính tài liệu hóa.EXPOSE 80
CMDChỉ định lệnh mặc định sẽ được thực thi khi container khởi động. Có thể bị override.CMD ["python", "train.py"]
ENTRYPOINTCấu hình một lệnh hoặc script mặc định sẽ chạy khi container được tạo. Arguments từ docker run sẽ được truyền vào.ENTRYPOINT ["nginx"]
ADDTương tự COPY, nhưng có thêm khả năng extract file nén localcopy file từ URL.ADD my_model.pkl /app/models/, ADD requirements.txt /app/
LABELThêm metadata vào image dưới dạng cặp key-value (ví dụ: tác giả, phiên bản).LABEL maintainer="Tony Stark <[email protected]>"
USERĐặt user hoặc UID sẽ chạy các lệnh theo sau và khi container khởi chạy (mặc định là root).USER 1001
WORKDIRĐặt working directory cho các lệnh RUN, CMD, ENTRYPOINT, COPY, ADD theo sau. Nếu không tồn tại, sẽ được tạo.WORKDIR /app

Thứ tự thực thi các lệnh trong Dockerfile thông thường tuân theo cấu trúc logic sau:

  1. FROM: Khởi đầu với ảnh cơ bản.
  2. RUN: Cài đặt các phụ thuộc và cấu hình hệ thống.
  3. COPY hoặc ADD: Đưa mã nguồn và tài nguyên vào ảnh.
  4. ENV: Thiết lập biến môi trường cần thiết cho ứng dụng.
  5. EXPOSE: Khai báo các cổng mạng.
  6. CMD: Xác định lệnh mặc định khi chạy container.
  7. LABEL: Thêm metadata vào ảnh.
  8. ENTRYPOINT: Cấu hình điểm vào chính cho container.

Thứ tự này quan trọng vì mỗi lệnh tạo ra một lớp (layer) mới trong ảnh Docker. Việc đặt các lệnh ít thay đổi (như cài đặt hệ điều hành cơ bản) lên trước và các lệnh thay đổi thường xuyên (như sao chép mã nguồn) xuống dưới sẽ tận dụng tốt hơn cơ chế caching của Docker, giúp tăng tốc độ build ảnh.

Các Cách Thực Thi Lệnh Docker

Bạn có thể tương tác và thực thi các lệnh Docker thông qua nhiều giao diện khác nhau:

  • Giao diện Dòng Lệnh (CLI): Đây là phương pháp phổ biến nhất. Bạn mở cửa sổ terminal hoặc command prompt trên hệ điều hành của mình (Linux, macOS, Windows) và gõ trực tiếp các lệnh docker ... vào đó.
  • Docker Compose: Công cụ này cho phép bạn định nghĩa và quản lý các ứng dụng đa container bằng cách sử dụng tệp cấu hình định dạng YAML. Thay vì chạy từng lệnh docker run riêng lẻ cho mỗi container, bạn có thể định nghĩa toàn bộ stack dịch vụ (ví dụ: ứng dụng web, cơ sở dữ liệu, cache) trong một tệp docker-compose.yml và sử dụng lệnh docker-compose up để khởi chạy tất cả cùng lúc.
  • Docker API: Docker daemon cung cấp một API (giao diện lập trình ứng dụng) cho phép bạn điều khiển Docker bằng cách lập trình. Bạn có thể sử dụng các thư viện hoặc công cụ gọi API này từ các ngôn ngữ lập trình khác nhau để tự động hóa các tác vụ Docker.
  • Công Cụ GUI Docker: Có nhiều ứng dụng cung cấp giao diện người dùng đồ họa (GUI) để quản lý Docker một cách trực quan. Các ví dụ bao gồm Docker Desktop (có sẵn cho Windows và macOS), Portainer (một công cụ quản lý Docker Swarm/Kubernetes dựa trên web), và Kitematic (một GUI dành cho Docker trên Windows/macOS/Linux).
  • Script hoặc Shell File: Bạn có thể tạo các tệp script (ví dụ: .sh cho Linux/macOS, .bat hoặc .ps1 cho Windows) chứa một chuỗi các lệnh Docker. Sau đó, bạn chỉ cần thực thi tệp script đó trong terminal để chạy hàng loạt lệnh một cách tự động.

Lệnh Registry & Repo

Phần này tổng hợp các lệnh cơ bản để tương tác với Docker Registry (nơi lưu trữ các ảnh Docker công khai hoặc riêng tư, ví dụ: Docker Hub) và Repository (một tập hợp các ảnh cùng tên nhưng có thể khác tag).

Đăng nhập và đăng xuất

Để tương tác với Docker Registry, bạn cần đăng nhập và đăng xuất.

Đăng nhập

Sử dụng lệnh này để đăng nhập vào Docker Hub hoặc một registry đã cấu hình.

# Đăng nhập vào Docker Hub
docker login

Bạn cũng có thể chỉ định username và password trực tiếp (không khuyến khích trong các môi trường không an toàn):

# Đăng nhập với username và password
docker login --username=yourusername --password=yourpassword

Đăng xuất

Sử dụng lệnh này để đăng xuất khỏi Docker registry mà bạn đã đăng nhập.

# Đăng xuất khỏi registry hiện tại
docker logout

Bạn có thể chỉ định registry cụ thể nếu đã đăng nhập vào nhiều nơi:

# Đăng xuất khỏi một registry cụ thể
docker logout registry.hub.docker.com

Docker search image

Search image trên Docker Hub hoặc một registry đã cấu hình.

# Docker search image 'mysql' trên Docker Hub
docker search mysql

Kết quả sẽ hiển thị danh sách các ảnh phù hợp cùng với thông tin cơ bản như mô tả, số lượng lượt tải và mức độ Official.

Pull image

Tải (download) một image từ registry về máy cục bộ của bạn. Nếu không chỉ định tag, Docker sẽ pull image với tag latest theo mặc định.

# Tải ảnh 'mysql:latest'
docker pull mysql

Bạn có thể chỉ định tag cụ thể:

# Pull image 'mysql:8.0'
docker pull mysql:8.0

Push image

Đẩy (upload) một image từ máy cục bộ của bạn lên Docker registry. Ảnh cần phải được tag với tên registry/username/image:tag trước khi đẩy.

# Đẩy ảnh 'yourusername/myimage:latest' lên Docker Hub
docker push yourusername/myimage

Nếu ảnh được tag với một registry khác Docker Hub (ví dụ: myregistry.com/myimage:latest), lệnh sẽ đẩy lên registry đó.

# Đẩy ảnh lên registry tùy chỉnh
docker push myregistry.com/myimage:latest

Lệnh Container

Phần này bao gồm các lệnh cơ bản để làm việc trực tiếp với các container - các phiên bản đang chạy (hoặc đã dừng) của ảnh Docker.

Build image

Tạo một image Docker từ Dockerfile. Lệnh này được thực thi trong thư mục chứa Dockerfile. Dấu chấm . ở cuối chỉ định ngữ cảnh build (build context) là thư mục hiện tại.

# Build ảnh từ Dockerfile trong thư mục hiện tại
docker build -t my-image .

Tùy chọn -t my-image dùng để đặt tên (và tag, mặc định là latest) cho ảnh được build. Bạn cũng có thể build ảnh từ một Dockerfile trong một repository trên GitHub:

# Build ảnh từ Dockerfile trong Github Repo
docker build -t helloworld github.com/folder/hello-world .

Chạy container

Khởi chạy một container mới từ một ảnh. Nếu ảnh chưa có trên máy cục bộ, Docker sẽ tự động tải về trước khi chạy.

# Chạy container từ ảnh 'my-image'
docker run my-image

Lệnh này chạy container ở chế độ foreground. Để chạy ở chế độ detached (nền), sử dụng tùy chọn -d. Để ánh xạ cổng từ container ra host, sử dụng tùy chọn -p host_port:container_port.

# Chạy container và ánh xạ cổng 6969
docker run -p 6969:6969 my-image

Điều này có nghĩa là lưu lượng truy cập đến cổng 6969 trên máy host sẽ được chuyển hướng đến cổng 6969 bên trong container.

Đổi tên container

Đổi tên một container đã tồn tại. Container có thể đang chạy hoặc đã dừng.

# Đổi tên container từ 'old_container_name' thành 'new_container_name'
docker rename old_container_name new_container_name

Xóa container

Xóa một hoặc nhiều container. Container cần phải dừng trước khi xóa (trừ khi sử dụng tùy chọn -f để buộc xóa).

# Xóa một container theo tên hoặc ID
docker rm container_name
# Xóa nhiều container cùng lúc
docker rm container1 container2 container3

Start container

Khởi động lại một container đã dừng.

# Khởi động container 'my-container'
docker start my-container

Stop container

Dừng một container đang chạy một cách "duyên dáng" (gracefully), gửi tín hiệu SIGTERM và chờ một khoảng thời gian ngắn trước khi buộc dừng bằng SIGKILL (mặc định 10 giây).

# Dừng container 'my-container'
docker stop my-container

Restart container

Dừng và sau đó khởi động lại một container đã tồn tại.

# Khởi động lại container 'my-container'
docker restart my-container

Pause container

Tạm dừng tất cả các tiến trình bên trong một container đang chạy. Container vẫn tồn tại nhưng không sử dụng tài nguyên CPU.

# Tạm dừng container 'my-container'
docker pause my-container

Unpause container

Tiếp tục thực thi các tiến trình bên trong một container đã bị tạm dừng.

# Tiếp tục container 'my-container'
docker unpause my-container

Wait container

Lệnh này chặn (block) cho đến khi một hoặc nhiều container kết thúc và in mã thoát (exit code) của chúng. Hữu ích trong scripting.

# Chờ container 'my-container' dừng và in mã thoát
docker wait my-container

Lưu ý: Đối với hầu hết các lệnh thao tác với container (như rm, start, stop, pause, v.v.), bạn có thể sử dụng tên hoặc ID duy nhất của container để xác định container mục tiêu.

Lấy Thông Tin Container

Các lệnh này giúp bạn kiểm tra trạng thái, logs, cấu hình chi tiết và các thông tin khác về các container đang chạy hoặc đã dừng.

Liệt kê container

Hiển thị danh sách các container.

# Liệt kê các container đang chạy
docker ps

Kết quả bao gồm ID container, ảnh đang sử dụng, lệnh khởi chạy, thời gian tạo, trạng thái, cổng được ánh xạ và tên. Để xem TẤT CẢ các container, bao gồm cả những container đã dừng, sử dụng tùy chọn -a.

# Liệt kê TẤT CẢ container (đã dừng và đang chạy)
docker ps -a

Xem logs container

Hiển thị đầu ra (stdout và stderr) từ các tiến trình chạy bên trong container.

# Xem logs cơ bản của container 'my-container'
docker logs my-container

Để xem logs chi tiết hơn, bao gồm thông tin về thời gian và nguồn (stdout/stderr):

# Xem logs chi tiết
docker logs --details my-container

Bạn cũng có thể sử dụng tùy chọn -f để xem logs theo thời gian thực (follow logs) hoặc -t để thêm timestamp vào mỗi dòng log.

Kiểm tra chi tiết (Inspect)

Cung cấp thông tin cấu hình chi tiết về một hoặc nhiều Docker object (như container, ảnh, network, volume) ở định dạng JSON. Rất hữu ích để debug hoặc xem thông tin kỹ thuật sâu hơn.

# Hiển thị thông tin chi tiết về container 'my-container' ở định dạng JSON
docker inspect my-container

Tìm cổng container

Hiển thị ánh xạ cổng giữa container và host cho một container cụ thể. Chỉ hiển thị các ánh xạ được thiết lập bằng tùy chọn -p khi chạy container.

# Hiển thị ánh xạ cổng của container 'my-container'
docker port my-container

Kết quả sẽ có dạng như container_port/protocol -> host_ip:host_port. Ví dụ: 80/tcp -> 0.0.0.0:8080 hoặc 80/tcp -> 127.0.0.1:8080.

Bài viết này đã đi qua các khái niệm cơ bản về Docker, cấu trúc Dockerfile, các cách thực thi lệnh và các lệnh phổ biến nhất để quản lý registry, repository và container. Hy vọng rằng bảng tổng hợp này hữu ích cho bạn trong hành trình làm quen và sử dụng Docker!