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

755 lines
17 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 虚拟机管理助手生成,持续更新中...*