Files
virtualbox_client/docs/docker使用手册.md
T

755 lines
17 KiB
Markdown
Raw Normal View History

2026-05-10 10:56:52 +08:00
# Docker 使用手册
## 📖 目录
- [1. Docker 简介](#1-docker-简介)
- [2. 安装 Docker](#2-安装-docker)
- [3. Docker 基本概念](#3-docker-基本概念)
- [4. 镜像管理](#4-镜像管理)
- [5. 容器管理](#5-容器管理)
- [6. Dockerfile 构建](#6-dockerfile-构建)
- [7. Docker Compose](#7-docker-compose)
- [8. 数据管理(Volume)](#8-数据管理volume)
- [9. 网络管理](#9-网络管理)
- [10. 常用命令速查](#10-常用命令速查)
- [11. 最佳实践与注意事项](#11-最佳实践与注意事项)
---
## 1. Docker 简介
Docker 是一个开源的应用容器引擎,让开发者可以打包应用及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 机器上。
### 核心优势
- **轻量级**:容器共享宿主机内核,无需虚拟化完整 OS
- **快速启动**:秒级启动,相比虚拟机分钟级启动更快
- **环境一致**:消除"在我机器上能跑"的问题
- **高效资源**:内存、硬盘、CPU 占用远小于虚拟机
- **易于迁移**:一次构建,随处运行
---
## 2. 安装 Docker
### 2.1 Ubuntu / Debian
```bash
# 更新软件包索引
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
```bash
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](https://hub.docker.com/editions/community/docker-ce-desktop-mac/)
### 2.4 Windows
下载 [Docker Desktop for Windows](https://hub.docker.com/editions/community/docker-ce-desktop-windows/)
### 2.5 验证安装
```bash
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 搜索镜像
```bash
docker search nginx
docker search --filter stars=1000 ubuntu
```
### 4.2 拉取镜像
```bash
docker pull nginx:latest # 拉取最新版
docker pull ubuntu:20.04 # 拉取指定标签
docker pull registry.cn-hangzhou.aliyuncs.com/library/nginx # 国内镜像加速
```
### 4.3 查看本地镜像
```bash
docker images # 查看所有镜像
docker images -q # 只显示镜像 ID
docker image ls --filter dangling=true # 查看悬空镜像
```
### 4.4 删除镜像
```bash
docker rmi nginx:latest # 删除指定镜像
docker rmi -f <image_id> # 强制删除
docker image prune # 删除悬空镜像
docker image prune -a # 删除所有未使用的镜像
```
### 4.5 镜像标签与导出
```bash
# 打标签
docker tag ubuntu:20.04 myubuntu:v1
# 导出镜像为 tar 文件
docker save -o ubuntu.tar ubuntu:20.04
# 从 tar 文件导入镜像
docker load -i ubuntu.tar
```
### 4.6 登录与推送
```bash
docker login # 登录 Docker Hub
docker push username/myapp:v1 # 推送镜像
```
---
## 5. 容器管理
### 5.1 创建并启动容器
```bash
# 基本启动
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 查看容器
```bash
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器(含已停止)
docker ps -q # 只显示容器 ID
docker container ls -a # 同 docker ps -a
```
### 5.3 停止、启动、重启容器
```bash
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 进入容器
```bash
# 推荐方式(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 查看日志
```bash
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 容器内部文件操作
```bash
# 从宿主机拷贝文件到容器
docker cp /host/file.txt container_id:/container/path/
# 从容器拷贝文件到宿主机
docker cp container_id:/container/file.txt /host/path/
```
### 5.7 删除容器
```bash
docker rm <container_id/name> # 删除已停止的容器
docker rm -f <container_id/name> # 强制删除运行中的容器
docker container prune # 删除所有已停止的容器
docker rm $(docker ps -aq) # 删除所有容器
```
### 5.8 查看容器详细信息
```bash
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 指令详解
```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 构建镜像
```bash
docker build -t myapp:v1 . # 当前目录构建
docker build -t myapp:v1 -f Dockerfile.prod . # 指定 Dockerfile
docker build --no-cache -t myapp:v1 . # 不使用缓存
```
### 6.3 多阶段构建
```dockerfile
# 阶段一:编译
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 优化建议
```dockerfile
# ✅ 合并 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
```bash
# 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 示例
```yaml
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 常用命令
```bash
# 启动所有服务(-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 环境变量管理
```bash
# 创建 .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
```bash
# 创建卷
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 容器间共享数据
```bash
# 创建数据卷容器
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 管理网络
```bash
# 创建网络
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 运行
```bash
docker run -d --network my-network --ip 172.20.10.10 nginx
```
### 9.4 容器间 DNS 解析
同一自定义网络下的容器,可以通过容器名直接通信:
```bash
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. **限制资源**:
```bash
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 日志与调试
```bash
# 限制容器日志大小(在 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 镜像加速器配置
```bash
# /etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
# 重启 Docker
sudo systemctl restart docker
```
### 11.5 清理空间
```bash
# 一键清理(慎用!会删除未使用的镜像、容器、网络、构建缓存)
docker system prune -a
# 只清理构建缓存
docker builder prune
# 查看空间占用
docker system df
```
### 11.6 常见问题排查
```bash
# 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 官方文档](https://docs.docker.com/)
- [Docker Hub](https://hub.docker.com/)
- [Docker Compose 官方文档](https://docs.docker.com/compose/)
- [Dockerfile 最佳实践](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)
- [Play With Docker(在线实验)](https://labs.play-with-docker.com/)
---
*本文档由 Docker 虚拟机管理助手生成,持续更新中...*