Docker套装的简介、安装、超级详细教程

Docker 入门完整指南:容器化部署、镜像管理与 20+ 实用命令,一篇搞定!

摘要

本文是 Docker 入门的完整指南,涵盖容器化技术核心概念、Docker 安装配置、镜像与容器管理、网络存储机制、Dockerfile 编写规范以及 20+ 条高频实用命令。通过大量代码示例和对比表格,帮助开发者快速掌握 Docker 的核心操作,实现应用的快速部署与环境一致性保障。无论你是刚接触容器化的新手,还是需要系统梳理 Docker 知识体系的开发者,这篇文章都能为你提供清晰的学习路径。

Docker 是现代应用部署的基石,让"在我机器上能跑"成为历史,实现一次构建、到处运行的容器化革命!

在传统的应用部署中,开发环境、测试环境、生产环境的差异常常导致"在我机器上明明可以运行"的尴尬局面。Docker 通过容器化技术彻底解决了这个问题,它将应用及其依赖环境打包成标准化的容器镜像,确保在任何支持 Docker 的平台上都能以完全相同的方式运行。本文将带你从零开始,系统学习 Docker 的核心概念和实战技能。

一、Docker 基础概念

1.1 什么是 Docker

Docker 是一个开源的容器化平台,它通过操作系统级别的虚拟化技术,将应用程序及其依赖项打包到一个轻量级、可移植的容器中。与传统虚拟机相比,Docker 容器共享宿主机的操作系统内核,启动速度快、资源占用少、部署效率高。

Docker 的三大核心组件:

  • 镜像 (Image):只读的模板,包含运行应用所需的代码、运行时环境、库文件和配置
  • 容器 (Container):镜像的运行实例,是应用的实际运行环境
  • 仓库 (Registry):集中存储和分发镜像的服务,如 Docker Hub

1.2 Docker 与虚拟机的对比

特性 Docker 容器 传统虚拟机
启动速度 秒级 分钟级
性能损耗 接近原生 5%-20%
资源占用 MB 级别 GB 级别
隔离级别 进程级别 操作系统级别
可移植性 极高 一般
部署密度 单机可运行上千容器 单机几十个虚拟机

1.3 Docker 的核心优势

环境一致性:开发、测试、生产环境完全一致,消除环境差异导致的问题。

快速部署:镜像构建一次,可在任意环境快速启动,大幅缩短部署时间。

资源高效:共享宿主机内核,相比虚拟机节省大量内存和磁盘空间。

版本管理:镜像支持版本标签,便于回滚和灰度发布。

微服务支持:天然适配微服务架构,每个服务独立容器化部署。

二、Docker 安装与配置

2.1 Windows 安装 Docker Desktop

访问 Docker 官网下载 Docker Desktop for Windows,安装过程中会自动启用 WSL 2 后端支持。

安装完成后验证:

bash 复制代码
docker --version
# Docker version 24.0.6, build ed223bc

docker run hello-world
# Hello from Docker!
# This message shows that your installation appears to be working correctly.

2.2 Linux 安装 Docker Engine

在 Ubuntu/Debian 系统上安装:

bash 复制代码
# 更新包索引
sudo apt-get update

# 安装依赖
sudo apt-get install ca-certificates curl gnupg

# 添加 Docker 官方 GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 添加 Docker 仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

# 验证安装
sudo docker run hello-world
# Hello from Docker!

2.3 配置镜像加速器

由于 Docker Hub 国内访问速度较慢,推荐配置国内镜像源:

bash 复制代码
# 编辑 Docker 配置文件
sudo nano /etc/docker/daemon.json

# 添加镜像加速地址
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "https://registry.docker-cn.com"
  ]
}

# 重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker

# 验证配置
docker info | grep -A 5 "Registry Mirrors"
# Registry Mirrors:
#  https://mirror.ccs.tencentyun.com/

2.4 非 root 用户运行 Docker

默认情况下 Docker 命令需要 sudo 权限,可将当前用户添加到 docker 用户组:

bash 复制代码
sudo usermod -aG docker $USER

# 退出并重新登录生效
newgrp docker

# 无需 sudo 运行
docker ps
# CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

三、Docker 镜像管理

3.1 搜索镜像

