Docker

覆盖 Docker 容器、镜像、网络、存储、编排等核心概念和实用命令。适合日常开发和生产运维使用。


目录

  1. 容器管理篇

  2. 镜像管理篇

  3. 网络管理篇

  4. 存储管理篇

  5. Dockerfile 篇

  6. Docker Compose 篇

  7. 仓库管理篇

  8. 系统维护篇

  9. 最佳实践篇


一、容器管理篇

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

常用参数说明:

参数

说明

-i

以交互模式运行容器,通常与 -t 同时使用

-d

在后台运行容器,并且打印容器 ID

-t

为容器重新分配一个伪输入终端,通常与 -i 同时使用

-p

端口映射:宿主机端口:容器端口

-v

挂载宿主机目录:宿主机路径:容器路径

-w

指定容器内的工作目录

--net

指定网络模式

-e

设置环境变量

--name

指定容器名称


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 网络用来管理容器之间的通信以及容器与外部网络的连接,可以实现以下功能:

  1. 容器间通信:Docker 允许创建多个容器,并且这些容器可以相互通信。通过定义网络配置,可以让容器之间建立网络连接,实现数据的传输和交互。

  2. 容器与主机通信:Docker 容器可以与宿主机进行通信,以便获取外部资源或者与外部系统交互。

  3. 容器与外部网络通信:Docker 容器可以与外部网络通信,例如与互联网上的其他系统进行数据交换。

  4. 网络隔离: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 网络模式

模式

说明

特点

适用场景

示例命令

bridge

默认模式,容器通过 docker0 虚拟网桥通信

容器间隔离,通过端口映射访问外部

单主机多容器通信、开发环境

docker run --network=bridge nginx

host

容器与宿主机共享网络命名空间

性能最优,直接使用宿主机网络

高网络性能需求、需要访问宿主机服务

docker run --network=host nginx

none

容器没有网络接口

完全隔离,无网络访问能力

离线任务、安全敏感场景

docker run --network=none busybox

container

与另一个容器共享网络命名空间

共享网络栈,容器间可通过 localhost 通信

容器间紧密协作、服务网格

docker run --network=container:my-container nginx

overlay

跨主机容器通信(Docker Swarm 模式)

支持多主机容器通信,加密传输

集群部署、微服务架构

docker service create --network=overlay nginx

macvlan

为容器分配物理网络 MAC 地址

容器直接连接物理网络,独立 IP

需要直连物理网络、网络监控

docker run --network=macvlan-net nginx

ipvlan

类似 macvlan,但共享 MAC 地址

节省 MAC 地址,支持 IPv6

大规模部署、IPv6 环境

docker run --network=ipvlan-net nginx

# 使用特定网络模式运行容器
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 最佳实践

  1. 使用 .dockerignore 文件:排除不需要的文件

  2. 多阶段构建:减小镜像体积

  3. 合并 RUN 命令:减少镜像层数

  4. 使用具体的基础镜像版本:避免使用 latest

  5. 清理缓存:删除不需要的文件

# 多阶段构建示例
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 容器化应用最佳实践

  1. 一个容器一个进程:每个容器应该只运行一个主进程

  2. 不可变基础设施:不要在运行的容器中修改配置,应重新构建镜像

  3. 使用环境变量:通过环境变量配置应用,而不是硬编码

  4. 日志输出到 stdout/stderr:便于日志收集和管理

  5. 优雅停机:应用应该正确处理 SIGTERM 信号

  6. 健康检查:使用 HEALTHCHECK 指令

  7. 最小化镜像体积:使用精简的基础镜像(alpine)


9.2 安全最佳实践

  1. 不要以 root 用户运行:使用非特权用户

  2. 扫描镜像漏洞:使用 Docker Scan 或 Trivy

  3. 使用官方镜像:避免使用不可信的第三方镜像

  4. 定期更新镜像:保持基础镜像和依赖最新

  5. 限制容器权限:使用 --cap-drop--cap-add

  6. 只读文件系统:使用 --read-only 参数

# 安全运行容器示例
docker run -d \
  --read-only \
  --cap-drop=ALL \
  --cap-add=NET_BIND_SERVICE \
  --user 1000:1000 \
  myapp:1.0

9.3 性能优化

  1. 使用多阶段构建:减小最终镜像体积

  2. 合理使用缓存:优化 Dockerfile 层的顺序

  3. 使用 .dockerignore:避免复制不需要的文件

  4. 选择合适的基础镜像:平衡功能和体积

  5. 使用数据卷:避免数据存储在容器层

  6. 限制日志大小:防止日志占满磁盘

# 限制日志大小
docker run -d \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  myapp:1.0

参考资源