一、Docker
(一)简介
1.优点
Docker 是一个管理容器的引擎,为应用提供打包与部署的平台,本质上是一种轻量级的虚拟化解决方案。
其主要特点与优势包括:
轻量级虚拟化:容器启动速度快(通常仅需数秒),相比传统虚拟机占用更少系统资源。
一致性:保障应用在开发、测试、生产等不同环境中的运行表现一致,消除环境差异带来的问题。
可移植性:容器可在不同平台间无缝迁移,无需重新配置依赖环境,例如从本地直接部署至云端。
高效资源利用:多个容器共享主机操作系统内核,提升系统资源利用率。
易于部署与扩展:支持快速部署新实例,并能根据需求灵活实现水平扩展。
2.应用场景

Docker 作为业务的最小载体,在企业级应用中被广泛采用。通过容器化技术,企业能够更高效地部署应用,同时显著降低资源消耗。其典型应用场景包括:
Docker 为各类云服务模式提供了灵活、可移植的运行环境。
SaaS(软件即服务)
如 APP、微店、网站等前端应用,可通过 Docker 实现快速交付与弹性伸缩,保证多租户环境下的隔离性与稳定性。
PaaS(平台即服务)
如 Redis、MySQL、MongoDB 等中间件与数据服务,借助 Docker 可一键部署、统一管理,简化开发与运维流程。
除此之外,Docker 还广泛应用于以下场景:
持续集成与持续交付(CI/CD)
将构建、测试、部署环境封装为容器,确保流水线各环节环境一致,提升交付效率。
微服务架构
每个微服务独立打包为容器,便于独立开发、部署、扩展和维护。
开发环境快速搭建
开发者可通过 Docker 一键搭建与生产环境一致的本地开发环境,减少"环境不一致"带来的问题。
混合云与多云部署
Docker 容器可在不同云平台或本地数据中心之间无缝迁移,避免厂商锁定,提升业务灵活性。
3.Docker 与虚拟化的对比

|------|-----------------|----------|
| | 虚拟机 | docker容器 |
| 操作系统 | 宿主机上运行虚拟机 OS | 共享宿主机 OS |
| 存储 | 镜像较大(GB) | 镜像小(MB) |
| 性能 | 操作系统额外的cpu、内存消耗 | 几乎无性能损耗 |
| 移植性 | 笨重、与虚拟化技术耦合度高 | 轻量、灵活迁移 |
| 隔离性 | 完全隔离 | 完全隔离 |
| 部署 | 慢、分钟级 | 快速、秒级 |
| 运行密度 | 一般几十个 | 单机支持上千容器 |
(二)容器的工作方式

Docker 采用客户端-服务器(C/S)架构,通过容器化技术实现应用的打包、分发与运行。其核心工作流程可以概括为"构建---分发---运行"。
1.核心组件
|-------------|-------------------------------------------------------|
| 组件 | 说明 |
| Docker 客户端 | 用户与 Docker 交互的入口,通过命令行(如 docker run)向 Docker 守护进程发送指令 |
| Docker 守护进程 | 运行在宿主机上的后台服务,负责管理容器、镜像、网络、存储等资源 |
| Docker 镜像 | 应用的只读模板,包含代码、运行时、系统工具、库等依赖,是容器启动的基础 |
| Docker 容器 | 镜像的可运行实例,通过隔离机制(如 Linux 命名空间和控制组)实现资源隔离与限制 |
| Docker 仓库 | 存储和分发镜像的服务,如 Docker Hub 或私有仓库 |
2.工作流程
构建(Build):开发者通过 Dockerfile 定义应用环境,使用 docker build 命令将应用及其依赖打包为镜像。
分发(Ship):镜像可推送到远程仓库(如 docker push),供团队成员或生产环境拉取使用,实现跨环境迁移。
运行(Run):通过 docker run 命令基于镜像创建并启动容器。每个容器相互隔离,共享宿主机内核,但拥有独立的文件系统、网络和进程空间。
(三)镜像管理
1.镜像结构

