Docker 从入门到精通教程
目录
- Docker 简介
- Docker 核心概念
- Docker 安装
- Docker 基础命令
- Docker 常用命令详解
- Dockerfile 编写
- Docker Compose
- 实际应用场景
- 常见问题与解决方案
- 最佳实践
- 学习路径建议
- 常用命令速查表
Docker 简介
什么是 Docker?
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中。容器可以在任何支持 Docker 的环境中运行,确保应用程序在不同环境中表现一致。
Docker 的优势
- 轻量级:容器共享主机操作系统内核,比虚拟机更轻量
- 可移植性:一次构建,到处运行
- 隔离性:容器之间相互隔离,互不影响
- 快速部署:秒级启动,快速扩展
- 版本控制:可以像代码一样管理容器镜像
Docker 核心概念
1. 镜像(Image)
镜像是一个只读的模板,用于创建容器。可以理解为容器的"蓝图"。
- 类比:镜像 = 类(Class),容器 = 实例(Instance)
2. 容器(Container)
容器是镜像的运行实例。容器可以被创建、启动、停止、删除。
- 类比:容器 = 运行中的虚拟机(但更轻量)
3. 仓库(Repository)
仓库是存储镜像的地方,类似于 Git 仓库。
- Docker Hub:官方的公共仓库
- 私有仓库:可以搭建自己的私有仓库
4. Dockerfile
Dockerfile 是一个文本文件,包含构建镜像的指令。
Docker 安装
Windows 安装
- 下载 Docker Desktop for Windows
- 运行安装程序
- 重启计算机
- 启动 Docker Desktop
Linux 安装
Ubuntu/Debian:
# 更新包索引sudoapt-getupdate# 安装依赖sudoapt-getinstall-y ca-certificatescurlgnupg lsb-release# 添加 Docker 官方 GPG 密钥sudomkdir-p /etc/apt/keyringscurl-fsSL https://download.docker.com/linux/ubuntu/gpg|sudogpg --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"|sudotee/etc/apt/sources.list.d/docker.list>/dev/null# 安装 Docker Enginesudoapt-getupdatesudoapt-getinstall-y docker-ce docker-ce-cli containerd.io docker-compose-pluginCentOS/RHEL:
# 安装 yum-utilssudoyuminstall-y yum-utils# 添加 Docker 仓库sudoyum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 安装 Docker Enginesudoyuminstall-y docker-ce docker-ce-cli containerd.io docker-compose-plugin# 启动 Dockersudosystemctl start dockersudosystemctlenabledockermacOS 安装
- 下载 Docker Desktop for Mac
- 运行安装程序
- 启动 Docker Desktop
验证安装
docker --version docker info docker compose version# Docker Compose V2Docker 基础命令
系统信息命令
# 查看 Docker 版本docker --version docker version# 查看 Docker 系统信息docker info# 查看 Docker 帮助docker --help docker<command>--helpDocker 常用命令详解
镜像相关命令
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.04docker pull python:3.9-slim# 拉取 Python 3.9 精简版常用镜像标签:
latest: 最新版本(默认)alpine: 基于 Alpine Linux,体积小slim: 精简版- 版本号:如
1.21,3.9
3. 列出本地镜像
docker images docker imagels参数:
docker images -a# 显示所有镜像(包括中间层)docker images --digests# 显示摘要信息docker images --format"table {{.Repository}}\t{{.Tag}}\t{{.Size}}"docker images --filter"dangling=true"# 显示悬空镜像输出说明:
REPOSITORY: 仓库名TAG: 标签(版本)IMAGE ID: 镜像 IDCREATED: 创建时间SIZE: 镜像大小
4. 删除镜像
docker rmi<镜像名或ID>docker imagerm<镜像名或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. 查看镜像历史
dockerhistory<镜像名或ID>7. 标记镜像
docker tag<源镜像><新镜像名>:<标签>示例:
docker tag nginx:latest mynginx:v1.08. 导出/导入镜像
# 导出镜像为 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 ubuntubash# 交互式运行docker run --name mynginx nginx# 指定容器名称常用参数详解:
基础参数
-d, --detach: 后台运行容器docker run -d nginx-i, --interactive: 保持 STDIN 打开,即使没有附加docker run -i ubuntubash-t, --tty: 分配一个伪终端docker run -t ubuntubash通常
-it一起使用,用于交互式容器:docker run -it ubuntubash--name: 指定容器名称docker run --name mycontainer nginx--rm: 容器退出时自动删除docker run --rm nginx
端口映射
-p, --publish: 映射容器端口到主机端口# 格式:主机端口:容器端口docker run -p8080:80 nginx# 主机8080 -> 容器80docker run -p127.0.0.1:8080:80 nginx# 只绑定本地docker run -p80:80 -p443: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 -eMYSQL_ROOT_PASSWORD=123456mysql docker run -eVAR1=value1 -eVAR2=value2 nginx# 从文件读取环境变量docker run --env-file .env nginx
网络设置
--network: 指定网络docker run --network bridge nginx# 桥接网络(默认)docker run --networkhostnginx# 主机网络docker run --network none nginx# 无网络docker run --network mynetwork nginx# 自定义网络
资源限制
--memory或-m: 限制内存docker run -m 512m nginx# 限制 512MBdocker run --memory="1g"nginx# 限制 1GB--cpus: 限制 CPUdocker run --cpus="1.5"nginx# 限制 1.5 个 CPUdocker run --cpus="0.5"nginx# 限制 0.5 个 CPU--cpu-shares: CPU 权重(相对值)docker run --cpu-shares=512nginx
其他常用参数
--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 -u1000:1000 nginx docker run -u root nginx--entrypoint: 覆盖入口点docker run --entrypoint /bin/bash nginx--link: 链接到其他容器(已废弃,建议使用网络)docker run --link mysql:db nginx
2. 列出容器
dockerps# 运行中的容器dockerps-a# 所有容器(包括已停止)docker containerls# 同上参数:
dockerps-q# 只显示容器 IDdockerps--format"table {{.ID}}\t{{.Names}}\t{{.Status}}"dockerps--filter"status=exited"# 过滤已退出的容器dockerps--filter"name=nginx"# 按名称过滤输出说明:
CONTAINER ID: 容器 IDIMAGE: 使用的镜像COMMAND: 执行的命令CREATED: 创建时间STATUS: 状态PORTS: 端口映射NAMES: 容器名称
3. 启动/停止/重启容器
docker start<容器名或ID># 启动已停止的容器docker stop<容器名或ID># 停止运行中的容器docker restart<容器名或ID># 重启容器docker pause<容器名或ID># 暂停容器docker unpause<容器名或ID># 恢复暂停的容器参数:
docker stop -t10<容器># 等待 10 秒后强制停止4. 删除容器
dockerrm<容器名或ID>docker containerrm<容器名或ID>示例:
dockerrmmycontainer dockerrm-f mycontainer# 强制删除运行中的容器dockerrm$(dockerps-aq)# 删除所有已停止的容器参数:
-f, --force: 强制删除运行中的容器-v, --volumes: 同时删除关联的数据卷
5. 查看容器日志
docker logs<容器名或ID>参数:
docker logs -f mycontainer# 跟踪日志输出(类似 tail -f)docker logs --tail100mycontainer# 显示最后 100 行docker logs --since 10m mycontainer# 显示最近 10 分钟的日志docker logs --until2023-01-01T00:00:00 mycontainer docker logs -t mycontainer# 显示时间戳6. 进入运行中的容器
dockerexec[选项]<容器名或ID><命令>示例:
dockerexec-it mycontainerbash# 进入容器并执行 bashdockerexec-it mycontainersh# 进入容器并执行 shdockerexecmycontainerls/app# 在容器中执行命令dockerexec-u root mycontainerbash# 以 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}}'mycontainer8. 查看容器资源使用
docker stats docker stats<容器名或ID>参数:
docker stats --no-stream# 只显示一次,不持续更新docker stats --format"table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"11. 查看容器进程
dockertop<容器名或ID>示例:
dockertopmycontainer dockertopmycontainer -aux# 显示详细信息12. 查看容器事件
docker events docker events --filtercontainer=<容器名>13. 等待容器退出
dockerwait<容器名或ID>14. 更新容器配置
docker update[选项]<容器名或ID>示例:
docker update --memory="512m"mycontainer docker update --cpus="1.0"mycontainer docker update --restart=always mycontainer9. 复制文件
# 从容器复制到主机dockercp<容器名或ID>:<容器路径><主机路径># 从主机复制到容器dockercp<主机路径><容器名或ID>:<容器路径>示例:
dockercpmycontainer:/app/config.json ./config.json dockercp./file.txt mycontainer:/app/file.txt10. 导出/导入容器
# 导出容器为 tar 文件dockerexport-o<文件名>.tar<容器名或ID># 导入容器(会创建镜像)dockerimport<文件名>.tar<镜像名>:<标签>示例:
dockerexport-o mycontainer.tar mycontainer dockerimportmycontainer.tar myimage:v1.0数据卷相关命令
1. 创建数据卷
docker volume create<卷名>示例:
docker volume create myvolume docker volume create --driverlocalmyvolume2. 列出数据卷
docker volumels3. 查看数据卷详情
docker volume inspect<卷名>4. 删除数据卷
docker volumerm<卷名>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 mynetwork2. 列出网络
docker networkls3. 查看网络详情
docker network inspect<网络名>4. 连接/断开容器到网络
docker network connect<网络名><容器名>docker network disconnect<网络名><容器名>5. 删除网络
docker networkrm<网络名>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:latestRUN
执行命令
RUN apt-get update && apt-get install -y nginx RUN pip install flask RUN mkdir /appCOPY / ADD
复制文件
COPY app.py /app/ COPY requirements.txt /app/ ADD https://example.com/file.tar.gz /tmp/ # ADD 支持 URL区别:
COPY: 只能复制本地文件ADD: 支持 URL 和自动解压
WORKDIR
设置工作目录
WORKDIR /appENV
设置环境变量
ENV PYTHON_VERSION=3.9 ENV APP_HOME=/app ENV PATH=$PATH:/app/binEXPOSE
声明端口
EXPOSE 80 EXPOSE 8080 443CMD
容器启动时执行的命令(可被覆盖)
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=appUSER
指定运行用户
USER app USER 1000:1000VOLUME
创建数据卷
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:alpineports:-"8080:80"volumes:-./html:/usr/share/nginx/htmlnetworks:-mynetworkdb:image:mysql:8.0environment:MYSQL_ROOT_PASSWORD:rootpasswordMYSQL_DATABASE:mydbvolumes:-db_data:/var/lib/mysqlnetworks:-mynetworkapp:build:.ports:-"5000:5000"depends_on:-dbnetworks:-mynetworkvolumes:db_data:networks:mynetwork:driver:bridgeDocker Compose 常用命令
Docker Compose V2(推荐):
# 启动服务docker compose up docker compose up -d# 后台运行# 停止服务docker compose down docker compose down -v# 同时删除数据卷# 查看服务状态docker composeps# 查看日志docker compose logs docker compose logs -f web# 跟踪特定服务日志# 构建镜像docker compose build# 执行命令docker composeexecwebbash# 重启服务docker compose restart# 扩展服务docker compose up --scaleweb=3# 查看配置docker compose config# 暂停/恢复服务docker compose pause docker compose unpauseDocker Compose V1(旧版本):
# 使用 docker-compose(带连字符)docker-compose up docker-compose down docker-composeps# ... 其他命令类似,只需将 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-A5<容器名>调试容器问题
# 1. 查看容器日志docker logs<容器名>docker logs -f<容器名># 实时跟踪# 2. 进入容器调试dockerexec-it<容器名>/bin/bash dockerexec-it<容器名>/bin/sh# 如果 bash 不可用# 3. 以前台模式运行查看错误docker run<镜像名># 不使用 -d 参数# 4. 检查容器状态dockerps-a docker inspect<容器名># 5. 查看容器资源使用docker stats<容器名># 6. 查看容器进程dockertop<容器名># 7. 查看容器事件docker events --filtercontainer=<容器名>常用调试命令组合
# 快速查看容器信息dockerps--format"table {{.Names}}\t{{.Status}}\t{{.Ports}}"# 查看所有容器的 IPdockerps-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# 查看容器启动时间dockerps-a --format"table {{.Names}}\t{{.Status}}\t{{.CreatedAt}}"网络调试
# 测试容器间网络连通性dockerexec<容器1>ping<容器2的IP或名称># 查看容器网络配置docker network inspect<网络名># 查看容器端口映射docker port<容器名># 测试端口是否开放dockerexec<容器名>nc-zv localhost<端口>数据卷调试
# 查看数据卷使用情况docker systemdf-v# 查看数据卷内容(需要进入容器)docker run --rm -v<卷名>:/data alpinels-la /data# 备份数据卷docker run --rm -v<卷名>:/data -v$(pwd):/backup alpinetarczf /backup/backup.tar.gz /data# 恢复数据卷docker run --rm -v<卷名>:/data -v$(pwd):/backup alpinetarxzf /backup/backup.tar.gz -C /data实际应用场景
场景 1: 运行 Web 服务器
# 运行 Nginxdocker run -d -p80:80 --name mynginx nginx# 访问 http://localhost场景 2: 运行数据库
# 运行 MySQLdocker run -d\--name mysql\-eMYSQL_ROOT_PASSWORD=123456\-eMYSQL_DATABASE=testdb\-p3306:3306\-v mysql_data:/var/lib/mysql\--restart=unless-stopped\mysql:8.0# 运行 PostgreSQLdocker run -d\--name postgres\-ePOSTGRES_PASSWORD=123456\-ePOSTGRES_DB=testdb\-p5432:5432\-v postgres_data:/var/lib/postgresql/data\--restart=unless-stopped\postgres:14# 运行 Redisdocker run -d\--name redis\-p6379: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\-p5000:5000\-v$(pwd)/app:/app\myapp:1.0# Windows PowerShell:docker run -d`--name myapp`-p5000:5000`-v ${PWD}/app:/app`myapp:1.0# Windows CMD:docker run -d ^ --name myapp ^ -p5000:5000 ^ -v %cd%/app:/app ^ myapp:1.0场景 4: 开发环境
# Linux/macOS:docker run -it\--name dev\-v$(pwd):/workspace\-w /workspace\python:3.9bash# Windows PowerShell:docker run -it`--name dev`-v${PWD}:/workspace`-w /workspace`python:3.9bash常见问题与解决方案
1. 容器无法启动
问题:容器启动后立即退出
解决方案:
# 查看日志docker logs<容器名># 检查容器状态dockerps-a# 以前台模式运行查看错误docker run<镜像名>2. 端口被占用
问题:Error: bind: address already in use
解决方案:
# 更改端口映射docker run -p8080:80 nginx# 或停止占用端口的容器docker stop<容器名>3. 权限问题
问题:容器内无法写入文件
解决方案:
# 使用 root 用户运行docker run -u root<镜像名># 或修改文件权限dockerexec-u root<容器名>chown-R user:user /path4. 数据持久化
问题:容器删除后数据丢失
解决方案:
# 使用数据卷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):
- 打开 Docker Desktop
- 进入 Settings → Docker Engine
- 添加镜像加速器配置:
{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com","https://mirror.baidubce.com"]}- 点击 Apply & Restart
Linux:
编辑/etc/docker/daemon.json(不存在则创建):
{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com","https://mirror.baidubce.com"]}然后重启 Docker:
sudosystemctl daemon-reloadsudosystemctl restart dockermacOS (Docker Desktop):
同 Windows 配置方法
验证配置:
docker info|grep-A10"Registry Mirrors"7. 清理磁盘空间
问题:Docker 占用磁盘空间过大
解决方案:
# 查看磁盘使用情况docker systemdfdocker systemdf-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 --networkhost<镜像名># 检查 DNS 配置docker run --dns8.8.8.8<镜像名>9. 容器内时区不正确
问题:容器内时间与主机不一致
解决方案:
# 方法1: 挂载时区文件docker run -v /etc/localtime:/etc/localtime:ro<镜像名># 方法2: 设置环境变量docker run -eTZ=Asia/Shanghai<镜像名># 方法3: 在 Dockerfile 中设置ENVTZ=Asia/Shanghai RUNln-snf /usr/share/zoneinfo/$TZ/etc/localtime&&echo$TZ>/etc/timezone10. 查看容器 IP 地址
问题:需要获取容器的 IP 地址
解决方案:
# 方法1: 使用 inspectdocker 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 基本概念
- 学会拉取和运行镜像
- 掌握常用命令(run, ps, stop, rm, logs)
- 学会端口映射和数据卷挂载
进阶阶段
- 学习编写 Dockerfile
- 理解镜像构建过程
- 掌握 Docker Compose
- 学习网络和数据卷管理
高级阶段
- 多阶段构建
- 镜像优化
- 容器编排(Kubernetes)
- CI/CD 集成
- 监控和日志管理
常用命令速查表
镜像操作
docker pull<镜像># 拉取镜像docker images# 列出镜像docker rmi<镜像># 删除镜像docker build -t<镜像>.# 构建镜像docker tag<源><新># 标记镜像docker save -o<文件><镜像># 导出镜像docker load -i<文件># 导入镜像容器操作
docker run[选项]<镜像># 运行容器dockerps# 列出容器docker start<容器># 启动容器docker stop<容器># 停止容器docker restart<容器># 重启容器dockerrm<容器># 删除容器docker logs<容器># 查看日志dockerexec-it<容器>bash# 进入容器docker inspect<容器># 查看详情dockercp<源><目标># 复制文件数据卷操作
docker volume create<卷># 创建数据卷docker volumels# 列出数据卷docker volumerm<卷># 删除数据卷docker volume inspect<卷># 查看详情网络操作
docker network create<网络># 创建网络docker networkls# 列出网络docker network inspect<网络># 查看详情docker networkrm<网络># 删除网络清理操作
docker system prune# 清理未使用的资源docker systemdf# 查看磁盘使用总结
Docker 是一个强大的容器化工具,掌握它需要:
- 理解核心概念:镜像、容器、仓库、Dockerfile
- 熟练使用命令:run, ps, exec, logs, build 等
- 掌握参数含义:-d, -it, -p, -v, -e 等
- 编写 Dockerfile:构建自己的镜像
- 使用 Docker Compose:管理多容器应用
- 实践项目:在实际项目中应用
持续练习和实践是掌握 Docker 的关键!
Docker 官方文档:https://docs.docker.com/