欢迎光临
我们一直在努力

Docker 从入门到精通教程

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:

    # 更新包索引
    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 Desktop for Mac
  • 运行安装程序
  • 启动 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.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):

  • 打开 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:

    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 基本概念
  • 学会拉取和运行镜像
  • 掌握常用命令(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 [选项] <镜像> # 运行容器
    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 是一个强大的容器化工具,掌握它需要:

  • 理解核心概念:镜像、容器、仓库、Dockerfile
  • 熟练使用命令:run, ps, exec, logs, build 等
  • 掌握参数含义:-d, -it, -p, -v, -e 等
  • 编写 Dockerfile:构建自己的镜像
  • 使用 Docker Compose:管理多容器应用
  • 实践项目:在实际项目中应用
  • 持续练习和实践是掌握 Docker 的关键!


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

    赞(0)
    未经允许不得转载:171主机测评 » Docker 从入门到精通教程
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址