Docker 镜像采用分层存储(Layered Storage)的设计,是容器运行的基础。其核心特点如下:
共享宿主机内核:Docker 容器不包含独立的操作系统内核,而是直接使用宿主机的内核,这是其轻量化的根本原因。
Base 镜像提供最小 Linux 发行版:基础镜像仅包含最精简的 Linux 发行版(如 Alpine、Ubuntu Core),通常只有几十到几百 MB。
同一主机支持多种 Linux 发行版:虽然共享宿主机内核,但容器内可运行不同发行版的用户空间(如 Ubuntu 容器与 CentOS 容器可共存于同一宿主机)。
分层结构的优势是共享资源,具体体现在:
存储空间高效:多个容器可以共享同一基础镜像层,无需重复存储。例如,运行 10 个基于Ubuntu 的容器,宿主机上只需保存一份 Ubuntu 基础镜像。
构建速度提升:构建镜像时,若某层未发生变更,Docker 会直接复用缓存层,无需重新构建,大幅加快构建速度。
网络传输优化:拉取或推送镜像时,只传输缺失的层,已存在的层直接从本地复用,节省带宽和时间。
便于版本管理与回滚:每个镜像层对应 Dockerfile 中的一条指令,修改某层时仅影响该层及之后层级,便于追踪变更和回滚到历史版本。
2.镜像运行的基本原理
Docker 镜像采用只读分层结构,当基于镜像创建并运行容器时,会通过 Copy-on-Write(写时复制) 机制在镜像层之上添加一个可写容器层,实现容器的动态读写能力。
文件访问与修改规则:
|------|-------------------------------------------------------|
| 操作类型 | 处理方式 |
| 读取文件 | Docker 从上往下依次查找文件,找到即返回。先查可写容器层,若不存在则逐层向下查找镜像层 |
| 修改文件 | 采用 Copy-on-Write 策略:将文件从只读镜像层复制到可写容器层,然后在可写层进行修改 |
| 删除文件 | 在可写容器层对该文件进行"标记删除"(创建 whiteout 文件),逻辑上隐藏文件,实际镜像层文件仍存在 |
| 新增文件 | 直接写入可写容器层 |
关键特性:
容器层保存变化,镜像本身不变
所有对容器的修改(如新增、修改、删除文件)都记录在可写容器层中,原始镜像层始终保持只读状态。这意味着:
同一个镜像可以启动多个容器,彼此互不干扰
容器销毁后,可写层随之删除,镜像保持不变
镜像最多支持 127 层
由于文件系统结构和性能考虑,Docker 镜像的分层数量上限为 127 层(包含基础镜像层)。在实际构建中,应合理合并指令(如多个 RUN 命令合并为一个),避免层数过多。
高效存储与快速启动
多个容器共享同一镜像的只读层,节省磁盘空间
启动容器时只需创建轻量的可写层,无需复制整个镜像,实现秒级启动
3.镜像获得方式与参数
镜像的来源分为官方提供的基础镜像和企业通过 Dockerfile 定制的业务镜像,获取方式则包括从仓库拉取(docker pull)和从本地文件加载(docker load)。
构建参数:
|------------|--------------------------------------------------------------------------------------------------------------|
| FROM | 指定 base 镜像 eg:FROM busybox:version |
| COPY | 复制文件 eg:COPY file /file 或者 COPY ["file","/"] |
| MAINTAINER | 指定作者信息,比如邮箱 eg:MAINTAINER user@example.com 在最新版的docker中用 LABEL KEY="VALUE"代替 |
| ADD | 功能和copy相似,指定压缩文件或url eg: ADD test.tar /mnt 或者 eg:ADD http://ip/test.tar /mnt |
| ENV | 指定环境变量 eg:ENV FILENAME test |
| EXPOSE | 暴漏容器端口 eg:EXPOSE 80 |
| VOLUME | 申明数据卷,通常指数据挂载点 eg:VOLUME ["/var/www/html"] |
| WORKDIR | 切换路径 eg:WORKDIR /mnt |
| RUN | 在容器中运行的指令 eg: touch file |
| CMD | 在启动容器时自动运行动作可以被覆盖 eg:CMD echo FILENAME 会调用 shell 解析 eg:CMD \["/bin/sh","-c","echo FILENAME"] 不调用 shell 解析 |
| ENTRYPOINT | 和 CMD 功能和用法类似,但动作不可被覆盖 |
(四)镜像仓库的管理
1.仓库介绍