bash 复制代码
# 搜索 nginx 相关镜像
docker search nginx
# NAME                DESCRIPTION                                     STARS     OFFICIAL
# nginx               Official build of Nginx.                        19000     [OK]
# nginxinc/nginx-unprivileged   Unprivileged NGINX Dockerfiles   850

# 限制搜索结果数量
docker search --limit 5 python
# 只显示前 5 个结果

3.2 拉取镜像

bash 复制代码
# 拉取最新版本 nginx
docker pull nginx
# Using default tag: latest
# latest: Pulling from library/nginx
# Status: Downloaded newer image for nginx:latest

# 拉取指定版本
docker pull nginx:1.25.3
# 1.25.3: Pulling from library/nginx

# 拉取特定平台镜像
docker pull --platform linux/amd64 nginx:alpine
# alpine: Pulling from library/nginx

3.3 查看本地镜像

bash 复制代码
# 列出所有镜像
docker images
# REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
# nginx        latest    605c77e624dd   2 weeks ago    141MB
# python       3.11      a5d7930b60cc   3 weeks ago    1.01GB

# 查看镜像详细信息
docker image inspect nginx:latest
# 返回 JSON 格式的详细配置信息

# 查看镜像历史层
docker history nginx:latest
# IMAGE          CREATED       CREATED BY                                      SIZE
# 605c77e624dd   2 weeks ago   /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon    0B

3.4 删除镜像

bash 复制代码
# 删除单个镜像
docker rmi nginx:1.25.3
# Untagged: nginx:1.25.3
# Deleted: sha256:abc123...

# 删除多个镜像
docker rmi nginx:latest python:3.11

# 强制删除正在使用的镜像
docker rmi -f nginx:latest

# 删除所有未使用的镜像
docker image prune -a
# WARNING! This will remove all images without at least one container associated to them.
# Total reclaimed space: 2.5GB

3.5 镜像导出与导入

bash 复制代码
# 将镜像保存为 tar 文件
docker save nginx:latest -o nginx_latest.tar
# 生成 nginx_latest.tar 文件

# 从 tar 文件加载镜像
docker load -i nginx_latest.tar
# Loaded image: nginx:latest

# 导出容器为镜像
docker export my_container > my_container.tar

# 导入容器快照为镜像
docker import my_container.tar my_image:v1.0
# sha256:def456...

3.6 镜像标签管理

bash 复制代码
# 为镜像添加新标签
docker tag nginx:latest myregistry.com/nginx:v1.0
# 创建新标签引用

# 查看镜像标签
docker images | grep nginx
# nginx                    latest    605c77e624dd   2 weeks ago   141MB
# myregistry.com/nginx     v1.0      605c77e624dd   2 weeks ago   141MB

# 推送镜像到远程仓库
docker push myregistry.com/nginx:v1.0
# The push refers to repository [myregistry.com/nginx]

四、Docker 容器操作

4.1 创建并运行容器

bash 复制代码
# 运行简单容器
docker run nginx
# 前台运行,占用终端

# 后台运行容器
docker run -d nginx
# a1b2c3d4e5f6... (返回容器 ID)

# 指定容器名称
docker run -d --name my_nginx nginx
# 容器名称为 my_nginx

# 端口映射
docker run -d -p 8080:80 --name web_server nginx
# 将容器 80 端口映射到宿主机 8080 端口

# 交互式运行
docker run -it ubuntu /bin/bash
# root@abc123:/# (进入容器内部 shell)

4.2 查看容器状态

bash 复制代码
# 查看运行中的容器
docker ps
# CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMES
# a1b2c3d4e5f6   nginx     "/docker-entrypoint...."   5 minutes ago   Up 5 minutes   0.0.0.0:8080->80/tcp   web_server

# 查看所有容器(包括已停止)
docker ps -a
# CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
# a1b2c3d4e5f6   nginx     "nginx"       10 minutes ago   Up 10 minutes               80/tcp    web_server
# b2c3d4e5f6g7   ubuntu    "/bin/bash"   20 minutes ago   Exited (0) 15 minutes ago             test_ubuntu

# 查看容器详细信息
docker inspect web_server
# 返回 JSON 格式配置信息

# 查看容器资源使用情况
docker stats web_server
# CONTAINER ID   NAME         CPU %     MEM USAGE / LIMIT     MEM %     NET I/O       BLOCK I/O
# a1b2c3d4e5f6   web_server   0.01%     3.5MiB / 15.6GiB     0.02%     1.2kB / 0B    0B / 0B

