Docker¶
覆盖 Docker 容器、镜像、网络、存储、编排等核心概念和实用命令。适合日常开发和生产运维使用。
目录¶
一、容器管理篇¶
1.1 创建与运行容器¶
# 基本语法
docker run -it -d --name 容器名称 -p 本机端口:容器端口 -v /本地目录:/容器目录 -w 工作目录 镜像名称:镜像的tag python app.py
# 实际示例
docker run -it -d --name mysql_streamlit -p 9519:3306 -v /data/nasData/mysql:/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
常用参数说明:
参数 |
说明 |
|---|---|
|
以交互模式运行容器,通常与 -t 同时使用 |
|
在后台运行容器,并且打印容器 ID |
|
为容器重新分配一个伪输入终端,通常与 -i 同时使用 |
|
端口映射:宿主机端口:容器端口 |
|
挂载宿主机目录:宿主机路径:容器路径 |
|
指定容器内的工作目录 |
|
指定网络模式 |
|
设置环境变量 |
|
指定容器名称 |
1.2 容器生命周期管理¶
# 启动容器
docker start 容器名称/ID
# 停止容器
docker stop 容器名称/ID
docker stop $(docker ps -aq) # 停止所有容器
# 重启容器
docker restart 容器名称/ID
# 暂停容器
docker pause 容器名称/ID
# 恢复容器
docker unpause 容器名称/ID
# 删除容器
docker rm 容器名称/ID
# 强制删除运行中的容器
docker rm -f 容器名称/ID
1.3 容器配置管理¶
# 设置开机自动启动容器
docker update parts-server --restart=always
# 重启策略说明
# --restart=no 默认,不自动重启
# --restart=on-failure 容器异常退出时重启
# --restart=always 总是重启
# --restart=unless-stopped 总是重启,除非手动停止
1.4 查看容器信息¶
# 列出运行中的容器
docker ps
# 列出所有容器(包括已停止)
docker ps -a
# 查看容器详细信息
docker inspect 容器名称/ID
# 查看容器日志
docker logs 容器名称
docker logs 容器名称 --follow # 实时跟踪日志
docker logs 容器名称 --tail 100 # 查看最后100行
docker logs 容器名称 --since 10m # 查看最近10分钟日志
# 查看容器资源使用情况
docker stats 容器名称/ID
# 查看容器进程
docker top 容器名称/ID
1.5 容器交互操作¶
# 进入容器
docker exec -it 容器名称 bash
docker exec -it 容器名称 sh
# 在容器中执行命令
docker exec 容器名称 命令
# 与宿主机之间复制文件
docker cp /host/path/file.txt 容器ID或名称:/container/path/file.txt # 宿主机 → 容器
docker cp 容器ID或名称:/container/path/file.txt /host/path/file.txt # 容器 → 宿主机
二、镜像管理篇¶
2.1 镜像基本操作¶
# 列出本地镜像
docker images
docker images -a # 列出所有镜像(包括中间层)
# 搜索镜像
docker search 镜像名称
# 拉取镜像
docker pull 镜像名称:tag
docker pull mysql:5.7
# 删除镜像
docker rmi 镜像名称/ID
docker rmi 镜像名称:tag
# 删除所有未使用的镜像
docker image prune -a
2.2 从容器创建镜像¶
# 提交容器为新镜像
docker commit 容器名称/ID 新镜像名称:tag
# 示例
docker commit parts-server part-server-iso:1
# 完整语法(带说明)
docker commit -a "作者" -m "提交说明" 容器ID 新镜像名:tag
2.3 从 Dockerfile 构建镜像¶
# 基本构建
docker build -t 镜像名称:标签 .
# 指定 Dockerfile
docker build -f Dockerfile名称 -t 镜像名称:标签 .
# 示例
docker build -f MySQL.dockerfile . -t my-mysql:1.0
# 不使用缓存构建
docker build --no-cache -t 镜像名称:标签 .
2.4 镜像打包与导入¶
# 保存镜像为 tar 包
docker save -o xxx.tar 镜像名称:tag
docker save -o myapp.tar myapp:1.0
# 保存所有镜像(无 tag)
docker save -o all_images.tar $(docker images -q)
# 从 tar 包加载镜像
docker load -i all_images.tar
docker load < myapp.tar
# 导出容器文件系统为 tar
docker export <容器ID> -o container-backup.tar
# 导入为镜像
docker import container-backup.tar my-new-image:tag
2.5 镜像标签管理¶
# 打标签
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
# 示例
docker tag myapp:1.0 myapp:latest
docker tag myapp:1.0 registry.example.com/myapp:1.0
三、网络管理篇¶
3.1 Docker 网络概述¶
Docker 网络用来管理容器之间的通信以及容器与外部网络的连接,可以实现以下功能:
容器间通信:Docker 允许创建多个容器,并且这些容器可以相互通信。通过定义网络配置,可以让容器之间建立网络连接,实现数据的传输和交互。
容器与主机通信:Docker 容器可以与宿主机进行通信,以便获取外部资源或者与外部系统交互。
容器与外部网络通信:Docker 容器可以与外部网络通信,例如与互联网上的其他系统进行数据交换。
网络隔离:Docker 提供了多种网络模式,包括桥接、主机模式、overlay 等,可以根据需要选择不同的网络模式,实现容器之间的网络隔离,保障容器之间的安全性和隔离性。
3.2 网络管理命令¶
# 创建网络
docker network create 网络名称
docker network create --driver bridge my-network
# 列出所有网络
docker network ls
# 查看网络详细信息
docker network inspect 网络名称
# 将容器连接到网络
docker network connect 网络名称 容器名称
# 断开容器与网络的连接
docker network disconnect 网络名称 容器名称
# 删除网络
docker network rm 网络名称
# 清理未使用的网络
docker network prune
3.3 网络模式¶
模式 |
说明 |
特点 |
适用场景 |
示例命令 |
|---|---|---|---|---|
|
默认模式,容器通过 docker0 虚拟网桥通信 |
容器间隔离,通过端口映射访问外部 |
单主机多容器通信、开发环境 |
|
|
容器与宿主机共享网络命名空间 |
性能最优,直接使用宿主机网络 |
高网络性能需求、需要访问宿主机服务 |
|
|
容器没有网络接口 |
完全隔离,无网络访问能力 |
离线任务、安全敏感场景 |
|
|
与另一个容器共享网络命名空间 |
共享网络栈,容器间可通过 localhost 通信 |
容器间紧密协作、服务网格 |
|
|
跨主机容器通信(Docker Swarm 模式) |
支持多主机容器通信,加密传输 |
集群部署、微服务架构 |
|
|
为容器分配物理网络 MAC 地址 |
容器直接连接物理网络,独立 IP |
需要直连物理网络、网络监控 |
|
|
类似 macvlan,但共享 MAC 地址 |
节省 MAC 地址,支持 IPv6 |
大规模部署、IPv6 环境 |
|
# 使用特定网络模式运行容器
docker run --network=host 镜像名称
docker run --network=my-network 镜像名称
四、存储管理篇¶
4.1 数据卷(Volume)¶
用于数据持久化
# 创建数据卷
docker volume create 卷名称
# 列出所有数据卷
docker volume ls
# 查看数据卷详细信息
docker volume inspect 卷名称
# 删除数据卷
docker volume rm 卷名称
# 清理未使用的数据卷
docker volume prune
# 使用数据卷运行容器
docker run -v 卷名称:/容器内路径 镜像名称
docker run -v mydata:/data nginx
4.2 挂载目录(Bind Mount)¶
# 挂载宿主机目录到容器
docker run -v /宿主机路径:/容器路径 镜像名称
docker run -v $(pwd):/app myapp:1.0
# 只读挂载
docker run -v /宿主机路径:/容器路径:ro 镜像名称
# docker 本身不支持热挂载,即在运行中的容器中挂载目录且立即生效,不支持
4.3 tmpfs 挂载(内存挂载)¶
# 使用 tmpfs 挂载(数据存储在内存中)
docker run --tmpfs /tmp:rw,size=100m 镜像名称
五、Dockerfile 篇¶
5.1 Dockerfile 基本结构¶
# 指定基础镜像
FROM ubuntu:22.04
# 设置维护者信息
LABEL maintainer="your-email@example.com"
# 设置工作目录
WORKDIR /app
# 复制文件到镜像
COPY . /app
ADD file.tar.gz /app
# 安装依赖
RUN apt-get update && \
apt-get install -y python3 && \
apt-get clean
# 设置环境变量
ENV APP_ENV=production \
APP_PORT=8080
# 暴露端口
EXPOSE 8080
# 设置数据卷
VOLUME ["/data"]
# 容器启动命令
CMD ["python3", "app.py"]
# 或使用 ENTRYPOINT
ENTRYPOINT ["python3"]
CMD ["app.py"]
5.2 Dockerfile 最佳实践¶
使用 .dockerignore 文件:排除不需要的文件
多阶段构建:减小镜像体积
合并 RUN 命令:减少镜像层数
使用具体的基础镜像版本:避免使用 latest
清理缓存:删除不需要的文件
# 多阶段构建示例
FROM golang:1.20 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
FROM alpine:3.18
WORKDIR /app
COPY --from=builder /app/myapp . # from就是 从 上一阶段 阶段复制可执行文件
CMD ["./myapp"]
六、Docker Compose 篇¶
6.1 Docker Compose 基本命令¶
# 检查语法
docker compose -f docker-compose.yml config
# 启动服务
docker compose up
docker compose up -d # 后台运行
# 从指定文件启动
docker compose -f docker-compose.yml up -d
docker compose -f compose1.yml -f compose2.yml up -d # 使用多个配置文件
# 构建镜像
docker compose build
docker compose build --no-cache # 不使用缓存构建
# 停止服务
docker compose stop
docker compose down # 停止并删除容器、网络
docker compose down -v # 停止并删除容器、网络、卷
# 查看服务状态
docker compose ps
docker compose logs # 查看日志
docker compose logs -f service-name # 实时跟踪特定服务日志
# 重启服务
docker compose restart
# 强制重新创建容器
docker compose up -d --force-recreate # 强制重新创建容器
docker compose up -d --pull always --force-recreate # 拉取最新镜像并强制重新创建
# 扩容服务
docker compose up -d --scale web=3 # 扩展 web 服务到 3 个实例
6.2 docker-compose.yml 示例¶
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- app-network
depends_on:
- db
environment:
- ENV=production
restart: always
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: myapp
volumes:
- db-data:/var/lib/mysql
networks:
- app-network
restart: always
networks:
app-network:
driver: bridge
volumes:
db-data:
七、仓库管理篇¶
7.1 Docker Registry 操作¶
# 登录仓库
docker login
docker login registry.example.com
docker login -u username -p password registry.example.com
# 查看当前登录的仓库
cat ~/.docker/config.json
# 登出
docker logout
docker logout registry.example.com
7.2 推送与拉取镜像¶
# 拉取镜像
docker pull registry.example.com/myapp:v1
# 推送镜像到仓库
docker push registry.example.com/myapp:v1
# 推送到个人仓库示例
# 1. 先删除旧镜像(可选)
docker rmi hub.i-wall.cn/aas/cvat-ui
docker rmi hub.i-wall.cn/aas/cvat-server
# 2. 打标签
docker tag cvat/server:latest hub.i-wall.cn/aas/cvat-server:latest
docker tag cvat/ui:latest hub.i-wall.cn/aas/cvat-ui:latest
# 3. 推送
docker push hub.i-wall.cn/aas/cvat-server:latest
docker push hub.i-wall.cn/aas/cvat-ui:latest
7.3 私有仓库搭建¶
# 运行 Docker Registry
docker build -f Dockerfile.base -t server-base:latest .
docker tag cvat-server-base:latest hub.i-wall.cn/aas/cvat-server-base:latest
# 或者直接
docker build -f Dockerfile.base -t hub.i-wall.cn/aas/cvat-server-base:latest .
# 推送镜像到当前项目:
docker push hub.i-wall.cn/aas/cvat-server-base:latest
# 拉取镜像
docker pull hub.i-wall.cn/aas/cvat-server-base:latest
八、系统维护篇¶
8.1 清理与优化¶
# 查看磁盘使用情况
docker system df
# 清理停止的容器
docker container prune
docker container prune -f # 不提示确认
# 清理未使用的镜像
docker image prune
docker image prune -a # 删除所有未使用的镜像
# 清理未使用的网络
docker network prune
# 清理未使用的数据卷
docker volume prune
# 清理构建缓存
docker builder prune
docker builder prune -f # 不提示确认
# 全面清理
docker system prune # 清理:停止的容器 + 悬空镜像 + 未用网络 + 构建缓存
docker system prune -f # 不提示确认
docker system prune -a # 清理所有未使用的镜像
docker system prune -a --volumes # 清理所有:未用镜像 + 停止容器 + 未用卷 + 网络 + 构建缓存
docker system prune -a --volumes -f # 不提示确认
8.2 权限配置¶
# 将当前用户添加到 docker 组(避免每次使用 sudo)
sudo usermod -aG docker $USER
# 重新登录使权限生效
# 或执行:
newgrp docker
# 验证
docker ps
8.3 故障排查¶
# 查看 Docker 服务状态
sudo systemctl status docker
# 重启 Docker 服务
sudo systemctl restart docker
# 查看 Docker 日志
sudo journalctl -u docker -f
# 清理 buildx 缓存(修复某些构建问题)
# 错误:docker load metadata for docker.io/library/ubuntu:22.04
sudo rm -rf ~/.docker/buildx
# 查看 Docker 版本信息
docker version
docker info
# 查询dockers 容器有没有启动命令
docker inspect hub.i-wall.cn/aas/cvat-server-base:latest | grep -A5 '"Cmd"\|"Entrypoint"'
8.4 资源限制¶
# 限制容器内存
docker run -m 512m nginx
# 限制容器 CPU
docker run --cpus=1.5 nginx
docker run --cpu-shares=512 nginx
# 限制容器磁盘 I/O
docker run --device-write-bps /dev/sda:1mb nginx
九、最佳实践篇¶
9.1 容器化应用最佳实践¶
一个容器一个进程:每个容器应该只运行一个主进程
不可变基础设施:不要在运行的容器中修改配置,应重新构建镜像
使用环境变量:通过环境变量配置应用,而不是硬编码
日志输出到 stdout/stderr:便于日志收集和管理
优雅停机:应用应该正确处理 SIGTERM 信号
健康检查:使用 HEALTHCHECK 指令
最小化镜像体积:使用精简的基础镜像(alpine)
9.2 安全最佳实践¶
不要以 root 用户运行:使用非特权用户
扫描镜像漏洞:使用 Docker Scan 或 Trivy
使用官方镜像:避免使用不可信的第三方镜像
定期更新镜像:保持基础镜像和依赖最新
限制容器权限:使用
--cap-drop和--cap-add只读文件系统:使用
--read-only参数
# 安全运行容器示例
docker run -d \
--read-only \
--cap-drop=ALL \
--cap-add=NET_BIND_SERVICE \
--user 1000:1000 \
myapp:1.0
9.3 性能优化¶
使用多阶段构建:减小最终镜像体积
合理使用缓存:优化 Dockerfile 层的顺序
使用 .dockerignore:避免复制不需要的文件
选择合适的基础镜像:平衡功能和体积
使用数据卷:避免数据存储在容器层
限制日志大小:防止日志占满磁盘
# 限制日志大小
docker run -d \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
myapp:1.0
参考资源¶
Docker 官方文档:https://docs.docker.com/
Docker Hub:https://hub.docker.com/
Docker Compose 文档:https://docs.docker.com/compose/
Dockerfile 最佳实践:https://docs.docker.com/develop/dev-best-practices/