Docker 仓库是用于存储和分发 Docker 镜像的集中式存储库,支持镜像的推送与拉取,是镜像共享与复用的核心组件。
公共仓库:任何人都可访问和使用,开放共享,包含大量官方及第三方镜像,便于快速获取常用软件。
私有仓库:组织或个人自行搭建管理,存储内部镜像,保障安全性和访问控制,适用于定制化业务应用。
优点:
镜像共享:开发者可将镜像推送到仓库,供团队或公众使用
便捷部署:通过 docker pull 直接获取所需镜像,快速部署应用(如 Nginx)
加速开发:复用已有镜像,避免重复构建,提升开发和交付效率
2.docker hub


Docker Hub 是 Docker 官方提供的公共镜像仓库服务,也是 Docker 生态系统中最为知名、使用最广泛的镜像仓库。
关键特点与优势:
涵盖操作系统(Ubuntu、CentOS)、数据库(MySQL、Redis)、编程语言运行时等各类常用镜像。
提供 Docker 官方维护的高质量、高安全性镜像。
支持开发者自由上传和分享镜像,促进知识共享与协作。
每个镜像提供多个版本标签,便于按需选择特定版本。
支持关键词检索,帮助用户快速定位所需镜像。
3.仓库的工作原理
仓库中的三个角色
index docker 索引服务,负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。
registry docker 仓库,是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index。
Auth service 的 Token 的方式进行认证。
Registry Client Docker 充当 registry 客户端来维护推送和拉取,以及客户端的授权。
(1)pull 原理

镜像拉取分为以下几步:
docker 客户端向 index 发送镜像拉去请求并完成与 index 的认证
index 发送认证 token 和镜像位置给 dockerclient
dockerclient 携带 token 和根据 index 指引的镜像位置取连接 registry
registry 会根据 client 持有的 token 跟 index 核实身份合法性
index 确认此 token 合法性
registry 会根据 client 的请求传递镜像到客户端
(2)push原理

镜像上传的步骤:
client 向 index 发送上传请求并完成用户认证
index 会发方 token 给 client 来证明 client 的合法性
client 携带 index 提供的 token 连接 registry
registry 向 index 合适 token 的合法性
index 证实 token 的合法性
registry 开始接收客户端上传过来的镜像
(五)Docker 网络
1.原生 bridge 网络
docker 安装时会创建一个名为 docker0 的 Linux bridge,新建的容器会自动桥接到这个接口。
特点:
容器获得私有 IP,仅在宿主机内部可见,外部主机无法直接访问。
容器通过宿主机 NAT 规则访问外网。
外部如需访问容器服务,需通过端口映射(-p)将容器端口暴露到宿主机。

2.原生 host 网络
Host 模式需要在创建容器时通过 --network=host 参数指定。该模式下,容器直接共享宿主机的网络栈,无需端口映射即可被外部主机直接访问,且网络性能接近原生。但缺点是与宿主机共享网络资源,网络隔离性较差,容易出现端口冲突。适用于对网络性能要求较高、无需严格隔离的场景。

3.原生 none 网络
None 模式需要在创建容器时通过 --network=none 参数指定。该模式下,Docker 会禁用容器的网络功能,容器内部仅有 lo 回环接口,没有网卡、无法访问外网,也无法与其他容器或宿主机进行网络通信。这种模式适用于无需网络连接的场景,如离线任务、网络调试或安全要求极高的容器环境。
4.自定义网络
Docker 提供了三种自定义网络驱动,用户可根据实际需求创建和管理容器网络:
|---------|----------------------------------------------|----------------------------|
| 驱动 | 说明 | 适用场景 |
| bridge | 类似默认的 bridge 模式,但增加了更多自定义功能(如指定网段、网关等) | 单主机内多个容器的网络隔离与通信 |
| overlay | 支持跨主机的容器通信,通常配合 Docker Swarm 或 Kubernetes 使用 | 多主机集群环境下的容器互联 |
| macvlan | 为容器分配独立的 MAC 地址,使其在网络上表现为物理设备 | 需要容器直接接入物理网络、与 legacy 系统集成 |
优势:
精细控制通信:通过自定义网络,可以精确控制哪些容器可以相互通信,实现网络隔离与安全策略。
自动 DNS 解析:在同一自定义网络中的容器,可通过容器名称直接相互访问,无需依赖 IP 地址,Docker 会自动进行 DNS 解析。
Docker 自定义网络默认选择桥接模式,因为它在单主机场景下兼顾了易用性、性能与隔离性,无需额外依赖即可满足绝大多数容器网络需求。桥接默认是单调递增,也支持自定义子网和网关。
5.joined****容器网络

