Docker

目录

[一、Docker 概述](#一、Docker 概述)

[1.1 Docker 的定义与核心价值](#1.1 Docker 的定义与核心价值)

[1.2 容器技术与传统虚拟化的对比](#1.2 容器技术与传统虚拟化的对比)

[1.3 Docker 的三大核心概念](#1.3 Docker 的三大核心概念)

(1)镜像(Image)

(2)容器(Container)

(3)仓库(Repository)

[1.4 Docker 的应用场景](#1.4 Docker 的应用场景)

[二、Docker 环境部署(CentOS 系统)](#二、Docker 环境部署(CentOS 系统))

[2.1 安装前的准备工作](#2.1 安装前的准备工作)

[(1)关闭系统防火墙与 SELinux](#(1)关闭系统防火墙与 SELinux)

[(2)配置 Docker 软件源](#(2)配置 Docker 软件源)

[2.2 安装 Docker CE](#2.2 安装 Docker CE)

[2.3 配置国内镜像加速](#2.3 配置国内镜像加速)

[2.4 启动 Docker 服务](#2.4 启动 Docker 服务)

[2.5 优化内核参数](#2.5 优化内核参数)

[三、Docker 镜像操作详解](#三、Docker 镜像操作详解)

[3.1 获取镜像(docker pull)](#3.1 获取镜像(docker pull))

[3.2 查看镜像列表(docker images)](#3.2 查看镜像列表(docker images))

[3.3 查看镜像详细信息(docker inspect)](#3.3 查看镜像详细信息(docker inspect))

[3.4 修改镜像标签(docker tag)](#3.4 修改镜像标签(docker tag))

[3.5 删除镜像(docker rmi)](#3.5 删除镜像(docker rmi))

[3.6 镜像导入导出(docker save/load)](#3.6 镜像导入导出(docker save/load))

[(1)导出镜像为 tar 文件](#(1)导出镜像为 tar 文件)

(2)删除本地镜像

[(3)从 tar 文件导入镜像](#(3)从 tar 文件导入镜像)

(4)命令说明

[四、Docker 容器操作实战](#四、Docker 容器操作实战)

[4.1 容器的创建与启动](#4.1 容器的创建与启动)

[(1)创建容器(docker create)](#(1)创建容器(docker create))

[(2)查看容器列表(docker ps)](#(2)查看容器列表(docker ps))

[(3)启动容器(docker start)](#(3)启动容器(docker start))

[4.2 容器的快速运行(docker run)](#4.2 容器的快速运行(docker run))

[4.3 容器的终止与删除](#4.3 容器的终止与删除)

[(1)优雅停止容器(docker stop)](#(1)优雅停止容器(docker stop))

[(2)强制终止容器(docker kill)](#(2)强制终止容器(docker kill))

[(3)删除容器(docker rm)](#(3)删除容器(docker rm))

[4.4 进入容器与命令执行](#4.4 进入容器与命令执行)

[(1)进入运行中的容器(docker exec)](#(1)进入运行中的容器(docker exec))

(2)容器内命令执行(一次性)

[4.5 容器的导入导出(docker export/import)](#4.5 容器的导入导出(docker export/import))

(1)导出容器文件系统

(2)从导出文件创建镜像

[(3)与 docker save/load 的区别](#(3)与 docker save/load 的区别)

[五、Docker 数据卷管理](#五、Docker 数据卷管理)

[5.1 数据卷的基本概念](#5.1 数据卷的基本概念)

[5.2 创建与使用数据卷](#5.2 创建与使用数据卷)

(1)创建命名数据卷

(2)查看数据卷列表

(3)查看数据卷详细信息

(4)在容器中挂载数据卷

[5.3 数据卷容器(共享数据)](#5.3 数据卷容器(共享数据))

(1)创建数据卷容器

(2)其他容器挂载数据卷容器

[5.4 数据卷的备份与恢复](#5.4 数据卷的备份与恢复)

(1)备份数据卷

(2)恢复数据卷

[六、Docker 网络基础](#六、Docker 网络基础)

[6.1 Docker 默认网络模式](#6.1 Docker 默认网络模式)

[6.2 创建自定义网络](#6.2 创建自定义网络)

[6.3 容器连接网络](#6.3 容器连接网络)

[七、Dockerfile 基础](#七、Dockerfile 基础)

[7.1 Dockerfile 的作用](#7.1 Dockerfile 的作用)

[7.2 常用 Dockerfile 指令](#7.2 常用 Dockerfile 指令)

(1)基础镜像指定

(2)作者信息

(3)工作目录设置

(4)复制文件

(5)安装依赖

(6)暴露端口

(7)设置环境变量

(8)定义启动命令

[7.3 构建镜像](#7.3 构建镜像)

[八、Docker Compose 入门](#八、Docker Compose 入门)

[8.1 Compose 的作用](#8.1 Compose 的作用)

[8.2 Compose 文件示例](#8.2 Compose 文件示例)

[8.3 常用 Compose 命令](#8.3 常用 Compose 命令)

九、总结

[十、Docker 应用场景深度解析](#十、Docker 应用场景深度解析)

[10.1 开发环境一致性管理](#10.1 开发环境一致性管理)

[10.2 持续集成 / 持续部署(CI/CD)](#10.2 持续集成 / 持续部署(CI/CD))

[10.3 微服务架构实践](#10.3 微服务架构实践)

[10.4 云计算与资源优化](#10.4 云计算与资源优化)

[十一、Docker 镜像高级操作](#十一、Docker 镜像高级操作)

[11.1 镜像层原理与 AUFS](#11.1 镜像层原理与 AUFS)

[11.2 镜像构建最佳实践](#11.2 镜像构建最佳实践)

[11.3 镜像安全管理](#11.3 镜像安全管理)

[十二、Docker 容器高级操作](#十二、Docker 容器高级操作)

[12.1 容器资源限制](#12.1 容器资源限制)

[12.2 容器检查点与恢复](#12.2 容器检查点与恢复)

[12.3 容器日志管理](#12.3 容器日志管理)

[十三、Docker 数据管理进阶](#十三、Docker 数据管理进阶)

[13.1 数据卷驱动扩展](#13.1 数据卷驱动扩展)

[13.2 数据卷备份自动化](#13.2 数据卷备份自动化)

[13.3 容器数据迁移方案](#13.3 容器数据迁移方案)

[十四、Docker 网络高级配置](#十四、Docker 网络高级配置)

[14.1 自定义网络驱动](#14.1 自定义网络驱动)

[14.2 容器网络通信](#14.2 容器网络通信)

[14.3 网络故障排查](#14.3 网络故障排查)

[十五、Docker 安全最佳实践](#十五、Docker 安全最佳实践)

[15.1 容器权限控制](#15.1 容器权限控制)

[15.2 镜像安全加固](#15.2 镜像安全加固)

[15.3 运行时安全防护](#15.3 运行时安全防护)


一、Docker 概述

1.1 Docker 的定义与核心价值

Docker 是一种轻量级容器技术,旨在解决开发、测试和生产环境中的环境一致性问题。它通过将应用程序及其依赖项打包成一个独立的容器,实现了应用的隔离、可移植性和资源的高效利用。

与传统虚拟化技术相比,Docker 具有以下核心优势:

  • 启动速度快:容器启动时间只需秒级,而传统虚拟机需要分钟级
  • 资源占用少:容器共享宿主机内核,硬件资源利用率更高
  • 部署效率高:支持快速迭代和弹性扩展,适合微服务架构

1.2 容器技术与传统虚拟化的对比

特性 Docker 容器 传统虚拟机
启动速度 秒级 分钟级
资源占用 几乎无额外消耗 损耗约 50%
性能表现 接近原生应用 存在虚拟化层开销
单机支持量 上千个容器 几十个虚拟机
隔离级别 资源隔离 完全隔离

1.3 Docker 的三大核心概念

(1)镜像(Image)
  • 本质:只读模板,用于创建容器的基础
  • 作用:包含应用程序代码、运行时环境、系统工具和库
  • 示例:CentOS 镜像、MySQL 镜像等
(2)容器(Container)
  • 本质:镜像的运行实例
  • 特点:相互隔离、可独立启动 / 停止 / 删除
  • 关系:容器 = 镜像 + 可写层
(3)仓库(Repository)
  • 作用:集中存储镜像的服务
  • 分类
    • 公有仓库:如 Docker Hub(默认仓库)
    • 私有仓库:企业内部使用的镜像存储服务
  • 结构:仓库注册服务器→仓库→镜像标签

1.4 Docker 的应用场景

  1. 开发环境管理:确保团队成员环境一致性
  2. 持续集成 / 持续部署(CI/CD):自动化打包、测试和部署流程
  3. 微服务架构:每个微服务独立打包为容器
  4. 云计算服务:提供弹性计算资源

二、Docker 环境部署(CentOS 系统)

2.1 安装前的准备工作

(1)关闭系统防火墙与 SELinux
复制代码
# 停止防火墙服务
systemctl stop firewalld
# 禁用防火墙开机自启
systemctl disable firewalld
# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux(修改配置文件)
sed -i 's/=enforcing/=disabled/' /etc/selinux/config
(2)配置 Docker 软件源
复制代码
# 下载Docker官方YUM源配置文件
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 修改仓库配置(适配CentOS 8)
sed -i 's/$releasever/8/g' /etc/yum.repos.d/docker-ce.repo
sed -i 's/$basearch/x86_64/g' /etc/yum.repos.d/docker-ce.repo

2.2 安装 Docker CE

复制代码
# 清理旧索引
dnf clean all
# 生成新的缓存索引
dnf makecache
# 安装Docker CE
dnf -y install docker-ce

2.3 配置国内镜像加速

复制代码
# 创建Docker配置目录
mkdir -p /etc/docker/
# 写入镜像加速配置
cat >/etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.imgdb.de",
    "https://docker-0.unsee.tech",
    "https://docker.hlmirror.com"
  ]
}
EOF

2.4 启动 Docker 服务

复制代码
# 重载系统服务配置
systemctl daemon-reload
# 重启Docker服务
systemctl restart docker
# 设置Docker开机自启
systemctl enable docker
# 验证安装结果
docker version

2.5 优化内核参数

复制代码
# 添加内核参数配置
cat >>/etc/sysctl.conf <<EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 应用内核参数
sysctl -p

三、Docker 镜像操作详解

3.1 获取镜像(docker pull)

复制代码
# 拉取指定版本的Nginx镜像
docker pull nginx:1.24.0

# 命令语法
docker pull [OPTIONS] NAME[:TAG|@DIGEST]

# 常用参数
--all-tags          # 拉取所有标签的镜像
--disable-content-trust  # 禁用镜像签名验证

# 示例说明
docker pull nginx          # 拉取最新版Nginx镜像
docker pull alpine@sha256:abcdef123...  # 通过摘要拉取精确版本

3.2 查看镜像列表(docker images)

复制代码
# 列出本地所有镜像
docker images

# 命令语法
docker images [OPTIONS] [REPOSITORY[:TAG]]

# 常用参数
-a, --all         # 显示所有镜像(包括中间层)
--digests         # 显示镜像摘要
-f, --filter      # 按条件过滤(如dangling=true显示虚悬镜像)
--format          # 自定义输出格式
--no-trunc        # 完整显示镜像ID
-q, --quiet       # 仅显示镜像ID

# 输出字段说明
REPOSITORY  # 镜像仓库名称
TAG         # 镜像标签
IMAGE ID    # 镜像唯一标识
CREATED     # 镜像创建时间
VIRTUAL SIZE # 镜像虚拟大小

3.3 查看镜像详细信息(docker inspect)

复制代码
# 查看Nginx镜像的详细信息
docker inspect nginx:1.24.0

# 命令语法
docker inspect [OPTIONS] NAME|ID

# 常用参数
--format, -f  # 使用Go模板指定输出格式
--size, -s    # 显示文件系统大小(仅容器)

# 示例:获取镜像创建时间
docker inspect -f "{{.Created}}" nginx:1.24.0

3.4 修改镜像标签(docker tag)

复制代码
# 为Nginx镜像添加新标签
docker tag nginx:1.24.0 nginx:v1

# 命令语法
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

# 操作说明
# 1. 源镜像可以是名称:标签或镜像ID
# 2. 目标镜像格式相同,若不指定标签则使用latest
# 3. 标签本质是镜像的别名,不创建新镜像

# 示例场景
# 将私有仓库镜像重命名
docker tag private-registry/nginx:1.24.0 nginx:prod

3.5 删除镜像(docker rmi)

复制代码
# 按标签删除镜像
docker rmi nginx:v1
# 按ID删除镜像
docker rmi c15a2b3c4d5e

# 命令语法
docker rmi [OPTIONS] IMAGE [IMAGE...]

# 常用参数
-f, --force      # 强制删除(即使有容器依赖)
--no-prune       # 不删除未使用的父镜像层

# 注意事项
1. 删除前确保没有容器依赖(使用docker ps -a检查)
2. 多个标签指向同一镜像时,删除一个标签不影响镜像本身
3. 仅当所有标签都删除后,镜像才会从磁盘移除

3.6 镜像导入导出(docker save/load)

(1)导出镜像为 tar 文件
复制代码
docker save -o nginx.tar nginx:1.24.0
(2)删除本地镜像
复制代码
docker rmi nginx:1.24.0
(3)从 tar 文件导入镜像
复制代码
docker load < nginx.tar
(4)命令说明
  • docker save:将镜像打包为 tar 文件(包含所有层和元数据)
  • docker load:从 tar 文件加载镜像到本地
  • 应用场景:离线环境镜像迁移、镜像备份

四、Docker 容器操作实战

4.1 容器的创建与启动

(1)创建容器(docker create)
复制代码
# 创建交互式CentOS容器
docker create -it centos:7

# 命令语法
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

# 常用参数
-i, --interactive    # 保持标准输入打开
-t, --tty            # 分配伪终端
-p, --publish        # 端口映射(宿主机:容器)
-v, --volume         # 挂载数据卷
--name               # 指定容器名称
-e, --env            # 设置环境变量
--network            # 指定网络

# 示例:创建带端口映射的Nginx容器
docker create -p 8080:80 --name my-nginx nginx:1.24.0
(2)查看容器列表(docker ps)
复制代码
# 查看所有容器(包括停止的)
docker ps -a

# 命令语法
docker ps [OPTIONS]

# 常用参数
-a, --all          # 显示所有容器
-q, --quiet        # 仅显示容器ID
-s, --size         # 显示文件系统大小
-f, --filter       # 按条件过滤(如status=running)
--last int         # 显示最近创建的n个容器
(3)启动容器(docker start)
复制代码
# 启动名为my-nginx的容器
docker start my-nginx

# 命令语法
docker start [OPTIONS] CONTAINER

# 常用参数
-a, --attach       # 附加到容器的标准输入输出
-i, --interactive  # 保持标准输入打开
--checkpoint       # 从检查点恢复容器

# 示例:启动容器并进入交互模式
docker start -ai my-nginx

4.2 容器的快速运行(docker run)

复制代码
# 运行一个交互式CentOS容器
docker run -it centos:7 /bin/bash

# 命令语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

# 常用参数(扩展)
-d, --detach       # 后台运行容器
-m, --memory       # 限制内存使用
--cpus             # 限制CPU使用
-P, --publish-all  # 发布所有暴露端口

# 示例场景
# 1. 后台运行Nginx服务
docker run -d -p 80:80 --name web-server nginx:1.24.0
# 2. 运行带内存限制的MySQL容器
docker run -d -m 512m --name mysql-server mysql:8.0

4.3 容器的终止与删除

(1)优雅停止容器(docker stop)
复制代码
# 停止容器(默认等待10秒)
docker stop my-nginx
# 自定义等待时间(20秒)
docker stop -t 20 my-nginx
(2)强制终止容器(docker kill)
复制代码
docker kill my-nginx
(3)删除容器(docker rm)
复制代码
# 删除已停止的容器
docker rm my-nginx
# 强制删除运行中的容器
docker rm -f my-nginx
# 删除容器并移除关联数据卷
docker rm -v my-nginx

# 批量删除容器(删除所有停止的容器)
docker rm $(docker ps -a -q)

4.4 进入容器与命令执行

(1)进入运行中的容器(docker exec)
复制代码
# 进入容器并打开bash终端
docker exec -it my-nginx /bin/bash

# 命令语法
docker exec [OPTIONS] CONTAINER COMMAND

# 常用参数
-d, --detach       # 后台执行命令
-u, --user         # 指定执行用户
-w, --workdir      # 指定工作目录

# 示例:在容器中执行ls命令
docker exec my-nginx ls /etc
(2)容器内命令执行(一次性)
复制代码
# 在CentOS容器中执行ls命令
docker run centos:7 ls /root

4.5 容器的导入导出(docker export/import)

(1)导出容器文件系统
复制代码
docker export my-nginx > nginx-container.tar
(2)从导出文件创建镜像
复制代码
docker import nginx-container.tar nginx:exported
(3)与 docker save/load 的区别
操作 作用对象 包含内容 导入方式
save/load 镜像 所有层 + 历史记录 docker load
export/import 容器 当前文件系统 docker import

五、Docker 数据卷管理

5.1 数据卷的基本概念

  • 定义:独立于容器生命周期的持久化存储
  • 作用
    • 持久化保存数据
    • 实现容器间数据共享
    • 分离应用数据与容器

5.2 创建与使用数据卷

(1)创建命名数据卷
复制代码
docker volume create my-data-volume
(2)查看数据卷列表
复制代码
docker volume ls
(3)查看数据卷详细信息
复制代码
docker volume inspect my-data-volume
(4)在容器中挂载数据卷
复制代码
# 方式1:使用-v选项挂载命名卷
docker run -d -v my-data-volume:/app/data --name app-container nginx:1.24.0

# 方式2:挂载宿主机目录
docker run -d -v /host/path:/container/path --name app-container nginx:1.24.0

# 方式3:挂载宿主机文件
docker run -d -v /host/file:/container/file:ro --name app-container nginx:1.24.0

5.3 数据卷容器(共享数据)

(1)创建数据卷容器
复制代码
docker create -v /data --name data-container alpine:latest
(2)其他容器挂载数据卷容器
复制代码
docker run -d --volumes-from data-container --name app1 nginx:1.24.0
docker run -d --volumes-from data-container --name app2 nginx:1.24.0

5.4 数据卷的备份与恢复

(1)备份数据卷
复制代码
# 1. 创建临时容器挂载数据卷
docker run --rm -v my-data-volume:/data -v $(pwd):/backup alpine tar cvf /backup/backup.tar /data

# 2. 压缩备份文件
tar -czf backup.tar.gz backup.tar
(2)恢复数据卷
复制代码
# 1. 删除旧数据卷(可选)
docker volume rm my-data-volume

# 2. 创建新数据卷
docker volume create my-data-volume

# 3. 解压备份到新数据卷
docker run --rm -v my-data-volume:/data -v $(pwd):/backup alpine tar xvf /backup/backup.tar -C /data

六、Docker 网络基础

6.1 Docker 默认网络模式

  1. bridge 模式:默认网络,容器通过虚拟网桥连接
  2. host 模式:容器共享宿主机网络栈
  3. none 模式:容器无网络连接
  4. container 模式:容器共享其他容器的网络

6.2 创建自定义网络

复制代码
# 创建桥接网络
docker network create my-bridge-network

# 创建覆盖网络(用于Docker Swarm)
docker network create --driver overlay my-overlay-network

# 查看网络列表
docker network ls

# 查看网络详情
docker network inspect my-bridge-network

6.3 容器连接网络

复制代码
# 创建容器时指定网络
docker run -d --network my-bridge-network --name web-server nginx:1.24.0

# 将已运行容器连接到网络
docker network connect my-bridge-network web-server

# 断开容器网络连接
docker network disconnect my-bridge-network web-server

七、Dockerfile 基础

7.1 Dockerfile 的作用

  • 定义:用于自动构建镜像的文本文件
  • 作用:记录镜像构建的所有步骤
  • 优势:实现镜像构建自动化、可复现

7.2 常用 Dockerfile 指令

(1)基础镜像指定
复制代码
FROM centos:7
(2)作者信息
复制代码
MAINTAINER your-name <your-email>
(3)工作目录设置
复制代码
WORKDIR /app
(4)复制文件
复制代码
COPY src/ /app/
(5)安装依赖
复制代码
RUN yum install -y nginx
(6)暴露端口
复制代码
EXPOSE 80
(7)设置环境变量
复制代码
ENV APP_ENV production
(8)定义启动命令
复制代码
CMD ["nginx", "-g", "daemon off;"]

7.3 构建镜像

复制代码
# 构建镜像(-t指定镜像名称:标签)
docker build -t my-nginx:1.0 .

# 命令语法
docker build [OPTIONS] PATH

# 常用参数
-f, --file     # 指定Dockerfile路径
--no-cache     # 不使用缓存构建
--tag, -t      # 指定镜像名称和标签

八、Docker Compose 入门

8.1 Compose 的作用

  • 定义:用于定义和运行多容器 Docker 应用的工具
  • 优势
    • 通过 YAML 文件配置应用服务
    • 一键启动多个相关容器
    • 管理容器间依赖关系

8.2 Compose 文件示例

复制代码
version: '3'
services:
  web:
    build: .
    ports:
      - "80:80"
    depends_on:
      - db
    volumes:
      - ./html:/usr/share/nginx/html
  
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - db-data:/var/lib/mysql

volumes:
  db-data:

8.3 常用 Compose 命令

复制代码
# 启动所有服务
docker compose up

# 后台启动服务
docker compose up -d

# 停止服务
docker compose down

# 查看服务状态
docker compose ps

# 构建服务镜像
docker compose build

# 进入服务容器
docker compose exec web bash

九、总结

通过本笔记,我们系统学习了 Docker 容器技术的核心概念与实践操作:

  1. 核心概念:镜像、容器、仓库的定义与关系
  2. 环境部署:CentOS 系统下 Docker 的安装与配置流程
  3. 镜像操作:获取、查看、管理、迁移镜像的完整命令
  4. 容器操作:创建、启动、停止、删除容器的全生命周期管理
  5. 数据管理:数据卷的创建、挂载与备份恢复
  6. 进阶技能:Dockerfile 与 Compose 的基础使用

Docker 通过轻量级虚拟化技术,极大提升了应用部署效率和资源利用率,是云计算和微服务架构的重要基础设施。建议读者通过实践操作巩固所学知识,逐步掌握 Docker 的高级特性与最佳实践。

十、Docker 应用场景深度解析

10.1 开发环境一致性管理

在软件开发过程中,"在我机器上能运行" 而 "在测试环境不能运行" 的问题屡见不鲜。Docker 通过容器技术为开发团队提供了标准化的开发环境解决方案:

  1. 统一开发环境

    开发人员可基于同一个基础镜像(如node:18python:3.9)构建开发环境,确保团队成员使用相同的运行时环境、依赖库和工具版本。

    复制代码
    # 基于Node.js镜像创建开发环境容器
    docker run -it -v $(pwd):/app -p 3000:3000 node:18 bash
  2. 多服务协同开发

    对于前后端分离项目,可使用 Docker Compose 定义前端、后端、数据库等服务的协同运行环境,避免因环境差异导致的联调问题。

10.2 持续集成 / 持续部署(CI/CD)

Docker 与 CI/CD 流程的结合大幅提升了软件交付效率:

  1. 自动化测试环境

    在代码提交后,CI 系统可自动拉取最新代码,基于 Dockerfile 构建测试容器,执行单元测试和集成测试,确保代码质量。

    复制代码
    # GitLab CI中的Docker测试配置
    test:
      image: maven:3.8-openjdk-17
      script:
        - mvn test
      artifacts:
        paths:
          - target/surefire-reports
  2. 一键部署生产环境

    CD 系统可通过 Docker Compose 或 Kubernetes 将测试通过的容器镜像部署到生产环境,实现 "构建一次,运行处处" 的目标。

10.3 微服务架构实践

Docker 为微服务架构提供了天然的部署载体:

  1. 服务拆分与独立部署

    每个微服务(如用户服务、订单服务)可打包为独立容器,单独迭代和部署,降低服务间耦合度。

    复制代码
    # 部署用户服务容器
    docker run -d -p 8081:8081 -e DB_URL=mysql://user-svc:3306/users user-service:v1.0
  2. 服务弹性伸缩

    通过 Docker Swarm 或 Kubernetes 可根据流量自动调整容器实例数量,例如电商大促期间动态扩容订单服务容器。

10.4 云计算与资源优化

云服务提供商借助 Docker 技术实现资源的高效利用:

  1. 多租户资源隔离

    同一物理服务器上可运行数千个 Docker 容器,每个容器通过命名空间和资源限制实现租户间隔离,相比传统虚拟机大幅提升硬件利用率。

  2. 按需分配计算资源

    用户可根据业务需求动态申请容器化应用,如临时启动大数据分析容器处理批量任务,完成后释放资源,降低成本。

十一、Docker 镜像高级操作

11.1 镜像层原理与 AUFS

Docker 镜像采用分层存储(Layer)机制,基于 AUFS(联合文件系统)实现增量更新:

  1. 镜像层结构

    每个镜像由多个只读层叠加而成,最新层为可写层(容器运行时修改的内容存储在此)。例如nginx:1.24.0镜像可能包含以下层:

    • 基础操作系统层(CentOS 或 Alpine)
    • Nginx 安装包层
    • 配置文件层
    • 静态资源层
  2. 层复用与缓存

    不同镜像可共享相同的基础层,如多个基于python:3.9的镜像只需下载一次基础层。构建镜像时,若某层未修改,Docker 会直接使用缓存。

11.2 镜像构建最佳实践

  1. 分层原则

    • 将不常变更的内容(如基础依赖)放在底层

    • 频繁变更的内容(如应用代码)放在上层

      优化后的Dockerfile分层

      FROM python:3.9-slim AS base
      RUN apt-get update && apt-get install -y gcc

      FROM base AS dependencies
      WORKDIR /app
      COPY requirements.txt .
      RUN pip install --no-cache-dir -r requirements.txt

      FROM dependencies AS app
      COPY . .
      CMD ["python", "app.py"]

  2. 减少镜像大小

    • 使用--no-cache-dir参数避免缓存残留

    • 采用多阶段构建(Multi-Stage Build),仅保留运行时所需文件

      多阶段构建示例

      FROM golang:1.19 AS builder
      WORKDIR /app
      COPY . .
      RUN go build -o myapp

      FROM alpine:3.16
      COPY --from=builder /app/myapp /usr/bin/
      CMD ["myapp"]

11.3 镜像安全管理

  1. 使用官方镜像

    优先从 Docker Hub 官方仓库拉取镜像(如nginxmysql),避免使用未知来源的镜像。

  2. 漏洞扫描

    使用trivyclair等工具扫描镜像漏洞,确保生产环境镜像安全:

    复制代码
    trivy image nginx:1.24.0
  3. 镜像签名与验证

    通过 Docker Content Trust 为镜像添加签名,确保镜像在传输过程中未被篡改。

十二、Docker 容器高级操作

12.1 容器资源限制

  1. 内存限制

    使用-m--memory参数限制容器可用内存,防止单个容器占用过多系统资源:

    复制代码
    # 限制容器最多使用512MB内存
    docker run -d -m 512m --name mysql-server mysql:8.0
  2. CPU 限制

    通过--cpus参数指定容器可使用的 CPU 核心数,适用于多任务并发场景:

    复制代码
    # 限制容器使用2个CPU核心
    docker run -d --cpus 2 --name redis-server redis:7.0
  3. I/O 限制

    使用--device-read-bps--device-write-bps限制容器的磁盘读写速度:

    复制代码
    docker run -d --device-read-bps /dev/sda:10MB --device-write-bps /dev/sda:5MB nginx:1.24.0

12.2 容器检查点与恢复

Docker 支持保存容器状态并在需要时恢复,适用于需要临时暂停的长任务:

  1. 创建检查点

    复制代码
    docker checkpoint create my-container checkpoint1
  2. 查看检查点

    复制代码
    docker checkpoint ls my-container
  3. 从检查点恢复容器

    复制代码
    docker start --checkpoint checkpoint1 my-container

12.3 容器日志管理

  1. 查看容器日志

    使用docker logs命令获取容器运行日志,支持实时跟踪和过滤:

    复制代码
    # 实时跟踪Nginx容器日志
    docker logs -f my-nginx
    # 查看最近100行日志
    docker logs --tail 100 my-nginx
  2. 日志驱动配置

    daemon.json中配置日志驱动(如将日志发送到 ELK Stack):

    复制代码
    {
      "log-driver": "gelf",
      "log-opts": {
        "gelf-address": "udp://192.168.1.100:12201",
        "tag": "docker"
      }
    }

十三、Docker 数据管理进阶

13.1 数据卷驱动扩展

除默认的本地数据卷外,Docker 支持多种数据卷驱动以适应不同场景:

  1. NFS 驱动

    用于容器与远程 NFS 服务器的数据同步,适用于多节点共享数据:

    复制代码
    docker volume create -d nfs \
      --opt server=192.168.1.100 \
      --opt share=/nfs/data \
      nfs-volume
  2. GlusterFS 驱动

    提供分布式存储能力,适合需要高可用性的数据卷:

    复制代码
    docker volume create -d glusterfs \
      --opt volume-name=docker-vol \
      --opt servers=gluster1:gluster2:gluster3 \
      gluster-volume

13.2 数据卷备份自动化

通过 Cron 任务实现数据卷定期备份:

  1. 创建备份脚本

    复制代码
    # backup_volumes.sh
    #!/bin/bash
    DATE=$(date +%Y%m%d)
    VOLUMES=$(docker volume ls -q)
    
    for VOL in $VOLUMES; do
      docker run --rm -v $VOL:/data -v /backup:/backup alpine tar cvf /backup/$VOL-$DATE.tar /data
      gzip /backup/$VOL-$DATE.tar
    done
  2. 设置 Cron 计划

    复制代码
    # 每周日凌晨2点执行备份
    0 2 * * 0 /path/to/backup_volumes.sh

13.3 容器数据迁移方案

  1. 跨主机数据卷迁移

    • 在源主机导出数据卷:

      复制代码
      docker run --rm -v source-vol:/data -v $(pwd):/backup alpine tar cvf /backup/vol.tar /data
    • vol.tar复制到目标主机并导入:

      复制代码
      docker volume create target-vol
      docker run --rm -v target-vol:/data -v $(pwd):/backup alpine tar xvf /backup/vol.tar -C /data
  2. 容器数据批量导出

    复制代码
    # 导出所有容器的文件系统
    for CONTAINER in $(docker ps -a -q); do
      docker export $CONTAINER > $CONTAINER.tar
    done

十四、Docker 网络高级配置

14.1 自定义网络驱动

  1. Macvlan 驱动

    为容器分配物理网络地址,使其直接接入宿主机网络:

    复制代码
    docker network create -d macvlan \
      --subnet=192.168.1.0/24 \
      --gateway=192.168.1.1 \
      --opt parent=eth0 \
      macvlan-network
  2. IPv6 网络支持

    daemon.json中启用 IPv6 并配置子网:

    复制代码
    {
      "ipv6": true,
      "fixed-cidr-v6": "2001:db8::/64"
    }

14.2 容器网络通信

  1. 服务发现与负载均衡

    使用 Docker Swarm 的内置负载均衡功能,通过服务名称实现容器间通信:

    复制代码
    # docker-compose.yml
    version: '3'
    services:
      web:
        image: nginx:1.24.0
        ports:
          - "80:80"
        deploy:
          replicas: 3
          update_config:
            parallelism: 1
            delay: 10s
      db:
        image: mysql:8.0
        environment:
          MYSQL_ROOT_PASSWORD: password
        volumes:
          - db-data:/var/lib/mysql
    volumes:
      db-data:
  2. 网络策略配置

    通过--network-alias为容器设置别名,简化服务间调用:

    复制代码
    docker run -d --network my-network --network-alias api-server my-api:v1

14.3 网络故障排查

  1. 容器网络连接测试

    使用docker exec进入容器后,通过pingtelnet测试网络连通性:

    复制代码
    docker exec -it my-container bash
    ping -c 3 google.com
    telnet db-server 3306
  2. 查看网络配置

    使用docker inspect获取容器网络详细信息:

    复制代码
    docker inspect -f "{{json .NetworkSettings}}" my-container

十五、Docker 安全最佳实践

15.1 容器权限控制

  1. 非 root 用户运行容器

    在 Dockerfile 中使用USER指令切换到非 root 用户:

    复制代码
    FROM ubuntu:22.04
    RUN useradd -m appuser
    WORKDIR /app
    COPY . .
    USER appuser
    CMD ["python", "app.py"]
  2. 限制容器能力

    使用--cap-drop参数移除不必要的系统能力:

    复制代码
    docker run -d --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx:1.24.0

15.2 镜像安全加固

  1. 最小化镜像原则

    • 使用-slim后缀的基础镜像(如python:3.9-slim

    • 移除不必要的工具和库:

      复制代码
      FROM alpine:3.16
      RUN apk add --no-cache nginx && \
          rm -rf /var/cache/apk/*
  2. 镜像漏洞扫描

    在 CI 流程中集成镜像扫描工具,如:

    复制代码
    # Jenkins Pipeline
    stage('Security Scan') {
      steps {
        sh 'trivy image --severity HIGH,CRITICAL my-app:latest'
      }
    }

15.3 运行时安全防护

  1. 启用 Seccomp 配置

    使用预定义的 Seccomp 配置文件限制容器系统调用:

    复制代码
    docker run -d --security-opt seccomp=default nginx:1.24.0
  2. 配置 AppArmor 策略

    在宿主机上为容器应用 AppArmor 配置文件:

    复制代码
    docker run -d --security-opt apparmor=nginx-profile nginx:1.24.0
相关推荐
Jiangnan_Cai1 小时前
Linux 系统 docker 部署 Dify
linux·docker·大模型·dify
LuckyLay1 小时前
使用 Docker 搭建 Rust Web 应用开发环境——AI教你学Docker
前端·docker·rust
mit6.8245 小时前
论容器化 | 分析Go和Rust做医疗的后端服务
docker·golang·rust
阿里云云原生6 小时前
微服务引擎 MSE 及云原生 API 网关 2025 年 6 月产品动态
微服务·云原生·架构
东风微鸣6 小时前
Python 脚本最佳实践2025版
docker·云原生·kubernetes·可观察性
不知疲倦的仄仄7 小时前
2025最新版Docker讲解/面试/命令/容器化技术
运维·docker·容器
哈里谢顿10 小时前
修改并重新部署docker项目流程
docker
David爱编程12 小时前
Deployment vs StatefulSet:怎么选?
后端·云原生·kubernetes
code喵喵12 小时前
docker-compose安装常用中间件
docker·中间件·容器
山岚的运维笔记12 小时前
AlpineLinux使用docker部署prometheus
docker·容器·prometheus