Files
virtualbox_client/docs/docker使用手册.md
T
2026-05-10 10:56:52 +08:00

17 KiB
Raw Permalink Blame History

Docker 使用手册

📖 目录


1. Docker 简介

Docker 是一个开源的应用容器引擎,让开发者可以打包应用及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 机器上。

核心优势

  • 轻量级:容器共享宿主机内核,无需虚拟化完整 OS
  • 快速启动:秒级启动,相比虚拟机分钟级启动更快
  • 环境一致:消除"在我机器上能跑"的问题
  • 高效资源:内存、硬盘、CPU 占用远小于虚拟机
  • 易于迁移:一次构建,随处运行

2. 安装 Docker

2.1 Ubuntu / Debian

# 更新软件包索引
sudo apt update

# 安装依赖
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# 添加 Docker 源
sudo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# 安装 Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

# 启动并设置开机自启
sudo systemctl enable docker
sudo systemctl start docker

# 将当前用户加入 docker 组(免 sudo 执行)
sudo usermod -aG docker $USER

2.2 CentOS / RHEL

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl enable docker
sudo systemctl start docker

2.3 macOS

下载 Docker Desktop for Mac

2.4 Windows

下载 Docker Desktop for Windows

2.5 验证安装

docker --version
docker run hello-world

3. Docker 基本概念

概念 说明
镜像(Image) 一个只读的模板,包含创建容器的说明
容器(Container) 镜像的运行实例,可被启动、停止、删除
仓库(Repository) 集中存放镜像的地方,如 Docker Hub
Dockerfile 自动化构建镜像的脚本文件
Volume 持久化存储数据卷
网络(Network) 容器间的通信通道

三者的关系

Dockerfile (构建) --> Image (镜像) --> run --> Container (容器)
                                  ↑
                            Docker Hub (仓库)

4. 镜像管理

4.1 搜索镜像

docker search nginx
docker search --filter stars=1000 ubuntu

4.2 拉取镜像

docker pull nginx:latest          # 拉取最新版
docker pull ubuntu:20.04          # 拉取指定标签
docker pull registry.cn-hangzhou.aliyuncs.com/library/nginx  # 国内镜像加速

4.3 查看本地镜像

docker images                     # 查看所有镜像
docker images -q                  # 只显示镜像 ID
docker image ls --filter dangling=true  # 查看悬空镜像

4.4 删除镜像

docker rmi nginx:latest           # 删除指定镜像
docker rmi -f <image_id>          # 强制删除
docker image prune                # 删除悬空镜像
docker image prune -a             # 删除所有未使用的镜像

4.5 镜像标签与导出

# 打标签
docker tag ubuntu:20.04 myubuntu:v1

# 导出镜像为 tar 文件
docker save -o ubuntu.tar ubuntu:20.04

# 从 tar 文件导入镜像
docker load -i ubuntu.tar

4.6 登录与推送

docker login                      # 登录 Docker Hub
docker push username/myapp:v1     # 推送镜像

5. 容器管理

5.1 创建并启动容器

# 基本启动
docker run nginx

# 后台运行(-d)
docker run -d nginx

# 端口映射(-p 宿主机端口:容器端口)
docker run -d -p 8080:80 nginx

# 命名容器(--name)
docker run -d --name my-nginx -p 8080:80 nginx

# 设置环境变量(-e)
docker run -d --name my-mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

# 挂载数据卷(-v)
docker run -d -v /host/data:/container/data nginx

# 自动删除(--rm,容器停止后自动删除)
docker run --rm -it ubuntu bash

# 交互模式(-it)
docker run -it ubuntu bash

5.2 查看容器

docker ps                         # 查看运行中的容器
docker ps -a                      # 查看所有容器(含已停止)
docker ps -q                      # 只显示容器 ID
docker container ls -a            # 同 docker ps -a

5.3 停止、启动、重启容器

docker stop <container_id/name>   # 停止容器
docker start <container_id/name>  # 启动已停止的容器
docker restart <container_id/name> # 重启容器
docker pause <container_id/name>  # 暂停容器
docker unpause <container_id/name> # 恢复暂停的容器

5.4 进入容器

# 推荐方式(exit 不会导致容器停止)
docker exec -it <container_id/name> bash

# 如果容器没有 bash,可以用 sh
docker exec -it <container_id/name> sh

# attach 方式(exit 会导致容器停止)
docker attach <container_id/name>

5.5 查看日志

docker logs <container_id/name>          # 查看所有日志
docker logs -f <container_id/name>       # 实时跟踪日志
docker logs --tail 100 <container_id/name> # 查看最近 100 行
docker logs -t <container_id/name>       # 显示时间戳

5.6 容器内部文件操作

# 从宿主机拷贝文件到容器
docker cp /host/file.txt container_id:/container/path/

# 从容器拷贝文件到宿主机
docker cp container_id:/container/file.txt /host/path/

5.7 删除容器