4.3 容器启动与停止

bash 复制代码
# 停止容器
docker stop web_server
# web_server

# 启动已停止的容器
docker start web_server
# web_server

# 重启容器
docker restart web_server
# web_server

# 暂停容器
docker pause web_server
# web_server (容器进程被冻结)

# 恢复暂停的容器
docker unpause web_server
# web_server

# 强制杀死容器
docker kill web_server
# web_server (立即终止,不等待优雅关闭)

4.4 进入容器内部

bash 复制代码
# 使用 exec 进入运行中的容器
docker exec -it web_server /bin/bash
# root@a1b2c3d4e5f6:/# (进入容器 shell)

# 执行单条命令
docker exec web_server ls /etc/nginx
# conf.d
# fastcgi_params
# mime.types
# nginx.conf

# 以 root 用户执行命令
docker exec -u root web_server whoami
# root

4.5 容器日志查看

bash 复制代码
# 查看容器日志
docker logs web_server
# 显示容器的标准输出日志

# 实时查看日志
docker logs -f web_server
# 类似 tail -f,持续输出新日志

# 查看最近 100 行日志
docker logs --tail 100 web_server

# 显示时间戳
docker logs -t web_server
# 2024-01-15T08:30:00.123456789Z 日志内容

4.6 容器删除

bash 复制代码
# 删除已停止的容器
docker rm web_server
# web_server

# 强制删除运行中的容器
docker rm -f web_server
# web_server

# 删除所有已停止的容器
docker container prune
# WARNING! This will remove all stopped containers.
# Total reclaimed space: 150MB

# 停止并删除容器(一步到位)
docker stop web_server && docker rm web_server

4.7 容器与宿主机文件交互

bash 复制代码
# 从容器复制文件到宿主机
docker cp web_server:/etc/nginx/nginx.conf ./nginx.conf
# 将容器内配置文件复制到当前目录

# 从宿主机复制文件到容器
docker cp ./index.html web_server:/usr/share/nginx/html/
# 将本地文件复制到容器

# 挂载宿主机目录(创建容器时)
docker run -d -v /host/data:/container/data nginx
# 双向同步,容器内修改立即反映到宿主机

五、Dockerfile 镜像构建

5.1 Dockerfile 基础指令

Dockerfile 是一个文本文件,包含构建镜像的所有指令:

dockerfile 复制代码
# 指定基础镜像
FROM python:3.11-slim

# 设置工作目录
WORKDIR /app

# 复制文件到镜像
COPY requirements.txt .

# 执行命令
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 8000

# 设置环境变量
ENV APP_ENV=production

# 容器启动命令
CMD ["python", "app.py"]

5.2 Dockerfile 常用指令对比

指令 作用 示例
FROM 指定基础镜像 FROM ubuntu:22.04
WORKDIR 设置工作目录 WORKDIR /app
COPY 复制文件到镜像 COPY . /app
ADD 复制文件(支持 URL 和自动解压) ADD app.tar.gz /app
RUN 构建时执行命令 RUN apt-get update
CMD 容器启动默认命令 CMD "nginx", "-g", "daemon off;"
ENTRYPOINT 容器入口点 ENTRYPOINT "python"
ENV 设置环境变量 ENV NODE_ENV=production
EXPOSE 声明端口 EXPOSE 80 443
VOLUME 创建挂载点 VOLUME /data
USER 指定运行用户 USER nginx

5.3 构建镜像

bash 复制代码
# 基本构建
docker build -t myapp:v1.0 .
# Sending build context to Docker daemon  15.36MB
# Step 1/8 : FROM python:3.11-slim
# Successfully built abc123def456
# Successfully tagged myapp:v1.0

# 指定 Dockerfile 文件
docker build -f Dockerfile.prod -t myapp:prod .

# 不使用缓存构建
docker build --no-cache -t myapp:v1.0 .

# 构建时传递参数
docker build --build-arg APP_VERSION=1.0 -t myapp:v1.0 .

5.4 多阶段构建优化镜像大小

dockerfile 复制代码
# 第一阶段:编译构建
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

# 第二阶段:运行环境
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
EXPOSE 8080
CMD ["./myapp"]

构建对比:

bash 复制代码
# 单阶段构建
docker build -t myapp:single .
# 镜像大小 800MB (包含完整 Go 编译环境)

