+1

💻 TỔNG HỢP CÁC CÂU LỆNH DOCKER THÔNG DỤNG 🐳

Bài viết này sẽ chia sẻ bạn nội dung cơ bản của Dockerfile, cấu trúc FileSystem bên trong Docker container và một số lệnh Docker (Docker Commands) phổ biến dùng để quản lý containers, images, networks và volumes:

Nội dung cơ bản của Dockerfile

Dưới đây là nội dung điển hình của 1 Dockerfile dùng cho việc build Golang service với multi-stage builds, và utility installations.

# Stage 1: Build Stage
# This stage builds the application and reduces the final image size by only copying the compiled binary.
# Use the official Golang image for building the application
FROM golang:1.19 AS builder

# Set environment variables for Go
# Variables in the builder stage mainly for Go settings
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64

# Set the working directory inside the container
# So paths are relative, improving readability and avoiding absolute paths.
WORKDIR /app

# Copy Go modules and dependencies files
COPY go.mod go.sum ./

# Download dependencies
RUN go mod download

# Copy the entire source code into the container
COPY . .

# Build the application binary
RUN go build -o myapp .

# Stage 2: Final Image
# Use a smaller base image for running the application (distroless or Alpine)
FROM alpine:3.15

# Install utilities (optional)
RUN apk add --no-cache curl

# Set an environment variable
ENV PORT=8080

# Create a non-root user and group to run the application securely
# USER appuser ensures the application runs as a non-root user.
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

# Set the working directory
WORKDIR /app

# Copy only the necessary files from the build stage
COPY --from=builder /app/myapp .

# Change ownership to the non-root user
RUN chown -R appuser:appgroup /app

# Expose the application port
EXPOSE 8080

# Set default user for container execution
USER appuser

# Use CMD or ENTRYPOINT to run the binary
# ENTRYPOINT is often used for commands that should not be overridden by other commands
ENTRYPOINT ["./myapp"]

# CMD is for specifying the arguments passed to ENTRYPOINT or an alternative command
CMD ["--help"]

# ENTRYPOINT is set to ./myapp so the binary runs by default, with CMD providing additional default arguments or options (e.g., --help).

Cấu trúc FileSystem của Docker Container

Cấu trúc filesystem bên trong Docker container dựa trên minimal Linux root filesystem (Read More), được thiết kế để trở nên lightweight và và chuyên biệt cho running application bên trong container. Dưới đây là lược đồ tóm tắt cấu trúc các thư mục phổ biến:

/
├── bin/           # Essential binaries, executables, user commands (ls, cp, etc.)
├── dev/           # Device files (terminals, USBs), usually for virtual devices
├── etc/           # System and containerized application configuration files (network, users)
├── home/          # Optional, user-specific files and directories, for non-root users
├── lib/           # Shared libraries needed by bin/ and sbin/
├── media/         # Mount points for removable media (e.g., CD, USB) (often empty)
├── mnt/           # Temporary mount location for external filesystems
├── proc/          # Virtual filesystem with system/process info, representing process and system info
├── root/          # Home directory for the root user
├── run/           # Runtime process information (e.g., PIDs, sockets), application state files
├── sbin/          # System management binaries, commands, usually for root (e.g., reboot)
├── srv/           # Service data provided by the system (e.g., web, FTP)
├── tmp/           # Temporary files, often cleared on reboot, wiped on container stop/restart
├── usr/           # User binaries, libraries, documentation, secondary hierarchy for system resources
│   ├── bin/       # User binaries (e.g., git, gcc)
│   ├── lib/       # Libraries for user binaries
│   └── local/     # Locally installed software and files
└── var/           # Variable data files that change frequently
    ├── cache/     # Application cache data
    ├── log/       # System and application logs
    ├── mail/      # User mail storage
    └── tmp/       # Temporary storage for running applications

Docker containers được xây dựng nhằm cô lập các dependencies của application, do đó chỉ những directories và files cần thiết cho application xuất hiện, giúp container trở nên gọn nhẹ và tối giản.