docker rm <container_id/name>            # 删除已停止的容器
docker rm -f <container_id/name>         # 强制删除运行中的容器
docker container prune                   # 删除所有已停止的容器
docker rm $(docker ps -aq)               # 删除所有容器

5.8 查看容器详细信息

docker inspect <container_id/name>       # 查看容器详细信息(JSON)
docker inspect --format '{{.NetworkSettings.IPAddress}}' <container_id>
docker top <container_id/name>           # 查看容器中的进程
docker stats                             # 查看所有容器的资源使用

6. Dockerfile 构建

6.1 Dockerfile 指令详解

# 指定基础镜像
FROM ubuntu:20.04

# 维护者信息
LABEL maintainer="yourname@example.com"

# 设置环境变量
ENV APP_HOME /app
ENV TZ Asia/Shanghai

# 设置工作目录
WORKDIR $APP_HOME

# 运行命令(构建时执行)
RUN apt update && apt install -y python3 python3-pip nginx

# 复制文件到镜像
COPY ./app /app
ADD ./archive.tar.gz /tmp/          # ADD 支持自动解压 tar 和远程 URL

# 暴露端口(仅声明,不实际映射)
EXPOSE 80 443

# 设置卷
VOLUME ["/data", "/config"]

# 运行用户
USER appuser

# 启动命令
CMD ["python3", "app.py"]

# 或使用 ENTRYPOINT(可追加参数)
ENTRYPOINT ["python3"]
CMD ["app.py"]         # 作为 ENTRYPOINT 的默认参数

6.2 构建镜像

docker build -t myapp:v1 .              # 当前目录构建
docker build -t myapp:v1 -f Dockerfile.prod .  # 指定 Dockerfile
docker build --no-cache -t myapp:v1 .   # 不使用缓存

6.3 多阶段构建

# 阶段一:编译
FROM golang:1.19 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 阶段二:运行(极小镜像)
FROM alpine:latest
RUN apk add --no-cache ca-certificates
WORKDIR /root/
COPY --from=builder /app/myapp .
EXPOSE 8080
CMD ["./myapp"]

6.4 优化建议