Joined 容器是 Docker 的一种特殊网络模式,需要在创建容器时通过 --network=container:<容器名> 参数指定,使其与指定容器共享同一个网络栈。
核心特点:
新容器与目标容器共用同一个网络命名空间,包括 IP 地址、端口范围、网络接口等。
两个容器之间可通过 localhost 直接通信,无需经过网桥或 NAT 转发,网络性能极高。
共享同一 IP 地址,端口资源也需协调使用,避免冲突
(六)容器内外网的访问
1.容器访问外网

Docker 容器通过宿主机的网络地址转换(NAT)机制实现对外网的访问,不同操作系统版本采用了不同的底层技术实现。
工作流程:
容器(如 busybox)发起对外网(如 www.bing.com)的访问请求
请求通过容器网络接口发送至 docker0 网桥
宿主机根据 NAT 规则,将源地址从容器私有 IP(172.17.0.2)伪装为宿主机网卡 IP(10.0.2.15)
请求经宿主机网卡发出至外网
响应数据返回宿主机后,NAT 规则将目标地址还原为容器 IP,转发回容器
2.外网访问docker容器

Docker 通过端口映射机制,将容器内部服务暴露给外部网络访问,解决容器私有 IP 无法被外部直接访问的问题。
工作流程:
入站访问(外部访问容器)
外部客户端访问宿主机的映射端口(如 10.0.2.15:32773)
docker-proxy 进程或 iptables 规则捕获请求
请求被转发至容器的目标端口(如 172.17.0.3:80)
容器处理请求并返回响应
出站访问(容器访问外网)
容器通过 NAT 地址伪装访问外网,与端口映射机制相互独立
(七)Docker 跨主机网络
生产环境中容器分布在不同宿主机上,需要具备跨主机通信能力。主要解决方案包括 Docker 原生的 overlay 和 macvlan,以及第三方方案 Flannel、Weave、Calico 等。
这些网络方案能够与 Docker 集成,得益于 libnetwork------Docker 的容器网络库,它实现了 CNM(容器网络模型)。CNM 对容器网络进行抽象,定义了沙盒、端点、网络三个核心概念,并通过插件化架构允许各类网络驱动以统一方式接入,从而实现跨主机网络的灵活扩展。
1.CNM

组件分类:
Sandbox:容器网络栈,包含容器接口、dns、路由表。(namespace)
Endpoint:作用是将sandbox接入n etwork (veth pair)
Network:包含一组 endpoint,同一 network 的 endpoint 可以通信
2.macvlan
Macvlan 是 Linux 内核提供的一种网卡虚拟化技术,Docker 利用它实现高性能的容器网络方案。
特点:
高性能------无需 Linux bridge,容器直接使用宿主机物理网卡,网络性能接近原生,无 NAT 转换开销。
直接通信------容器接口与主机网卡直连,外部主机可通过容器 IP 直接访问,无需端口映射。
独占与共享------macvlan 会独占主机网卡,但可通过 VLAN 子接口实现多个 macvlan 网络共存
网络隔离与连通:
不同 macvlan 网络的容器在二层上相互隔离,无法直接通信。可通过三层网关(路由器或三层交换机)实现跨 macvlan 网络的通信。
Docker 本身不对 macvlan 网络间的通信做额外限制,管理员可像管理传统 VLAN 网络一样,通过配置网关路由来控制网络间的访问策略。
(八)数据卷管理及优化
1.介绍

