news 2026/3/16 5:57:34

Docker 从入门到精通教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Docker 从入门到精通教程

Docker 从入门到精通教程

目录

  1. Docker 简介
  2. Docker 核心概念
  3. Docker 安装
  4. Docker 基础命令
  5. Docker 常用命令详解
  6. Dockerfile 编写
  7. Docker Compose
  8. 实际应用场景
  9. 常见问题与解决方案
  10. 最佳实践
  11. 学习路径建议
  12. 常用命令速查表

Docker 简介

什么是 Docker?

Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中。容器可以在任何支持 Docker 的环境中运行,确保应用程序在不同环境中表现一致。

Docker 的优势

  • 轻量级:容器共享主机操作系统内核,比虚拟机更轻量
  • 可移植性:一次构建,到处运行
  • 隔离性:容器之间相互隔离,互不影响
  • 快速部署:秒级启动,快速扩展
  • 版本控制:可以像代码一样管理容器镜像

Docker 核心概念

1. 镜像(Image)

镜像是一个只读的模板,用于创建容器。可以理解为容器的"蓝图"。

  • 类比:镜像 = 类(Class),容器 = 实例(Instance)

2. 容器(Container)

容器是镜像的运行实例。容器可以被创建、启动、停止、删除。

  • 类比:容器 = 运行中的虚拟机(但更轻量)

3. 仓库(Repository)

仓库是存储镜像的地方,类似于 Git 仓库。

  • Docker Hub:官方的公共仓库
  • 私有仓库:可以搭建自己的私有仓库

4. Dockerfile

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


Docker 安装

Windows 安装

  1. 下载 Docker Desktop for Windows
  2. 运行安装程序
  3. 重启计算机
  4. 启动 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-plugin

CentOS/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 dockersudosystemctlenabledocker

macOS 安装

  1. 下载 Docker Desktop for Mac
  2. 运行安装程序
  3. 启动 Docker Desktop

验证安装

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.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: 镜像 ID
  • CREATED: 创建时间
  • 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.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 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: 限制 CPU

    docker 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: 容器 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 -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}}'mycontainer
8. 查看容器资源使用
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 mycontainer
9. 复制文件
# 从容器复制到主机dockercp<容器名或ID>:<容器路径><主机路径># 从主机复制到容器dockercp<主机路径><容器名或ID>:<容器路径>

示例:

dockercpmycontainer:/app/config.json ./config.json dockercp./file.txt mycontainer:/app/file.txt
10. 导出/导入容器
# 导出容器为 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 --driverlocalmyvolume
2. 列出数据卷
docker volumels
3. 查看数据卷详情
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 mynetwork
2. 列出网络
docker networkls
3. 查看网络详情
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: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: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:bridge

Docker 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 unpause

Docker 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 /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):

  1. 打开 Docker Desktop
  2. 进入 Settings → Docker Engine
  3. 添加镜像加速器配置:
{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com","https://mirror.baidubce.com"]}
  1. 点击 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 docker

macOS (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/timezone

10. 查看容器 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添加注释,说明每个步骤的作用
  • 使用健康检查确保服务正常运行
  • 版本控制为镜像打上版本标签,便于回滚
  • 日志管理使用日志驱动,集中管理容器日志
  • 开发时使用绑定挂载方便代码热更新;生产环境使用数据卷

学习路径建议

入门阶段

  1. 理解 Docker 基本概念
  2. 学会拉取和运行镜像
  3. 掌握常用命令(run, ps, stop, rm, logs)
  4. 学会端口映射和数据卷挂载

进阶阶段

  1. 学习编写 Dockerfile
  2. 理解镜像构建过程
  3. 掌握 Docker Compose
  4. 学习网络和数据卷管理

高级阶段

  1. 多阶段构建
  2. 镜像优化
  3. 容器编排(Kubernetes)
  4. CI/CD 集成
  5. 监控和日志管理

常用命令速查表

镜像操作

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 是一个强大的容器化工具,掌握它需要:

  1. 理解核心概念:镜像、容器、仓库、Dockerfile
  2. 熟练使用命令:run, ps, exec, logs, build 等
  3. 掌握参数含义:-d, -it, -p, -v, -e 等
  4. 编写 Dockerfile:构建自己的镜像
  5. 使用 Docker Compose:管理多容器应用
  6. 实践项目:在实际项目中应用

持续练习和实践是掌握 Docker 的关键!


Docker 官方文档:https://docs.docker.com/

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/12 22:52:39

手工制造火箭的可行性

手工制造火箭的可行性分析1. 基础物理原理火箭推进依赖于牛顿第三定律&#xff0c;其推力$F$由喷气反作用力提供&#xff1a; $$ F \dot{m} v_e $$ 其中$\dot{m}$为质量流率&#xff08;kg/s&#xff09;&#xff0c;$v_e$为排气速度&#xff08;m/s&#xff09;。实际推力需考…

作者头像 李华
网站建设 2026/3/15 22:47:55

LobeChat本地安装详细教程

LobeChat 本地部署实战指南&#xff1a;从零搭建私有 AI 聊天平台 在大模型应用日益普及的今天&#xff0c;越来越多开发者和企业开始关注一个问题&#xff1a;如何在保障数据隐私的前提下&#xff0c;构建一个功能强大又易于使用的 AI 对话系统&#xff1f;市面上虽然有不少现…

作者头像 李华
网站建设 2026/3/15 14:44:51

别再重复造轮子!ZGI 资源广场让企业 AI 应用开发效率翻倍

“这个月要同时推进三个 AI 项目&#xff1a;HR 的员工入职问答助手、电商部门的售后智能客服、生产部的设备故障诊断系统&#xff0c;就我们两个人手&#xff0c;怎么可能按时完成&#xff1f;” 这是很多中小型企业开发者经常面临的困境。更让人无奈的是&#xff0c;每个项目…

作者头像 李华
网站建设 2026/3/14 5:03:46

LangGraph工作流转换为LangFlow可视化实践

LangGraph工作流转换为LangFlow可视化实践 在构建AI驱动的应用时&#xff0c;我们常常面临一个两难&#xff1a;一方面希望借助代码实现灵活、可追踪的复杂逻辑&#xff08;如使用LangGraph定义状态机&#xff09;&#xff0c;另一方面又渴望通过拖拽式界面快速验证想法、降低…

作者头像 李华
网站建设 2026/3/13 1:19:35

TCP/UDP协议

目录 TCP协议 特点 适用场景 缺点 UDP协议 特点 适用场景 缺点 对比总结 TCP连接 TCP建立连接的过程称为三次握手 ​​ TCP断开连接的四次挥手​编辑 常用的TCP端口号及其功能 TCP协议 TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向…

作者头像 李华
网站建设 2026/3/16 0:25:53

Qwen3-VL-30B-FP8:高性能多模态模型量化新突破

Qwen3-VL-30B-FP8&#xff1a;高性能多模态模型量化新突破 在AI系统向真实世界任务深度渗透的今天&#xff0c;如何让庞大的视觉语言模型&#xff08;VLM&#xff09;走出实验室、真正落地于高并发、低延迟的生产环境&#xff0c;成为开发者面临的核心挑战。参数动辄百亿级的多…

作者头像 李华