1. Lệnh Container :

  • Khởi chạy 1 container mới:

    docker run -d --name <container-name> <image-name>
    
    • Chạy một container ở chế độ detached (-d) (không hold CLI nên ta có thể gõ lệnh khác sau đó) từ 1 base image được chỉ định.
    • Ví dụ: docker run -d --name my-nginx nginx
  • Hiển thị danh sách các containers đang chạy:

    docker ps
    
    • Hiển thị tất cả các containers đang chạy.
    • Thêm -a để liệt kê tất cả containers, bao gồm cả những container đã stop.
  • Dừng container:

    docker stop <container-id|container-name>
    
    • Dừng một container đang chạy.
  • Xóa container:

    docker rm <container-id|container-name>
    
    • Xóa một container đã được stop.
    • Dùng -f để buộc xóa một running container (container đang chạy).

2. Lệnh Image :

  • Khởi tạo (build) image:

    docker build -t <image-name>:<tag> <path-to-dockerfile>
    
    • Build một image từ Dockerfile.
    • Ví dụ: docker build -t my-app:latest .
  • Liệt kê danh sách image:

    docker images
    
    • Liệt kê tất cả các images có sẵn trên host.
  • Xóa image:

    docker rmi <image-id|image-name>
    
    • Xóa một image.
    • Dùng -f để buộc xóa image nếu nó đang được sử dụng.
  • Tải xuống (Pull) image từ remote repository:

    docker pull <image-name>:<tag>
    
    • Tải một image từ Docker Hub hoặc các registries khác.
    • Ví dụ: docker pull ubuntu:latest

3. Lệnh Network:

  • Liệt kê danh sách networks:

    docker network ls
    
    • Hiển thị tất cả Docker networks.
  • Tạo mới 1 network:

    docker network create <network-name>
    
    • Tạo một Docker network mới.
  • Kết nối container vào network:

    docker network connect <network-name> <container-name>
    
  • Kiểm tra thông tin network:

    docker network inspect <network-name>
    
    • Hiển thị thông tin chi tiết về một Docker network.

4. Lệnh Volume:

  • Khởi tạo volume:

    docker volume create <volume-name>
    
    • Tạo một volume mới cho việc lưu trữ dữ liệu.
  • Liệt kê danh sách volume:

    docker volume ls
    
    • Liệt kê tất cả các Docker volumes.
  • Xóa volume:

    docker volume rm <volume-name>
    
    • Xóa một volume.
  • Kiểm tra thông tin volume:

    docker volume inspect <volume-name>
    
    • Hiển thị thông tin chi tiết về một volume.

5. Một số command khác:

  • Hiển thị container logs:

    docker logs <container-id|container-name>
    
    • Hiển thị logs từ một container cụ thể.
    • Dùng -f để theo dõi logs theo thời gian thực.
  • Truy cập vào shell/bash của running docker :

    docker exec -it <container-id|container-name> /bin/bash
    
    • Mở một shell tương tác bên trong một container đang chạy.
    • Ví dụ: docker exec -it my-nginx /bin/bash
  • Tag image:

    docker tag <image-name> <repository>/<image-name>:<tag>
    
    • Tag một image để chuẩn bị đẩy lên registry.
    • Ví dụ: docker tag my-app myrepo/my-app:latest
  • Push image lên registry:

    docker push <repository>/<image-name>:<tag>
    
    • Tải lên một image đến Docker registry.
  • Xóa bỏ containers, images, networks, and volumes không còn sử dụng:

    docker system prune
    
    • Dọn dẹp các tài nguyên không sử dụng.
    • Thêm -a để xóa tất cả các containers đã dừng và images không còn được sử dụng.

Trên đây bao gồm hầu hết các thao tác phổ biến khi làm việc với Docker như quản lý containers, images, và networking.

Nếu bạn thấy bài viết này hữu ích, hãy cho mình biết bằng cách để lại 👍 hoặc bình luận!, hoặc nếu bạn nghĩ bài viết này có thể giúp ích cho ai đó, hãy thoải mái chia sẻ! Cảm ơn bạn rất nhiều! 😃


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.