Docker 数据卷是一个可供容器使用的特殊目录,它绕过了容器的联合文件系统,直接将数据存储在宿主机上,实现了数据与容器的解耦。
特点:
数据持久化------数据卷独立于容器生命周期,即使容器被删除或重新创建,数据仍然保留,不会丢失。
数据共享------多个容器可以同时挂载同一个数据卷,实现数据的共享与交互。
独立生命周期------数据卷的生命周期不受容器启动、停止、删除的影响,需手动管理
2.使用数据卷的原因
Docker 的分层文件系统是基于联合挂载技术实现的,镜像由多个只读层堆叠而成,容器运行时在最上层添加一个可写层。这种设计使得多个容器可以共享相同的镜像层,有效节省存储空间并加速镜像构建。然而,分层文件系统也存在明显的性能短板:当容器需要修改文件时,必须通过 Copy-on-Write 机制将文件从只读层复制到可写层后再进行修改,这一过程带来了额外的 I/O 开销,尤其是对于频繁写入的应用场景,性能表现远不如直接读写宿主机磁盘。此外,可写层的生命周期与容器严格绑定,一旦容器被删除,该层中存储的所有数据都会随之消失,无法实现数据的持久化保存。因此,分层文件系统更适合存放临时性数据或无需长期保留的缓存文件,对于需要持久化的重要数据则显得力不从心。
数据卷是 Docker 为解决分层文件系统的性能和持久化问题而提供的一种存储机制。它绕过了容器的联合文件系统,直接将数据挂载到宿主机磁盘上,使容器可以像访问普通目录一样进行读写操作。由于没有了分层叠加和 Copy-on-Write 的开销,数据卷的性能与宿主机原生磁盘性能完全一致,特别适合数据库、日志存储等高频 I/O 场景。更重要的是,数据卷的生命周期独立于容器,即使容器被删除、重建或停止,数据卷中的内容依然完好保留,真正实现了数据的持久化存储。但数据卷也有其局限性:它仅存在于本地磁盘,无法随容器自动迁移到其他宿主机,这意味着在多主机环境下需要配合分布式存储或集群编排工具来管理数据迁移和高可用。
Docker 支持两种主要的数据卷挂载方式,以满足不同场景的使用需求。
第一种是 bind mount,它允许用户将宿主机上的任意指定目录或文件直接挂载到容器内部,路径完全由用户掌控,适合需要与宿主机现有文件系统交互的场景,如开发环境中的代码热同步、配置文件注入等。
第二种是 docker managed volume(也称为命名卷或匿名卷),这类数据卷由 Docker 统一管理,存储在 Docker 托管的目录(如 /var/lib/docker/volumes/)下,用户只需指定卷名或让 Docker 自动生成即可使用,无需关心宿主机上的具体路径,更适合生产环境中由编排工具统一调度和管理的持久化存储场景。
两种方式各有侧重:bind mount 强调灵活性和可控性,managed volume 则更便于 Docker 进行统一管理和生命周期维护。
3.两类数据卷对比
|-----------------------|-----------------------------|-----------------|-----------|----------------|------------------|
| | volume 位置 | 对已有 mount point | 是否支持单个文件 | 权限控制 | 移植性 |
| bind mount | 可任意指定 | 隐藏并替换为 volume | 支持 | 可设置为只读,默认为读写权限 | 弱,与 host path 绑定 |
| docker managed volume | /var/lib/docker/volumes/... | 原有数据复制到volume | 不支持,只能是目录 | 无控制,均为读写权限 | 强,无需指定 host 目录 |
(九)安全优化
1.命名空间隔离的安全
当执行 docker run 启动容器时,Docker 会在后台为容器创建一系列独立的 Linux Namespace,这是实现容器隔离最基础、最核心的机制。
Namespace 是 Linux 内核提供的一种资源隔离技术,它让每个容器都拥有自己独立的资源视图,包括:
|------|----------------------|
| 类型 | 隔离的资源 |
| PID | 进程 ID,容器内只能看到自己的进程 |
| NET | 网络栈,包括网络设备、IP 地址、端口等 |
| MNT | 文件系统挂载点 |
| UTS | 主机名和域名 |
| IPC | 进程间通信资源(信号量、消息队列等) |
| USER | 用户和用户组 ID |
通过这些命名空间,每个容器仿佛运行在一个独立的系统环境中,彼此互不干扰。
2.控制组资源控制的安全
当执行 docker run 启动容器时,Docker 会在后台为容器创建一套独立的 Linux Cgroups(控制组) 策略集合,用于对容器的资源使用进行限制、记录和隔离。
Cgroups 是 Linux 内核提供的一项特性,它可以将进程组织成层次化分组,并对分组内的资源使用进行精细化管理。在 Docker 中,Cgroups 主要发挥以下作用:
确保各容器可以公平地分享宿主机的内存、CPU、磁盘 I/O 等资源,避免某个容器占用过多资源导致其他容器无法正常运行。
为每个容器设置资源使用上限,防止单个容器消耗过多系统资源。
确保容器内的资源压力不会影响到本地主机系统和其他容器,保障宿主机稳定运行。
在防止拒绝服务攻击(DDoS)方面必不可少,即使某个容器被攻击或出现资源泄漏,也不会拖垮整个宿主机。
Cgroups 可控制的资源类型:
|--------|---------------------------------|
| CPU | 限制容器使用的 CPU 时间片、CPU 核心数等 |
| 内存 | 限制容器可使用的内存总量,超出可能触发 OOM(内存溢出)终止 |
| 磁盘 I/O | 限制容器对磁盘的读写速率和 IOPS(每秒输入输出操作次数) |
| 网络宽带 | 限制容器的网络流量(需配合其他工具) |
| 进程数 | 限制容器内可创建的进程总数(pids 子系统) |
3.内核能力机制
Capability 是 Linux 内核提供的细粒度权限控制特性,将 root 的超级权限拆分为多个独立的小权限单元。
在容器环境中,大多数应用并不需要真正的 root 权限,只需少数核心能力即可正常运行。因此,Docker 默认采用"白名单"机制:只保留容器运行所必需的能力(如绑定端口、修改文件属主等),禁用其他所有非必需权限。这种"最小权限"原则有效降低了容器被攻破后的提权风险,用户也可通过 --cap-add 和 --cap-drop 按需调整容器的能力范围。
4.Docker 服务端防护
Docker 服务端是容器管理的核心,保障其安全性至关重要,主要从以下三个方面进行防护:
访问权限控制------确保只有可信用户才能访问 Docker 服务端,防止未授权操作 。
用户权限映射------将容器内的 root 用户映射为宿主机上的非 root 用户,降低权限提升风险 。
服务端最小权限运行------允许 Docker 服务端以非 root 权限运行,通过安全子进程在限定范围内执行特权操作 。
(十)容器编排工具****Docker Compose
1.概述
Docker Compose 是 Docker 官方提供的多容器应用编排工具,通过一个 docker-compose.yml 配置文件,可以一次性定义、启动和管理多个相互关联的容器(如 Web 应用、数据库、缓存等)。使用 Compose 时,只需执行 docker-compose up 命令,即可按照配置自动完成所有容器的创建、网络连接和启动工作,无需手动逐个运行容器。它能够确保开发、测试、生产环境配置的一致性,并支持批量启动、停止、查看日志等便捷操作,大大简化了复杂应用的部署与管理流程。
2.主要功能
定义服务:
使用 YAML 格式的配置文件来定义一组相关的容器服务。每个服务可以指定镜像、端口映射、
环境变量、存储卷等参数。例如,可以在配置文件中定义一个 Web 服务和一个数据库服务,以及它们之间的连接关系。
一键启动和停止:
通过一个简单的命令,可以启动或停止整个应用程序所包含的所有容器。这大大简化了多容器
应用的部署和管理过程。例如,使用 docker-compose up 命令可以启动配置文件中定义的所有服务,使用 docker-compose down 命令可以停止并删除这些服务。
服务编排:
可以定义容器之间的依赖关系,确保服务按照正确的顺序启动和停止。例如,可以指定数据库
服务必须在 Web 服务之前启动。
支持网络配置,使不同服务的容器可以相互通信。可以定义一个自定义的网络,将所有相关的
容器连接到这个网络上。
环境变量管理:
可以在配置文件中定义环境变量,并在容器启动时传递给容器。这使得在不同环境(如开发、
测试和生产环境)中使用不同的配置变得更加容易。例如,可以定义一个数据库连接字符串的环境变量,在不同环境中可以设置不同的值。
3.工作原理
读取配置文件:Docker Compose 读取 YAML 配置文件,解析其中定义的服务和参数。
创建容器:根据配置文件中的定义,Docker Compose 调用 Docker 引擎创建相应的容器。它会下载所需的镜像(如果本地没有),并设置容器的各种参数。
管理容器生命周期:Docker Compose 监控容器的状态,并在需要时启动、停止、重启容器。
它还可以处理容器的故障恢复,例如自动重启失败的容器。
Docker Compose 中的管理层:
服务 (service) 一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
项目 (project) 由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
容器(container)容器是服务的具体实例,每个服务可以有一个或多个容器。容器是基于服务定义的镜像创建的运行实例。
4.常用命令参数
(1)服务管理
docker-compose up:
启动配置文件中定义的所有服务。
可以使用 -d 参数在后台启动服务。
可以使用 -f 来指定 yaml 文件
docker-compose down :
停止并删除配置文件中定义的所有服务以及相关的网络和存储卷。
docker-compose start :
启动已经存在的服务,但不会创建新的服务。
docker-compose stop :
停止正在运行的服务。
docker-compose restart :
重启服务。
(2)服务状态查看
docker-compose ps :
列出正在运行的服务以及它们的状态,包括容器 ID、名称、端口映射等信息。
docker-compose logs :
查看服务的日志输出。可以指定服务名称来查看特定服务的日志。
(3)构建和重新构建服务
docker-compose build :
构建配置文件中定义的服务的镜像。可以指定服务名称来只构建特定的服务。
docker-compose up --build :
启动服务并在启动前重新构建镜像。
(4)其他操作
docker-compose exec :
在正在运行的服务容器中执行命令。
docker-compose pull :
拉取配置文件中定义的服务所使用的镜像。
docker-compose config :
验证并查看解析后的 Compose 文件内容。
5.Docker Compose的yaml****文件
(1)服务名称
每个服务在配置文件中都有一个唯一的名称,用于在命令行和其他部分引用该服务。

