Docker 从入门到精通教程
目录
Docker 简介
什么是 Docker?
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中。容器可以在任何支持 Docker 的环境中运行,确保应用程序在不同环境中表现一致。
Docker 的优势
- 轻量级:容器共享主机操作系统内核,比虚拟机更轻量
- 可移植性:一次构建,到处运行
- 隔离性:容器之间相互隔离,互不影响
- 快速部署:秒级启动,快速扩展
- 版本控制:可以像代码一样管理容器镜像
Docker 核心概念
1. 镜像(Image)
镜像是一个只读的模板,用于创建容器。可以理解为容器的"蓝图"。
- 类比:镜像 = 类(Class),容器 = 实例(Instance)
2. 容器(Container)
容器是镜像的运行实例。容器可以被创建、启动、停止、删除。
- 类比:容器 = 运行中的虚拟机(但更轻量)
3. 仓库(Repository)
仓库是存储镜像的地方,类似于 Git 仓库。
- Docker Hub:官方的公共仓库
- 私有仓库:可以搭建自己的私有仓库
4. Dockerfile
Dockerfile 是一个文本文件,包含构建镜像的指令。
Docker 安装
Windows 安装
Linux 安装
Ubuntu/Debian:
# 更新包索引
sudo apt-get update
# 安装依赖
sudo apt-get install -y ca-certificates curl gnupg lsb-release
# 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /etc/apt/keyrings/docker.gpg
# 设置仓库
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 Engine
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
CentOS/RHEL:
# 安装 yum-utils
sudo yum install -y yum-utils
# 添加 Docker 仓库
sudo yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装 Docker Engine
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 启动 Docker
sudo systemctl start docker
sudo systemctl enable docker
macOS 安装
验证安装
docker –version
docker info
docker compose version # Docker Compose V2
Docker 基础命令
系统信息命令
# 查看 Docker 版本
docker –version
docker version
# 查看 Docker 系统信息
docker info
# 查看 Docker 帮助
docker –help
docker <command> –help
Docker 常用命令详解
镜像相关命令
1. 搜索镜像
docker search <镜像名>
示例:
docker search nginx
docker search python
输出说明:
- NAME: 镜像名称
- DESCRIPTION: 镜像描述
- STARS: 星标数(受欢迎程度)
- OFFICIAL: 是否为官方镜像
- AUTOMATED: 是否自动构建
2. 拉取镜像
docker pull <镜像名>[:标签]
示例:
docker pull nginx # 拉取最新版本
docker pull nginx:1.21 # 拉取指定版本
docker pull ubuntu:20.04 # 拉取 Ubuntu 20.04
docker pull python:3.9-slim # 拉取 Python 3.9 精简版
常用镜像标签:
- latest: 最新版本(默认)
- alpine: 基于 Alpine Linux,体积小
- slim: 精简版
- 版本号:如 1.21, 3.9
3. 列出本地镜像
docker images
docker image ls
参数:
docker images -a # 显示所有镜像(包括中间层)
docker images –digests # 显示摘要信息
docker images –format "table {{.Repository}}\\t{{.Tag}}\\t{{.Size}}"
docker images –filter "dangling=true" # 显示悬空镜像
输出说明:
- REPOSITORY: 仓库名
- TAG: 标签(版本)
- IMAGE ID: 镜像 ID
- CREATED: 创建时间
- SIZE: 镜像大小
4. 删除镜像
docker rmi <镜像名或ID>
docker image rm <镜像名或ID>
示例:
docker rmi nginx:1.21
docker rmi abc123def456
docker rmi -f nginx # 强制删除(即使有容器在使用)
docker rmi $(docker images -q) # 删除所有镜像
参数:
- -f, –force: 强制删除
5. 构建镜像
docker build [选项] <路径>
示例:
docker build -t myapp:1.0 .
docker build -t myapp:1.0 -f Dockerfile.prod .
常用参数:
- -t, –tag: 指定镜像名称和标签
- -f, –file: 指定 Dockerfile 路径
- –no-cache: 不使用缓存构建
- –build-arg: 传递构建参数
6. 查看镜像历史
docker history <镜像名或ID>
7. 标记镜像
docker tag <源镜像> <新镜像名>:<标签>
示例:
docker tag nginx:latest mynginx:v1.0
8. 导出/导入镜像
# 导出镜像为 tar 文件
docker save -o <文件名>.tar <镜像名>
# 导入镜像
docker load -i <文件名>.tar
示例:
docker save -o nginx.tar nginx:latest
docker load -i nginx.tar
容器相关命令
1. 运行容器
docker run [选项] <镜像名> [命令]
基础示例:
docker run nginx
docker run -d nginx # 后台运行
docker run -it ubuntu bash # 交互式运行
docker run –name mynginx nginx # 指定容器名称
常用参数详解:
基础参数
-
-d, –detach: 后台运行容器
docker run -d nginx
-
-i, –interactive: 保持 STDIN 打开,即使没有附加
docker run -i ubuntu bash
-
-t, –tty: 分配一个伪终端
docker run -t ubuntu bash
通常 -it 一起使用,用于交互式容器:
docker run -it ubuntu bash
-
–name: 指定容器名称
docker run –name mycontainer nginx
-
–rm: 容器退出时自动删除
docker run –rm nginx
端口映射
- -p, –publish: 映射容器端口到主机端口# 格式:主机端口:容器端口
docker run -p 8080:80 nginx # 主机8080 -> 容器80
docker run -p 127.0.0.1:8080:80 nginx # 只绑定本地
docker run -p 80:80 -p 443:443 nginx # 映射多个端口
数据卷挂载
- -v, –volume: 挂载数据卷# 格式:主机路径:容器路径
docker run -v /host/path:/container/path nginx
docker run -v /data:/app/data nginx# 使用命名卷
docker run -v myvolume:/app/data nginx# 只读挂载
docker run -v /host/path:/container/path:ro nginx
环境变量
- -e, –env: 设置环境变量docker run -e MYSQL_ROOT_PASSWORD=123456 mysql
docker run -e VAR1=value1 -e VAR2=value2 nginx# 从文件读取环境变量
docker run –env-file .env nginx
网络设置
- –network: 指定网络docker run –network bridge nginx # 桥接网络(默认)
docker run –network host nginx # 主机网络
docker run –network none nginx # 无网络
docker run –network mynetwork nginx # 自定义网络
资源限制
-
–memory 或 -m: 限制内存
docker run -m 512m nginx # 限制 512MB
docker run –memory="1g" nginx # 限制 1GB -
–cpus: 限制 CPU
docker run –cpus="1.5" nginx # 限制 1.5 个 CPU
docker run –cpus="0.5" nginx # 限制 0.5 个 CPU -
–cpu-shares: CPU 权重(相对值)
docker run –cpu-shares=512 nginx
其他常用参数
-
–restart: 重启策略
docker run –restart=no nginx # 不自动重启(默认)
docker run –restart=always nginx # 总是重启
docker run –restart=on-failure nginx # 失败时重启
docker run –restart=unless-stopped nginx # 除非手动停止 -
–workdir 或 -w: 设置工作目录
docker run -w /app nginx
-
–user 或 -u: 指定运行用户
docker run -u 1000:1000 nginx
docker run -u root nginx -
–entrypoint: 覆盖入口点
docker run –entrypoint /bin/bash nginx
-
–link: 链接到其他容器(已废弃,建议使用网络)
docker run –link mysql:db nginx
2. 列出容器
docker ps # 运行中的容器
docker ps -a # 所有容器(包括已停止)
docker container ls # 同上
参数:
docker ps -q # 只显示容器 ID
docker ps –format "table {{.ID}}\\t{{.Names}}\\t{{.Status}}"
docker ps –filter "status=exited" # 过滤已退出的容器
docker ps –filter "name=nginx" # 按名称过滤
输出说明:
- CONTAINER ID: 容器 ID
- IMAGE: 使用的镜像
- COMMAND: 执行的命令
- CREATED: 创建时间
- STATUS: 状态
- PORTS: 端口映射
- NAMES: 容器名称
3. 启动/停止/重启容器
docker start <容器名或ID> # 启动已停止的容器
docker stop <容器名或ID> # 停止运行中的容器
docker restart <容器名或ID> # 重启容器
docker pause <容器名或ID> # 暂停容器
docker unpause <容器名或ID> # 恢复暂停的容器
参数:
docker stop -t 10 <容器> # 等待 10 秒后强制停止
4. 删除容器
docker rm <容器名或ID>
docker container rm <容器名或ID>
示例:
docker rm mycontainer
docker rm -f mycontainer # 强制删除运行中的容器
docker rm $(docker ps -aq) # 删除所有已停止的容器
参数:
- -f, –force: 强制删除运行中的容器
- -v, –volumes: 同时删除关联的数据卷
5. 查看容器日志
docker logs <容器名或ID>
参数:
docker logs -f mycontainer # 跟踪日志输出(类似 tail -f)
docker logs –tail 100 mycontainer # 显示最后 100 行
docker logs –since 10m mycontainer # 显示最近 10 分钟的日志
docker logs –until 2023-01-01T00:00:00 mycontainer
docker logs -t mycontainer # 显示时间戳
6. 进入运行中的容器
docker exec [选项] <容器名或ID> <命令>
示例:
docker exec -it mycontainer bash # 进入容器并执行 bash
docker exec -it mycontainer sh # 进入容器并执行 sh
docker exec mycontainer ls /app # 在容器中执行命令
docker exec -u root mycontainer bash # 以 root 用户进入
参数:
- -i, –interactive: 保持 STDIN 打开
- -t, –tty: 分配伪终端
- -u, –user: 指定用户
- -e, –env: 设置环境变量
注意: docker exec 用于运行中的容器,docker run 用于创建新容器
7. 查看容器详情
docker inspect <容器名或ID>
示例:
docker inspect mycontainer
docker inspect –format='{{.NetworkSettings.IPAddress}}' mycontainer
docker inspect –format='{{json .Config}}' mycontainer
# 查看容器 IP 地址(常用)
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mycontainer
# 查看容器状态
docker inspect –format='{{.State.Status}}' mycontainer
# 查看容器挂载点
docker inspect –format='{{json .Mounts}}' mycontainer
8. 查看容器资源使用
docker stats
docker stats <容器名或ID>
参数:
docker stats –no-stream # 只显示一次,不持续更新
docker stats –format "table {{.Container}}\\t{{.CPUPerc}}\\t{{.MemUsage}}"
11. 查看容器进程
docker top <容器名或ID>
示例:
docker top mycontainer
docker top mycontainer -aux # 显示详细信息
12. 查看容器事件
docker events
docker events –filter container=<容器名>
13. 等待容器退出
docker wait <容器名或ID>
14. 更新容器配置
docker update [选项] <容器名或ID>
示例:
docker update –memory="512m" mycontainer
docker update –cpus="1.0" mycontainer
docker update –restart=always mycontainer
9. 复制文件
# 从容器复制到主机
docker cp <容器名或ID>:<容器路径> <主机路径>
# 从主机复制到容器
docker cp <主机路径> <容器名或ID>:<容器路径>
示例:
docker cp mycontainer:/app/config.json ./config.json
docker cp ./file.txt mycontainer:/app/file.txt
10. 导出/导入容器
# 导出容器为 tar 文件
docker export -o <文件名>.tar <容器名或ID>
# 导入容器(会创建镜像)
docker import <文件名>.tar <镜像名>:<标签>
示例:
docker export -o mycontainer.tar mycontainer
docker import mycontainer.tar myimage:v1.0
数据卷相关命令
1. 创建数据卷
docker volume create <卷名>
示例:
docker volume create myvolume
docker volume create –driver local myvolume
2. 列出数据卷
docker volume ls
3. 查看数据卷详情
docker volume inspect <卷名>
4. 删除数据卷
docker volume rm <卷名>
docker volume prune # 删除未使用的数据卷
网络相关命令
1. 创建网络
docker network create <网络名>
示例:
docker network create mynetwork
docker network create –driver bridge mynetwork
docker network create –subnet=192.168.0.0/16 mynetwork
2. 列出网络
docker network ls
3. 查看网络详情
docker network inspect <网络名>
4. 连接/断开容器到网络
docker network connect <网络名> <容器名>
docker network disconnect <网络名> <容器名>
5. 删除网络
docker network rm <网络名>
docker network prune # 删除未使用的网络
清理命令
# 清理未使用的数据
docker system prune
# 清理所有未使用的镜像、容器、网络和数据卷
docker system prune -a
# 清理未使用的镜像
docker image prune
# 清理未使用的容器
docker container prune
# 清理未使用的数据卷
docker volume prune
# 清理未使用的网络
docker network prune
参数:
- -a, –all: 清理所有未使用的资源
- -f, –force: 不提示确认
- –volumes: 同时清理数据卷
Dockerfile 编写
Dockerfile 指令
FROM
指定基础镜像
FROM ubuntu:20.04
FROM python:3.9-slim
FROM nginx:latest
RUN
执行命令
RUN apt-get update && apt-get install -y nginx
RUN pip install flask
RUN mkdir /app
COPY / ADD
复制文件
COPY app.py /app/
COPY requirements.txt /app/
ADD https://example.com/file.tar.gz /tmp/ # ADD 支持 URL
区别:
- COPY: 只能复制本地文件
- ADD: 支持 URL 和自动解压
WORKDIR
设置工作目录
WORKDIR /app
ENV
设置环境变量
ENV PYTHON_VERSION=3.9
ENV APP_HOME=/app
ENV PATH=$PATH:/app/bin
EXPOSE
声明端口
EXPOSE 80
EXPOSE 8080 443
CMD
容器启动时执行的命令(可被覆盖)
CMD ["nginx", "-g", "daemon off;"]
CMD ["python", "app.py"]
ENTRYPOINT
容器启动时执行的命令(不可被覆盖)
ENTRYPOINT ["nginx", "-g", "daemon off;"]
CMD vs ENTRYPOINT:
- CMD: 可被 docker run 的命令覆盖
- ENTRYPOINT: 不会被覆盖,docker run 的参数会追加
ARG
构建参数
ARG VERSION=latest
ARG USER=app
USER
指定运行用户
USER app
USER 1000:1000
VOLUME
创建数据卷
VOLUME ["/data"]
HEALTHCHECK
定义健康检查
# 方式1: 使用命令
HEALTHCHECK –interval=30s –timeout=3s –start-period=5s –retries=3 \\
CMD curl -f http://localhost/ || exit 1
# 方式2: 禁用健康检查
HEALTHCHECK NONE
参数说明:
- –interval: 检查间隔(默认 30s)
- –timeout: 超时时间(默认 3s)
- –start-period: 启动等待时间(默认 0s)
- –retries: 失败重试次数(默认 3)
LABEL
添加元数据标签
LABEL version="1.0"
LABEL description="My application"
LABEL maintainer="your.email@example.com"
ONBUILD
设置构建触发器
ONBUILD COPY . /app
ONBUILD RUN npm install
.dockerignore 文件
类似于 .gitignore,用于排除不需要的文件,减小构建上下文。
示例 .dockerignore:
node_modules
npm-debug.log
.git
.gitignore
.env
*.md
.DS_Store
dist
build
*.log
多阶段构建
多阶段构建可以减小最终镜像体积,只保留运行时需要的文件。
示例:
# 第一阶段:构建阶段
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 第二阶段:运行阶段
FROM node:16-alpine
WORKDIR /app
# 从构建阶段复制构建产物
COPY –from=builder /app/dist ./dist
COPY –from=builder /app/node_modules ./node_modules
COPY –from=builder /app/package*.json ./
EXPOSE 3000
CMD ["node", "dist/server.js"]
Python 多阶段构建示例:
# 构建阶段
FROM python:3.9-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install –user -r requirements.txt
# 运行阶段
FROM python:3.9-slim
WORKDIR /app
# 从构建阶段复制已安装的包
COPY –from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
EXPOSE 8000
CMD ["python", "app.py"]
Dockerfile 示例
Python 应用示例
# 使用 Python 3.9 作为基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 设置环境变量
ENV PYTHONUNBUFFERED=1
# 复制依赖文件
COPY requirements.txt .
# 安装依赖
RUN pip install –no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["python", "app.py"]
Node.js 应用示例
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install –production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Nginx 示例
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY html/ /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Docker Compose
什么是 Docker Compose?
Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。
注意: Docker Compose 有两个版本:
- V1: 使用 docker-compose 命令(带连字符)
- V2: 使用 docker compose 命令(不带连字符,作为 Docker CLI 插件)
Docker Desktop 默认包含 V2 版本。如果系统同时安装了 V1 和 V2,V2 优先。
docker-compose.yml 示例
注意: Docker Compose V2 不再需要 version 字段(V1 需要)。以下示例兼容两种版本:
# version: '3.8' # V2 中可选,V1 中必需
services:
web:
image: nginx:alpine
ports:
– "8080:80"
volumes:
– ./html:/usr/share/nginx/html
networks:
– mynetwork
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: mydb
volumes:
– db_data:/var/lib/mysql
networks:
– mynetwork
app:
build: .
ports:
– "5000:5000"
depends_on:
– db
networks:
– mynetwork
volumes:
db_data:
networks:
mynetwork:
driver: bridge
Docker Compose 常用命令
Docker Compose V2(推荐):
# 启动服务
docker compose up
docker compose up -d # 后台运行
# 停止服务
docker compose down
docker compose down -v # 同时删除数据卷
# 查看服务状态
docker compose ps
# 查看日志
docker compose logs
docker compose logs -f web # 跟踪特定服务日志
# 构建镜像
docker compose build
# 执行命令
docker compose exec web bash
# 重启服务
docker compose restart
# 扩展服务
docker compose up –scale web=3
# 查看配置
docker compose config
# 暂停/恢复服务
docker compose pause
docker compose unpause
Docker Compose V1(旧版本):
# 使用 docker-compose(带连字符)
docker-compose up
docker-compose down
docker-compose ps
# … 其他命令类似,只需将 docker compose 替换为 docker-compose
提示: 如果 docker compose 命令不可用,可以安装 Docker Compose V2 或使用 V1 版本的 docker-compose 命令。
实用技巧与调试
查看容器 IP 地址
# 方法1: 使用 inspect(推荐)
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <容器名>
# 方法2: 格式化输出
docker inspect –format='{{.NetworkSettings.IPAddress}}' <容器名>
# 方法3: 查看网络详情
docker network inspect bridge | grep -A 5 <容器名>
调试容器问题
# 1. 查看容器日志
docker logs <容器名>
docker logs -f <容器名> # 实时跟踪
# 2. 进入容器调试
docker exec -it <容器名> /bin/bash
docker exec -it <容器名> /bin/sh # 如果 bash 不可用
# 3. 以前台模式运行查看错误
docker run <镜像名> # 不使用 -d 参数
# 4. 检查容器状态
docker ps -a
docker inspect <容器名>
# 5. 查看容器资源使用
docker stats <容器名>
# 6. 查看容器进程
docker top <容器名>
# 7. 查看容器事件
docker events –filter container=<容器名>
常用调试命令组合
# 快速查看容器信息
docker ps –format "table {{.Names}}\\t{{.Status}}\\t{{.Ports}}"
# 查看所有容器的 IP
docker ps -q | xargs -I {} docker inspect -f '{{.Name}} – {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' {}
# 清理所有停止的容器
docker container prune -f
# 查看镜像大小排序
docker images –format "table {{.Repository}}\\t{{.Tag}}\\t{{.Size}}" | sort -k3 -h
# 查看容器启动时间
docker ps -a –format "table {{.Names}}\\t{{.Status}}\\t{{.CreatedAt}}"
网络调试
# 测试容器间网络连通性
docker exec <容器1> ping <容器2的IP或名称>
# 查看容器网络配置
docker network inspect <网络名>
# 查看容器端口映射
docker port <容器名>
# 测试端口是否开放
docker exec <容器名> nc -zv localhost <端口>
数据卷调试
# 查看数据卷使用情况
docker system df -v
# 查看数据卷内容(需要进入容器)
docker run –rm -v <卷名>:/data alpine ls -la /data
# 备份数据卷
docker run –rm -v <卷名>:/data -v $(pwd):/backup alpine tar czf /backup/backup.tar.gz /data
# 恢复数据卷
docker run –rm -v <卷名>:/data -v $(pwd):/backup alpine tar xzf /backup/backup.tar.gz -C /data
实际应用场景
场景 1: 运行 Web 服务器
# 运行 Nginx
docker run -d -p 80:80 –name mynginx nginx
# 访问 http://localhost
场景 2: 运行数据库
# 运行 MySQL
docker run -d \\
–name mysql \\
-e MYSQL_ROOT_PASSWORD=123456 \\
-e MYSQL_DATABASE=testdb \\
-p 3306:3306 \\
-v mysql_data:/var/lib/mysql \\
–restart=unless-stopped \\
mysql:8.0
# 运行 PostgreSQL
docker run -d \\
–name postgres \\
-e POSTGRES_PASSWORD=123456 \\
-e POSTGRES_DB=testdb \\
-p 5432:5432 \\
-v postgres_data:/var/lib/postgresql/data \\
–restart=unless-stopped \\
postgres:14
# 运行 Redis
docker run -d \\
–name redis \\
-p 6379:6379 \\
-v redis_data:/data \\
–restart=unless-stopped \\
redis:7-alpine
场景 3: 运行 Python 应用
# 构建镜像
docker build -t myapp:1.0 .
# 运行容器
# Linux/macOS:
docker run -d \\
–name myapp \\
-p 5000:5000 \\
-v $(pwd)/app:/app \\
myapp:1.0
# Windows PowerShell:
docker run -d `
–name myapp `
-p 5000:5000 `
-v ${PWD}/app:/app `
myapp:1.0
# Windows CMD:
docker run -d ^
–name myapp ^
-p 5000:5000 ^
-v %cd%/app:/app ^
myapp:1.0
场景 4: 开发环境
# Linux/macOS:
docker run -it \\
–name dev \\
-v $(pwd):/workspace \\
-w /workspace \\
python:3.9 bash
# Windows PowerShell:
docker run -it `
–name dev `
-v ${PWD}:/workspace `
-w /workspace `
python:3.9 bash
常见问题与解决方案
1. 容器无法启动
问题: 容器启动后立即退出
解决方案:
# 查看日志
docker logs <容器名>
# 检查容器状态
docker ps -a
# 以前台模式运行查看错误
docker run <镜像名>
2. 端口被占用
问题: Error: bind: address already in use
解决方案:
# 更改端口映射
docker run -p 8080:80 nginx
# 或停止占用端口的容器
docker stop <容器名>
3. 权限问题
问题: 容器内无法写入文件
解决方案:
# 使用 root 用户运行
docker run -u root <镜像名>
# 或修改文件权限
docker exec -u root <容器名> chown -R user:user /path
4. 数据持久化
问题: 容器删除后数据丢失
解决方案:
# 使用数据卷
docker run -v myvolume:/data <镜像名>
# 使用绑定挂载
docker run -v /host/path:/container/path <镜像名>
5. 网络连接问题
问题: 容器无法访问其他容器
解决方案:
# 使用自定义网络
docker network create mynetwork
docker run –network mynetwork <镜像名>
# 使用 Docker Compose(推荐)
6. 镜像拉取慢
问题: 从 Docker Hub 拉取镜像很慢
解决方案:
Windows (Docker Desktop):
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
Linux: 编辑 /etc/docker/daemon.json(不存在则创建):
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
然后重启 Docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
macOS (Docker Desktop): 同 Windows 配置方法
验证配置:
docker info | grep -A 10 "Registry Mirrors"
7. 清理磁盘空间
问题: Docker 占用磁盘空间过大
解决方案:
# 查看磁盘使用情况
docker system df
docker system df -v # 详细显示
# 清理未使用的资源
docker system prune # 清理未使用的容器、网络、镜像(悬空镜像)
docker system prune -a # 清理所有未使用的镜像
docker system prune -a –volumes # 同时清理数据卷
# 清理特定资源
docker image prune -a # 清理所有未使用的镜像
docker container prune # 清理所有已停止的容器
docker volume prune # 清理未使用的数据卷
docker network prune # 清理未使用的网络
docker builder prune # 清理构建缓存
8. 容器无法访问外部网络
问题: 容器内无法访问互联网
解决方案:
# 检查网络配置
docker network inspect bridge
# 使用主机网络(Linux)
docker run –network host <镜像名>
# 检查 DNS 配置
docker run –dns 8.8.8.8 <镜像名>
9. 容器内时区不正确
问题: 容器内时间与主机不一致
解决方案:
# 方法1: 挂载时区文件
docker run -v /etc/localtime:/etc/localtime:ro <镜像名>
# 方法2: 设置环境变量
docker run -e TZ=Asia/Shanghai <镜像名>
# 方法3: 在 Dockerfile 中设置
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
10. 查看容器 IP 地址
问题: 需要获取容器的 IP 地址
解决方案:
# 方法1: 使用 inspect
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <容器名>
# 方法2: 使用 inspect 格式化输出
docker inspect –format='{{.NetworkSettings.IPAddress}}' <容器名>
# 方法3: 查看网络详情
docker network inspect bridge
最佳实践
1. 镜像优化
- 使用 .dockerignore 排除不需要的文件,减小构建上下文
- 使用多阶段构建 减小镜像体积,只保留运行时需要的文件
- 使用 Alpine 或 Slim 版本 的基础镜像,减小镜像大小
- 合并 RUN 命令 减少镜像层数,例如:# 不好
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get clean# 好
RUN apt-get update && \\
apt-get install -y nginx && \\
apt-get clean && \\
rm -rf /var/lib/apt/lists/* - 按需安装依赖 只安装应用运行所需的包
- 清理缓存和临时文件 在同一个 RUN 命令中完成
- 使用特定版本标签 避免使用 latest 标签,确保构建可重现
2. 安全建议
- 不要以 root 用户运行容器
- 定期更新基础镜像
- 扫描镜像漏洞
- 使用最小权限原则
3. 性能优化
- 合理设置资源限制 使用 –memory 和 –cpus 限制容器资源
- 使用数据卷而非绑定挂载(生产环境)提高 I/O 性能
- 使用健康检查 确保容器正常运行,自动重启异常容器
- 合理使用缓存 将变化频率低的层放在前面,利用 Docker 层缓存
- 使用 .dockerignore 减小构建上下文,加快构建速度
- 多阶段构建 减小最终镜像体积,加快拉取和启动速度
- 使用构建缓存 合理组织 Dockerfile,最大化利用缓存
4. 开发建议
- 使用 Docker Compose 管理多容器应用,简化开发环境
- 使用环境变量管理配置 通过 .env 文件或环境变量传递配置
- 使用命名卷而非匿名卷 便于管理和备份
- 编写清晰的 Dockerfile 添加注释,说明每个步骤的作用
- 使用健康检查 确保服务正常运行
- 版本控制 为镜像打上版本标签,便于回滚
- 日志管理 使用日志驱动,集中管理容器日志
- 开发时使用绑定挂载 方便代码热更新;生产环境使用数据卷
学习路径建议
入门阶段
进阶阶段
高级阶段
常用命令速查表
镜像操作
docker pull <镜像> # 拉取镜像
docker images # 列出镜像
docker rmi <镜像> # 删除镜像
docker build -t <镜像> . # 构建镜像
docker tag <源> <新> # 标记镜像
docker save -o <文件> <镜像> # 导出镜像
docker load -i <文件> # 导入镜像
容器操作
docker run [选项] <镜像> # 运行容器
docker ps # 列出容器
docker start <容器> # 启动容器
docker stop <容器> # 停止容器
docker restart <容器> # 重启容器
docker rm <容器> # 删除容器
docker logs <容器> # 查看日志
docker exec -it <容器> bash # 进入容器
docker inspect <容器> # 查看详情
docker cp <源> <目标> # 复制文件
数据卷操作
docker volume create <卷> # 创建数据卷
docker volume ls # 列出数据卷
docker volume rm <卷> # 删除数据卷
docker volume inspect <卷> # 查看详情
网络操作
docker network create <网络> # 创建网络
docker network ls # 列出网络
docker network inspect <网络> # 查看详情
docker network rm <网络> # 删除网络
清理操作
docker system prune # 清理未使用的资源
docker system df # 查看磁盘使用
总结
Docker 是一个强大的容器化工具,掌握它需要:
持续练习和实践是掌握 Docker 的关键!
Docker 官方文档:https://docs.docker.com/