# ✅ 合并 RUN 命令,减少层数
RUN apt update && \
    apt install -y curl nginx && \
    rm -rf /var/lib/apt/lists/*

# ✅ 使用 .dockerignore 忽略不必要的文件
# .dockerignore 文件内容:
# node_modules
# .git
# *.log
# Dockerfile

7. Docker Compose

7.1 安装 Docker Compose

# Linux
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# Ubuntu 通过 apt
sudo apt install -y docker-compose

# 验证
docker-compose --version

7.2 docker-compose.yml 示例

version: '3.8'

services:
  # Web 服务
  web:
    image: nginx:latest
    container_name: my-web
    ports:
      - "8080:80"
      - "443:443"
    volumes:
      - ./html:/usr/share/nginx/html:ro
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    networks:
      - app-net
    depends_on:
      - api
    restart: always

  # API 服务
  api:
    build:
      context: ./api
      dockerfile: Dockerfile
    container_name: my-api
    environment:
      - DB_HOST=db
      - DB_PORT=3306
    volumes:
      - ./api:/app
    networks:
      - app-net
    depends_on:
      db:
        condition: service_healthy
    restart: unless-stopped

  # 数据库
  db:
    image: mysql:5.7
    container_name: my-db
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-root123}
      MYSQL_DATABASE: myapp
    volumes:
      - mysql-data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      - app-net
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: always

  # Redis 缓存
  redis:
    image: redis:7-alpine
    container_name: my-redis
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    networks:
      - app-net
    restart: always

volumes:
  mysql-data:
    driver: local
  redis-data:
    driver: local

networks:
  app-net:
    driver: bridge

7.3 Compose 常用命令

# 启动所有服务(-d 后台运行)
docker-compose up -d

# 构建并启动
docker-compose up -d --build

# 停止并删除容器
docker-compose down

# 停止并删除容器 + 数据卷
docker-compose down -v

# 查看日志
docker-compose logs -f

# 查看服务状态
docker-compose ps

# 重启服务
docker-compose restart

# 执行命令
docker-compose exec web bash

# 查看镜像
docker-compose images

# 拉取最新镜像
docker-compose pull

# 指定配置文件
docker-compose -f docker-compose.prod.yml up -d

7.4 环境变量管理

# 创建 .env 文件
echo "DB_PASSWORD=mysecret" > .env
echo "APP_ENV=production" >> .env

# 在 compose 文件中使用 ${VAR_NAME} 引用
# 默认值语法:${VAR_NAME:-default_value}

8. 数据管理(Volume)

8.1 Volume 类型

类型 说明 适用场景
命名卷 docker 管理的卷,存储在 /var/lib/docker/volumes/ 持久化数据库数据
绑定挂载 挂载宿主机目录到容器 开发时热更新代码
tmpfs 挂载 存储在内存中 敏感数据,临时文件

8.2 管理 Volume

# 创建卷
docker volume create my-volume

# 查看卷
docker volume ls
docker volume inspect my-volume

# 删除卷
docker volume rm my-volume
docker volume prune  # 删除所有未使用的卷

# 使用卷运行容器
docker run -d -v my-volume:/data nginx

# 绑定挂载
docker run -d -v /host/path:/container/path nginx

# 只读挂载
docker run -d -v /host/path:/container/path:ro nginx

# tmpfs 挂载
docker run -d --tmpfs /tmp:rw,noexec,nosuid,size=100m nginx

8.3 容器间共享数据

# 创建数据卷容器
docker create -v /shared-data --name data-container ubuntu

# 其他容器使用 --volumes-from 共享
docker run -d --volumes-from data-container --name app1 nginx
docker run -d --volumes-from data-container --name app2 nginx

9. 网络管理

9.1 网络类型

网络模式 说明 适用场景
bridge 默认,通过虚拟网桥通信 单机容器间通信
host 直接使用宿主机网络 高性能场景
none 无网络 安全隔离
overlay 跨主机通信 多节点集群

9.2 管理网络

# 创建网络
docker network create --driver bridge my-network

# 创建带子网的网络
docker network create --subnet=172.20.0.0/16 --ip-range=172.20.10.0/24 my-network

# 查看网络
docker network ls
docker network inspect my-network

# 连接容器到网络
docker network connect my-network container_name

# 断开容器网络
docker network disconnect my-network container_name

# 删除网络
docker network rm my-network
docker network prune  # 删除所有未使用的网络

9.3 指定 IP 运行

docker run -d --network my-network --ip 172.20.10.10 nginx

9.4 容器间 DNS 解析

同一自定义网络下的容器,可以通过容器名直接通信:

docker run -d --network my-network --name web nginx
docker run -d --network my-network --name app alpine ping web

10. 常用命令速查

10.1 镜像操作

命令 说明
docker images 列出镜像
docker pull <image> 拉取镜像
docker push <image> 推送镜像
docker rmi <image> 删除镜像
docker build -t <tag> . 构建镜像
docker tag <old> <new> 打标签
docker save -o file.tar <image> 导出镜像
docker load -i file.tar 导入镜像
docker image prune 清理悬空镜像

10.2 容器操作

命令 说明
docker ps -a 查看所有容器
docker run -d --name <name> <image> 后台运行容器
docker exec -it <name> bash 进入容器
docker logs -f <name> 查看日志
docker stop <name> 停止容器
docker start <name> 启动容器
docker restart <name> 重启容器
docker rm -f <name> 强制删除容器
docker cp <name>:/path /local 拷贝文件
docker inspect <name> 查看详情
docker stats 查看资源占用
docker container prune 清理已停止容器

10.3 系统维护

命令 说明
docker info Docker 系统信息
docker version 版本信息
docker system df 查看磁盘占用
docker system prune -a 清理所有未使用资源
docker system prune -a --volumes 清理全部(含卷)

11. 最佳实践与注意事项

11.1 安全建议

  1. 不使用 root 用户运行容器:在 Dockerfile 中使用 USER 指定非 root 用户
  2. 镜像最小化:使用 alpine 等精简基础镜像
  3. 限制资源:
    docker run -d \
      --memory="512m" \
      --cpus="1.0" \
      --memory-swap="1g" \
      --read-only \
      nginx
    
  4. 定期扫描漏洞:使用 docker scan 或 Trivy 扫描镜像

11.2 性能优化

  1. 使用 .dockerignore:避免将不必要的文件构建到镜像中
  2. 合并 RUN 指令:减少镜像层数
  3. 利用构建缓存:将不常变化的指令放在 Dockerfile 前面
  4. 选择合适的基础镜像:alpine (~5MB) vs ubuntu (~200MB)

11.3 日志与调试

# 限制容器日志大小(在 docker-compose.yml 中)
services:
  app:
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

# 全局设置(daemon.json)
# /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

11.4 镜像加速器配置

# /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}
# 重启 Docker
sudo systemctl restart docker

11.5 清理空间

# 一键清理(慎用!会删除未使用的镜像、容器、网络、构建缓存)
docker system prune -a

# 只清理构建缓存
docker builder prune

# 查看空间占用
docker system df

11.6 常见问题排查

# 1. 容器无法启动 -> 查看日志
docker logs <container_id>

# 2. 端口冲突 -> 查看占用
sudo netstat -tlnp | grep 80

# 3. 磁盘空间不足 -> 清理
docker system prune -a
docker volume prune

# 4. 容器间无法通信 -> 检查网络
docker network inspect <network_name>

# 5. 进入排查模式
docker run -it --rm --network container:<目标容器名> nicolaka/netshoot

附录:资源链接


本文档由 Docker 虚拟机管理助手生成,持续更新中...