(2)镜像
指定服务所使用的 Docker 镜像名称和标签。例如, image: nginx:latest 表示使用 nginx 镜像的最新版本。

(3)端口映射
将容器内部的端口映射到主机的端口,以便外部可以访问容器内的服务。例如,- "8080:80" 表示将主机的 8080 端口映射到容器内部的 80 端口。

(4)环境变量
为容器设置环境变量,可以在容器内部的应用程序中使用。例如, VAR1: value1 设置环境变
量 VAR1 的值为 value1

(5)存储卷
将主机上的目录或文件挂载到容器中,以实现数据持久化或共享。如 -/host/data:/container/data 将主机上的 /host/data 目录挂载到容器内的 /container/data 路径。

(6)网络
将服务连接到特定的网络,以便不同服务的容器可以相互通信。



(7)命令
覆盖容器启动时默认执行的命令。例如, command: python app.py 指定容器启动时运行
python app.py 命令

(十一)Docker 实验
1.部署 docker
配置软件仓库:

检测仓库:


安装 docker:

配置网络环境,修改内核参数:



使配置生效:

重启 docker:


2.配置 docker 加速器



3.docker 常用命令
镜像查看:

搜索镜像:

下载镜像:


查看镜像提交历史:

导出镜像:


删除镜像:

导入镜像:

运行镜像:

查看运行容器:

查看所有容器:

交互模式运行容器(默认退出后会停止):

运行停止的容器:

退出交互容器不对其停止(按 [ctrl]+[p]+[q] ):

查看容器信息:

容器控制:


在已经运行的容器中执行指定命令(非交互):

(交互):

容器删除:



内容提交:



文件在镜像中的复制:

4.容器外部网络访问





5.镜像构建参数
建立构建目录:

编写构建规则文件:

(1)COPY 方式复制


构建命令:


(2)ADD 方式复制



可以进行解压缩:

或者:



(3)ENV 设置环境变量



(4)EXPOSE 定义端口



(5)VOLUEM 创建挂载点


测试(运行后开另一个窗口):



在容器中:

(6)WORKDIR 设置工作目录



(7)CMD 指定容器启动时默认执行的命令
容易被覆盖:



(8)ENTRYPOINT
不容易被覆盖:


6.构建 centos 可用仓库
下载 centos 的安装包,并将镜像导入容器:

容器中:









7.镜像构建的优化









优化之后:


占用空间变小了:













8.docker 仓库
(1)准备
新增一台主机后,将文件复制给新主机:



加载内核模块,重启参数:

在新主机安装并启动 docker:


(2)非加密仓库构建
导入镜像文件:

启动仓库容器:

查看是否挂载:



修改配置,使其成功推送镜像:



查看是否生效:









(3)仓库的加密传输及用户认证
清除之前改的配置信息:

生成加密证书:



启动仓库:


node2 也一样:

创建目录存放证书,推送镜像:

验证:

为仓库建立登录验证:




登录后才能拉取镜像成功:



(4)harbor仓库构建
解压 harbor 安装包到 opt 目录:

创建 harbor 数据目录:

创建并编辑配置文件:



加载镜像:


查看所有容器,均为 up 状态:

网页访问:

登录:


上传镜像:


9.docker 网络
(1)自建网络网桥模式
默认使用桥接网络:

创建一个新容器,并查看 IP 地址:


检查能否正常访问:

假设停止 web 容器进程,运行 busybox 容器:

重新启动 busybox 容器后,再次启动 web 容器,发现容器 IP 拒绝连接:

容器启动时,Docker 从地址池中分配一个空闲 IP,如果停止后则 IP 被释放回地址池。待新容器启动,会获取最早可用的空闲 IP:


容器之间互相访问不要依赖 IP 地址,要用不会变化的容器名称:



交换一下先后开启顺序,会发现 web 的 IP 地址从0.3变为0.2(docker 原生网络是不支持 dns 解析的,自定义网络中内嵌了 dns ):


不同的自定义网络之间不能通讯(处在不同网段):







(2)不同网络栈的通信方法


由原本的两块网卡变成了三块,且原来不能 ping 通的地址,也能成功通讯:


(3)joined 容器网络
加载镜像:


现在容器内没有运行任何 web:



创建新容器,并设置为 joined 网络模式,处于这个模式下的 docker 容器会共享一个网络栈:


(4)joined 网络企业项目实践
删除旧镜像(可用此语句):

导入镜像:

运行 php-myadmin 容器和 mysql:


访问 php-myadmin:


(5)日容器跨主机通信
两台主机添加网卡并设定为 host-only 模式:

开启新加网卡的混杂模式:


配置 docker 自建 Macvlan 网络:


测试跨主机 docker 是否可以通信:




10.docker 数据卷
(1)bind_mount 数据卷
同时开两个窗口,bind_mount 可以将主机上的目录或文件 mount 到容器里。指定的路径如果不存在,挂载时会自动创建:


只读挂载:

(2)docker managed 数据卷
docker managed volume 不需要指定 mount源,docker 自动为容器创建数据卷目录,且目录默认在 /var/lib/docker/volumes 中:




建立数据卷:


查看卷:

使用数据卷:

(3)数据卷容器
建立数据卷容器:

使用数据卷容器:

(4)备份和迁移数据卷
建立容器并指定使用卷到要备份的容器:

数据恢复:

11.docker 的安全优化
(1)更改系统 cgroup 版本


(2)docker 资源限制
cpu 的用量:

cpu 资源限制:

cpu 优先级(确保系统中只有一个 cpu 核心在运行):




资源限制:

(3)限制内存使用



(4)磁盘 io 限制

写入速率限制:

(5)容器特权


开启指定白名单权限:


12.容器编排工具 docker compose
(1)常用命令




启动配置文件中定义的所有服务(-d 在后台启动,-f 指定文件):

列出正在运行的服务以及它们的状态,包括容器 ID、名称、端口映射等信息:



停止并删除配置文件中定义的所有服务以及相关的网络和存储卷:

启动已经存在的服务,但不会创建新的服务:

停止正在运行的服务:

重启服务:

查看服务的日志输出。可以指定服务名称来查看特定服务的日志:

(2)对于镜像的预处理




提前构建:


(3)yml 文件的 services 部分
端口暴露及端口映射:





环境变量设定:

测试:

数据卷:


网络设定:


(4)yml 文件的项目部分
default 网络(不写网络配置时,compose 会自动创建 default 网络,且容器也默认使用此网络):



测试:

自建网络:



存储部分:


测试:


(5)企业应用示例
利用容器编排完成 haproxy 和 nginx 负载均衡架构实施









测试:
