# 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 # 强制删除 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 # 停止容器 docker start # 启动已停止的容器 docker restart # 重启容器 docker pause # 暂停容器 docker unpause # 恢复暂停的容器 ``` ### 5.4 进入容器 ```bash # 推荐方式(exit 不会导致容器停止) docker exec -it bash # 如果容器没有 bash,可以用 sh docker exec -it sh # attach 方式(exit 会导致容器停止) docker attach ``` ### 5.5 查看日志 ```bash docker logs # 查看所有日志 docker logs -f # 实时跟踪日志 docker logs --tail 100 # 查看最近 100 行 docker logs -t # 显示时间戳 ``` ### 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 # 删除已停止的容器 docker rm -f # 强制删除运行中的容器 docker container prune # 删除所有已停止的容器 docker rm $(docker ps -aq) # 删除所有容器 ``` ### 5.8 查看容器详细信息 ```bash docker inspect # 查看容器详细信息(JSON) docker inspect --format '{{.NetworkSettings.IPAddress}}' docker top # 查看容器中的进程 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 ` | 拉取镜像 | | `docker push ` | 推送镜像 | | `docker rmi ` | 删除镜像 | | `docker build -t .` | 构建镜像 | | `docker tag ` | 打标签 | | `docker save -o file.tar ` | 导出镜像 | | `docker load -i file.tar` | 导入镜像 | | `docker image prune` | 清理悬空镜像 | ### 10.2 容器操作 | 命令 | 说明 | |------|------| | `docker ps -a` | 查看所有容器 | | `docker run -d --name ` | 后台运行容器 | | `docker exec -it bash` | 进入容器 | | `docker logs -f ` | 查看日志 | | `docker stop ` | 停止容器 | | `docker start ` | 启动容器 | | `docker restart ` | 重启容器 | | `docker rm -f ` | 强制删除容器 | | `docker cp :/path /local` | 拷贝文件 | | `docker inspect ` | 查看详情 | | `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 # 2. 端口冲突 -> 查看占用 sudo netstat -tlnp | grep 80 # 3. 磁盘空间不足 -> 清理 docker system prune -a docker volume prune # 4. 容器间无法通信 -> 检查网络 docker network inspect # 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 虚拟机管理助手生成,持续更新中...*