# 多阶段构建
docker build -t myapp:multi .
# 镜像大小 15MB (仅包含可执行文件和 Alpine 基础)

5.5 最佳实践示例

dockerfile 复制代码
# Node.js 应用最佳实践
FROM node:18-alpine AS builder

# 设置工作目录
WORKDIR /app

# 先复制依赖文件(利用缓存)
COPY package*.json ./
RUN npm ci --only=production

# 再复制应用代码
COPY . .

# 构建应用
RUN npm run build

# 生产环境镜像
FROM node:18-alpine
WORKDIR /app

# 创建非 root 用户
RUN addgroup -g 1001 -S nodejs && adduser -S nodejs -u 1001

# 从构建阶段复制文件
COPY --from=builder --chown=nodejs:nodejs /app/dist ./dist
COPY --from=builder --chown=nodejs:nodejs /app/node_modules ./node_modules

# 切换用户
USER nodejs

# 暴露端口
EXPOSE 3000

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s \
  CMD node healthcheck.js || exit 1

# 启动命令
CMD ["node", "dist/main.js"]

六、Docker 网络与存储

6.1 Docker 网络模式对比

网络模式 说明 使用场景
bridge 默认模式,容器独立网络栈 单机多容器互联
host 容器使用宿主机网络 需要最佳网络性能
none 无网络配置 高安全隔离场景
container 共享其他容器网络 容器间紧密协作
overlay 跨主机容器通信 Docker Swarm 集群

6.2 网络操作命令

bash 复制代码
# 创建自定义网络
docker network create my_network
# abc123def456... (返回网络 ID)

# 查看所有网络
docker network ls
# NETWORK ID     NAME         DRIVER    SCOPE
# abc123def456   my_network   bridge    local
# def456ghi789   bridge       bridge    local

# 查看网络详情
docker network inspect my_network
# 显示网络配置和已连接容器

# 容器连接到网络
docker network connect my_network web_server

# 容器断开网络
docker network disconnect my_network web_server

# 删除网络
docker network rm my_network

# 清理未使用的网络
docker network prune
# WARNING! This will remove all custom networks not used by at least one container.

6.3 容器互联实战

bash 复制代码
# 创建自定义网络
docker network create app_network

# 启动数据库容器
docker run -d --name mysql_db --network app_network \
  -e MYSQL_ROOT_PASSWORD=secret \
  mysql:8.0
# 容器在 app_network 网络中可通过 mysql_db 主机名访问

# 启动应用容器
docker run -d --name web_app --network app_network \
  -p 8080:8000 \
  -e DB_HOST=mysql_db \
  myapp:v1.0
# 应用容器可直接通过 mysql_db 连接数据库

6.4 数据卷管理

bash 复制代码
# 创建数据卷
docker volume create my_data
# my_data

# 查看所有数据卷
docker volume ls
# DRIVER    VOLUME NAME
# local     my_data

# 查看数据卷详情
docker volume inspect my_data
# [
#     {
#         "CreatedAt": "2024-01-15T08:30:00Z",
#         "Driver": "local",
#         "Mountpoint": "/var/lib/docker/volumes/my_data/_data",
#         "Name": "my_data"
#     }
# ]

# 使用数据卷
docker run -d -v my_data:/app/data --name app1 nginx
# 容器删除后数据卷数据依然保留

# 删除数据卷
docker volume rm my_data

# 清理未使用的数据卷
docker volume prune
# WARNING! This will remove all local volumes not used by at least one container.
# Total reclaimed space: 1.2GB

6.5 挂载方式对比

挂载方式 语法 特点 适用场景
数据卷 -v my_vol:/data Docker 管理,持久化 数据库数据、配置文件
绑定挂载 -v /host/path:/container/path 直接挂载宿主机目录 开发环境代码同步
tmpfs --tmpfs /tmp 内存临时存储 敏感临时数据
bash 复制代码
# 数据卷挂载
docker run -d -v db_data:/var/lib/mysql mysql:8.0

# 绑定挂载
docker run -d -v /home/user/web:/usr/share/nginx/html nginx

# 只读挂载
docker run -d -v /host/config:/etc/config:ro nginx

# tmpfs 挂载
docker run -d --tmpfs /tmp:rw,noexec,nosuid nginx

七、Docker Compose 多容器编排

7.1 Docker Compose 简介

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具,通过 YAML 文件配置应用服务。

安装验证:

bash 复制代码
docker compose version
# Docker Compose version v2.23.0

7.2 Compose 文件示例

创建 docker-compose.yml:

yaml 复制代码
version: '3.8'

services:
  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - ./app:/app
    environment:
      - DATABASE_URL=postgresql://postgres:secret@db:5432/myapp
    depends_on:
      - db
      - redis
    networks:
      - app_network

  db:
    image: postgres:15-alpine
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=myapp
    networks:
      - app_network

  redis:
    image: redis:7-alpine
    networks:
      - app_network

volumes:
  db_data:

networks:
  app_network:
    driver: bridge

7.3 Compose 常用命令

bash 复制代码
# 启动所有服务
docker compose up -d
# Creating network "app_network"
# Creating volume "db_data"
# Creating app_db_1 ... done
# Creating app_redis_1 ... done
# Creating app_web_1 ... done

# 查看服务状态
docker compose ps
# NAME         IMAGE           STATUS    PORTS
# app_web_1    app_web:latest  Up        0.0.0.0:8000->8000/tcp
# app_db_1     postgres:15     Up        5432/tcp
# app_redis_1  redis:7         Up        6379/tcp

# 查看服务日志
docker compose logs web
# 显示 web 服务日志

# 实时跟踪日志
docker compose logs -f --tail=50

# 停止所有服务
docker compose stop

# 停止并删除容器
docker compose down
# Stopping app_web_1 ... done
# Removing app_web_1 ... done
# Removing network app_network

# 停止并删除容器、网络、数据卷
docker compose down -v
# 清理所有资源

# 重启服务
docker compose restart web

# 执行命令
docker compose exec web python manage.py migrate
# 在 web 容器中执行数据库迁移

# 扩展服务实例
docker compose up -d --scale web=3
# 启动 3 个 web 服务实例

八、Docker 实用命令速查表

8.1 系统信息命令

bash 复制代码
# 查看 Docker 版本
docker version
# Client: Docker Engine - Community
# Version:           24.0.6

# 查看 Docker 系统信息
docker info
# Containers: 5
# Images: 20
# Storage Driver: overlay2

# 查看磁盘占用
docker system df
# TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
# Images          20        5         4.5GB     2.3GB (51%)
# Containers      5         2         150MB     100MB (66%)
# Local Volumes   8         3         1.2GB     800MB (66%)

8.2 清理命令

bash 复制代码
# 清理所有未使用的资源
docker system prune -a
# WARNING! This will remove:
#   - all stopped containers
#   - all networks not used by at least one container
#   - all images without at least one container associated to them
#   - all build cache
# Total reclaimed space: 5.2GB

# 仅清理构建缓存
docker builder prune
# Total reclaimed space: 1.5GB

# 清理指定时间前的资源
docker system prune -a --filter "until=24h"
# 清理 24 小时前的未使用资源

# 查看将被清理的内容
docker system prune --dry-run
# 预览清理结果,不实际删除

8.3 容器批量操作命令

bash 复制代码
# 停止所有运行中的容器
docker stop $(docker ps -q)
# 返回所有容器 ID 并逐个停止

# 删除所有已停止的容器
docker rm $(docker ps -aq -f status=exited)
# 筛选已退出容器并删除

# 删除所有容器
docker rm -f $(docker ps -aq)
# 强制删除所有容器

# 删除所有镜像
docker rmi $(docker images -q)
# 删除本地所有镜像

# 删除悬空镜像
docker rmi $(docker images -f "dangling=true" -q)
# 删除 tag 为 none 的镜像

8.4 监控与调试命令

bash 复制代码
# 实时查看容器资源使用
docker stats
# CONTAINER ID   NAME       CPU %   MEM USAGE / LIMIT   MEM %   NET I/O
# a1b2c3d4e5f6   web        0.5%    50MiB / 2GiB        2.5%    1.2MB / 800kB

# 查看容器进程
docker top web_server
# PID     USER    TIME     COMMAND
# 12345   root    0:00     nginx: master process
# 12346   nginx   0:01     nginx: worker process

# 查看容器端口映射
docker port web_server
# 80/tcp -> 0.0.0.0:8080

# 查看容器文件系统变化
docker diff web_server
# C /var
# C /var/log
# A /var/log/nginx/access.log

# 导出容器文件系统
docker export web_server > web_server.tar
# 导出为 tar 归档文件

# 实时监控 Docker 事件
docker events
# 实时显示 Docker 守护进程事件流

九、Docker 高级应用场景

9.1 CI/CD 集成

在 GitLab CI 中使用 Docker:

yaml 复制代码
stages:
  - build
  - test
  - deploy

build_image:
  stage: build
  script:
    - docker build -t myapp:$CI_COMMIT_SHA .
    - docker tag myapp:$CI_COMMIT_SHA myapp:latest
    - docker push myapp:$CI_COMMIT_SHA

run_tests:
  stage: test
  script:
    - docker run --rm myapp:$CI_COMMIT_SHA npm test

deploy_prod:
  stage: deploy
  script:
    - docker pull myapp:$CI_COMMIT_SHA
    - docker stop myapp_prod || true
    - docker rm myapp_prod || true
    - docker run -d --name myapp_prod -p 80:8000 myapp:$CI_COMMIT_SHA
  only:
    - main

9.2 健康检查配置

在 Dockerfile 中添加健康检查:

dockerfile 复制代码
FROM nginx:alpine

COPY nginx.conf /etc/nginx/nginx.conf
COPY html /usr/share/nginx/html

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD wget --quiet --tries=1 --spider http://localhost/ || exit 1

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

运行时配置健康检查:

bash 复制代码
docker run -d \
  --name web \
  --health-cmd="curl -f http://localhost/ || exit 1" \
  --health-interval=30s \
  --health-timeout=3s \
  --health-retries=3 \
  nginx
  
# 查看健康状态
docker inspect --format='{{.State.Health.Status}}' web
# healthy

9.3 资源限制

bash 复制代码
# 限制内存和 CPU
docker run -d \
  --name resource_limited \
  --memory="512m" \
  --memory-swap="1g" \
  --cpus="1.5" \
  nginx

# 限制磁盘 IO
docker run -d \
  --device-read-bps /dev/sda:1mb \
  --device-write-bps /dev/sda:1mb \
  nginx

# 限制网络带宽需要配合 tc 工具
docker run -d --name web nginx
docker exec web tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms

# 查看容器资源限制
docker inspect --format='{{.HostConfig.Memory}}' resource_limited
# 536870912 (512MB)

9.4 日志管理

配置日志驱动:

bash 复制代码
# 使用 json-file 驱动并限制大小
docker run -d \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx

# 使用 syslog 驱动
docker run -d \
  --log-driver syslog \
  --log-opt syslog-address=tcp://192.168.1.100:514 \
  nginx

# 使用 fluentd 驱动
docker run -d \
  --log-driver fluentd \
  --log-opt fluentd-address=localhost:24224 \
  nginx

# 禁用日志
docker run -d --log-driver none nginx

9.5 安全加固

bash 复制代码
# 以只读模式运行容器
docker run -d --read-only --tmpfs /tmp nginx

# 限制容器权限
docker run -d --cap-drop ALL --cap-add NET_BIND_SERVICE nginx

# 使用非 root 用户
docker run -d --user 1000:1000 nginx

# 禁止特权模式
docker run -d --security-opt no-new-privileges nginx

# 使用 AppArmor 配置
docker run -d --security-opt apparmor=docker-default nginx

# 扫描镜像漏洞
docker scout cves nginx:latest
# 显示镜像中的安全漏洞

十、20+ Docker 实用命令汇总

10.1 镜像管理命令集

bash 复制代码
# 1. 搜索镜像
docker search nginx --limit 5

# 2. 拉取镜像
docker pull nginx:alpine

# 3. 查看本地镜像
docker images

# 4. 删除镜像
docker rmi nginx:alpine

# 5. 保存镜像到文件
docker save nginx:latest -o nginx.tar

# 6. 从文件加载镜像
docker load -i nginx.tar

# 7. 为镜像打标签
docker tag nginx:latest myregistry.com/nginx:v1

# 8. 推送镜像到仓库
docker push myregistry.com/nginx:v1

10.2 容器操作命令集

bash 复制代码
# 9. 创建并运行容器
docker run -d --name web -p 8080:80 nginx

# 10. 查看运行中的容器
docker ps

# 11. 查看所有容器
docker ps -a

# 12. 停止容器
docker stop web

# 13. 启动容器
docker start web

# 14. 重启容器
docker restart web

# 15. 删除容器
docker rm -f web

# 16. 进入容器
docker exec -it web /bin/bash

# 17. 查看容器日志
docker logs -f web

# 18. 复制文件
docker cp web:/etc/nginx/nginx.conf ./

10.3 系统管理命令集

bash 复制代码
# 19. 查看系统信息
docker info

# 20. 查看磁盘占用
docker system df

# 21. 清理未使用资源
docker system prune -a

# 22. 查看实时资源占用
docker stats

# 23. 查看容器详细信息
docker inspect web

# 24. 监控 Docker 事件
docker events --since '2024-01-15T00:00:00'

10.4 网络与存储命令集

bash 复制代码
# 25. 创建网络
docker network create my_network

# 26. 查看网络列表
docker network ls

# 27. 创建数据卷
docker volume create my_data

# 28. 查看数据卷列表
docker volume ls

# 29. 清理未使用的数据卷
docker volume prune

十一、Docker 最佳实践总结

11.1 镜像构建最佳实践

使用官方基础镜像:优先选择官方认证的基础镜像,如 python:3.11-slim、node:18-alpine。

多阶段构建减小体积:分离编译环境和运行环境,最终镜像仅包含必要的运行时文件。

利用构建缓存:将不常变化的指令放在前面(如依赖安装),将频繁变化的指令放在后面(如代码复制)。

最小化镜像层数:合并多个 RUN 命令,减少镜像层数和体积。

使用 .dockerignore:排除不必要的文件,加快构建速度和减小镜像体积。

11.2 容器运行最佳实践

一个容器一个进程:遵循单一职责原则,每个容器只运行一个主进程。

使用非 root 用户:提高安全性,避免以 root 用户运行应用。

配置资源限制:为容器设置合理的 CPU 和内存限制,防止资源耗尽。

健康检查:为长期运行的服务配置健康检查,确保服务可用性。

日志管理:配置日志驱动和日志轮转,避免日志文件无限增长。

11.3 安全性最佳实践

定期更新基础镜像:及时更新镜像以修复已知安全漏洞。

扫描镜像漏洞:使用 docker scout 或 Trivy 等工具定期扫描镜像。

最小权限原则:仅授予容器必需的权限,使用 --cap-drop 移除不需要的 Linux capabilities。

敏感信息管理:使用 Docker Secrets 或环境变量管理敏感信息,不要硬编码在镜像中。

网络隔离:使用自定义网络隔离不同应用的容器,避免使用默认 bridge 网络。

11.4 性能优化最佳实践

使用 Alpine 基础镜像:体积小、启动快,适合大多数场景。

启用 BuildKit:使用新版构建引擎,支持并行构建和更好的缓存机制。

优化镜像层:删除不必要的临时文件,清理包管理器缓存。

使用数据卷:持久化数据使用数据卷而非容器文件系统,提高 IO 性能。

合理配置重启策略:生产环境使用 --restart=unless-stopped 确保服务高可用。

十二、常见问题与解决方案

12.1 容器无法访问

问题:宿主机无法访问容器服务。

解决方案

  • 检查端口映射是否正确:docker ps 查看 PORTS 列
  • 确认防火墙规则:sudo ufw allow 8080
  • 检查容器服务是否启动:docker logs container_name
  • 验证容器 IP:docker inspect container_name | grep IPAddress

12.2 镜像拉取失败

问题:docker pull 超时或失败。

解决方案

  • 配置国内镜像加速器(见 2.3 节)
  • 检查网络连接:ping hub.docker.com
  • 使用代理:docker run --env HTTP_PROXY=http://proxy:port ...
  • 手动下载镜像 tar 包后 docker load 导入

12.3 容器磁盘空间不足

问题:提示 no space left on device。

解决方案

  • 清理未使用资源:docker system prune -a --volumes
  • 查看磁盘占用:docker system df
  • 配置日志轮转:--log-opt max-size=10m --log-opt max-file=3
  • 迁移 Docker 数据目录到更大分区

12.4 容器间无法通信

问题:同一主机上的容器无法互相访问。

解决方案

  • 确保容器在同一自定义网络:docker network connect my_network container1
  • 使用容器名代替 IP:ping container2_name
  • 检查网络模式:docker inspect container1 | grep NetworkMode
  • 避免使用默认 bridge 网络,创建自定义网络

12.5 容器内时间不准确

问题:容器内时间与宿主机不一致。

解决方案

  • 挂载宿主机时区:-v /etc/localtime:/etc/localtime:ro
  • 设置时区环境变量:-e TZ=Asia/Shanghai
  • 在 Dockerfile 中配置:ENV TZ=Asia/Shanghai

十三、总结速查表

Docker 核心概念对比

概念 说明 类比
镜像 只读模板 类的定义
容器 镜像的运行实例 类的实例对象
仓库 镜像存储中心 GitHub 代码仓库
数据卷 持久化存储 外接硬盘
网络 容器通信通道 局域网

常用操作命令速记

操作类型 常用命令 说明
拉取镜像 docker pull nginx:alpine 从仓库下载镜像
运行容器 docker run -d -p 8080:80 nginx 后台运行并映射端口
查看容器 docker ps -a 查看所有容器
进入容器 docker exec -it web /bin/bash 交互式进入容器
查看日志 docker logs -f web 实时查看容器日志
停止容器 docker stop web 优雅停止容器
删除容器 docker rm -f web 强制删除容器
构建镜像 docker build -t myapp:v1 . 从 Dockerfile 构建
清理资源 docker system prune -a 清理所有未使用资源

Dockerfile 指令速记

指令 用途 示例
FROM 基础镜像 FROM python:3.11-slim
WORKDIR 工作目录 WORKDIR /app
COPY 复制文件 COPY . /app
RUN 执行命令 RUN pip install -r requirements.txt
EXPOSE 暴露端口 EXPOSE 8000
ENV 环境变量 ENV APP_ENV=production
CMD 启动命令 CMD "python", "app.py"

学习路径建议

第一阶段:掌握基础概念和镜像容器操作(1-3 天)

  • 理解镜像、容器、仓库的关系
  • 学会 pull、run、ps、logs、exec 等基础命令
  • 能够运行官方镜像并进行简单配置

第二阶段:学习 Dockerfile 和镜像构建(3-5 天)

  • 编写简单的 Dockerfile
  • 理解镜像层和构建缓存机制
  • 掌握多阶段构建优化镜像大小

第三阶段:掌握网络和存储管理(5-7 天)

  • 理解不同网络模式的使用场景
  • 掌握数据卷的创建和挂载
  • 能够实现多容器互联

第四阶段:Docker Compose 多容器编排(7-10 天)

  • 编写 docker-compose.yml 配置文件
  • 管理多服务应用栈
  • 实现开发环境快速搭建

第五阶段:生产环境最佳实践(持续学习)

  • 安全加固和权限管理
  • 监控日志和故障排查
  • CI/CD 集成和自动化部署

通过本文的系统学习,你已经掌握了 Docker 从入门到实战的完整知识体系。Docker 作为现代应用部署的标准工具,将大幅提升你的开发效率和部署可靠性。建议在实际项目中多加练习,逐步掌握容器化技术的精髓。

如果这篇文章对你有帮助,欢迎在评论区分享你的 Docker 使用经验或遇到的问题,我们一起交流学习!

相关推荐
Ruiery1 小时前
Linux 6.6内核 PCIe 深度解析(十):PCIe Port Driver(portdrv)— 一个物理 Port,拆出五个逻辑服务
linux·运维·服务器
粥里有勺糖2 小时前
视野修炼-技术周刊第132期 | 一些有趣的组件
前端·github·aigc
智碳能碳管理平台2 小时前
企业能碳管理系统的月度锁账、防篡改与留痕怎么架构
架构·github·能碳管理系统·智碳能碳管理平台·企业能碳管理系统·绿色工厂申报saas·能碳管理平台
码农小韩3 小时前
Linux应用开发(二)——Linux的文件IO
linux·嵌入式软件·嵌入式操作系统·linux应用
mjhcsp3 小时前
Github Copilot 新手极速上手指南
github·copilot
Horn Still Sounds3 小时前
Linux网络并发服务器模型与SQLite数据库学习笔记
linux·服务器·数据库
重生之我来学Python4 小时前
Git-SVN 混合开发,从入门到精通!
开发语言·git·svn·github
10mAh4 小时前
【Linux】CPU 100% 怎么排查?——top、pidstat、jstack 到线程定位实战
linux·运维·服务器
深念Y4 小时前
开机启动优化记录
linux·开机