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 与虚拟机的对比
| 启动速度 | 秒级 | 分钟级 |
| 性能损耗 | 接近原生 | 5%-20% |
| 资源占用 | MB 级别 | GB 级别 |
| 隔离级别 | 进程级别 | 操作系统级别 |
| 可移植性 | 极高 | 一般 |
| 部署密度 | 单机可运行上千容器 | 单机几十个虚拟机 |
1.3 Docker 的核心优势
环境一致性:开发、测试、生产环境完全一致,消除环境差异导致的问题。
快速部署:镜像构建一次,可在任意环境快速启动,大幅缩短部署时间。
资源高效:共享宿主机内核,相比虚拟机节省大量内存和磁盘空间。
版本管理:镜像支持版本标签,便于回滚和灰度发布。
微服务支持:天然适配微服务架构,每个服务独立容器化部署。
二、Docker 安装与配置
2.1 Windows 安装 Docker Desktop
访问 Docker 官网下载 Docker Desktop for Windows,安装过程中会自动启用 WSL 2 后端支持。
安装完成后验证:
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 系统上安装:
# 更新包索引
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 国内访问速度较慢,推荐配置国内镜像源:
# 编辑 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 用户组:
sudo usermod -aG docker $USER
# 退出并重新登录生效
newgrp docker
# 无需 sudo 运行
docker ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
三、Docker 镜像管理
3.1 搜索镜像
# 搜索 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 拉取镜像
# 拉取最新版本 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 查看本地镜像
# 列出所有镜像
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 删除镜像
# 删除单个镜像
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 镜像导出与导入
# 将镜像保存为 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 镜像标签管理
# 为镜像添加新标签
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 创建并运行容器
# 运行简单容器
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 查看容器状态
# 查看运行中的容器
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 容器启动与停止
# 停止容器
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 进入容器内部
# 使用 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 容器日志查看
# 查看容器日志
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 容器删除
# 删除已停止的容器
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 容器与宿主机文件交互
# 从容器复制文件到宿主机
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 是一个文本文件,包含构建镜像的所有指令:
# 指定基础镜像
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 构建镜像
# 基本构建
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 多阶段构建优化镜像大小
# 第一阶段:编译构建
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"]
构建对比:
# 单阶段构建
docker build -t myapp:single .
# 镜像大小 800MB (包含完整 Go 编译环境)
# 多阶段构建
docker build -t myapp:multi .
# 镜像大小 15MB (仅包含可执行文件和 Alpine 基础)
5.5 最佳实践示例
# 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 网络操作命令
# 创建自定义网络
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 容器互联实战
# 创建自定义网络
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 数据卷管理
# 创建数据卷
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 | 内存临时存储 | 敏感临时数据 |
# 数据卷挂载
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 文件配置应用服务。
安装验证:
docker compose version
# Docker Compose version v2.23.0
7.2 Compose 文件示例
创建 docker-compose.yml:
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 常用命令
# 启动所有服务
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 系统信息命令
# 查看 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 清理命令
# 清理所有未使用的资源
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 容器批量操作命令
# 停止所有运行中的容器
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 监控与调试命令
# 实时查看容器资源使用
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:
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 中添加健康检查:
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;"]
运行时配置健康检查:
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 资源限制
# 限制内存和 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 日志管理
配置日志驱动:
# 使用 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 安全加固
# 以只读模式运行容器
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 镜像管理命令集
# 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 容器操作命令集
# 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 系统管理命令集
# 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 网络与存储命令集
# 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 使用经验或遇到的问题,我们一起交流学习!

