一 Docker简介及部署方法1.1 Docker简介Docker之父Solomon HykesDocker就好比传统的货运集装箱Note 2008 年LXC(LinuX Contiainer)发布但是没有行业标准兼容性非常差docker2013年首次发布由Docker, Inc开发1.1.1 什么是dockerDocker是管理容器的引擎为应用打包、部署平台而非单纯的虚拟化技术 它具有以下几个重要特点和优势1. 轻量级虚拟化 Docker 容器相较于传统的虚拟机更加轻量和高效能够快速启动和停止节省系统资源。 例如启动一个 Docker 容器可能只需要几秒钟而启动一个虚拟机则可能需要几分钟。2. 一致性 . 致性 确保应用程序在不同的环境中如开发、测试、生产具有一致的运行表现。 无论在本地还是云端应用的运行环境都能保持相同减少了因环境差异导致的问题。3. 可移植性 可以轻松地将 Docker 容器从一个平台迁移到另一个平台无需担心依赖和环境配置的差 异。比如在本地开发的容器可以无缝部署到云服务器上。4. 高效的资源利用多个 Docker 容器可以共享主机的操作系统内核从而更有效地利用系统资 源。5. 易于部署和扩展能够快速部署新的应用实例并且可以根据需求轻松地进行水平扩展。总之Docker 极大地简化了应用程序的开发、部署和管理流程提高了开发效率和运维的便利性。 它在现代软件开发和云计算领域得到了广泛的应用。1.1.2 docker在企业中的应用场景在企业中docker作为业务的最小载体而被广泛应用通过docker企业可以更效率的部署应用并更节省资源IaaSInfrastructure as a Service即基础设施即服务PaaS是Platform as a Service即指平台即服务SaaSSoftware as a Service软件运营服务是1.1.3 docker与虚拟化的对比1.1.4 docker的优势对于开发人员Build once、Run anywhere。对于运维人员Configure once、Run anything容器技术大大提升了IT人员的幸福指数二 Docker的基本操作2.1 容器工作方法2.2 部署第一个容器2.2.1 配置软件仓库2.2.2 安装docker-ce并启动服务#编辑docker启动文件设定其使用iptables的网络设定方式默认使用nftables#启动docker#激活内核网络选项#设定docker加速器2.3 Docker镜像管理2.3.1 搜索镜像2.3.2 拉取镜像2.3.3 查看镜像信息2.3.4 导出镜像2.3.5.导入镜像2.3.6删除镜像2.4 容器的常用操作2.4.1 启动容器参数的作用-d #后台运行-i #交互式运行-t #打开一个终端--name #指定容器名称-p #端口映射 -p 808080 把容器8080端口映射到本机80端口--rm #容器停止自动删除容器--network #指定容器使用的网络交互式运行容器#交互运行容器默认退出后会停止2.4.2 查看容器运行信息2.4.3 停止和运行容器非交互2.4.4.删除容器2.4.5 容器内容提交默认情况下容器被删除后在容器中的所有操作都会被清理包括要保存的文件如果想永久保存那么我们需要把动作提交提交后会生成新的镜像当我们在运行新镜像后即可看到我们提交的内容[rootdocker-node1 ~]# docker run -it --name test busybox:latest/ # touch /root/file/ # ls /root/filectrlqp 退出当前环境并继续运行容器[rootdocker-node1 ~]# docker commit -m add file test busybox-file:latestsha256:31a32089d241d025a5a54f144f15319cc6fb55be1b41d049f8905a472d5a028e[rootdocker-node1 ~]# docker imagesi Info → U In UseIMAGE ID DISK USAGE CONTENT SIZE EXTRAbusybox-file:latest 31a32089d241 6.71MB 2.21MB[rootdocker-node1 ~]# docker run -it --name test busybox-file:latest2.4.6 系统中的文件和容器中的文件传输2.4.7 查询容器内部日志三 docker镜像构建3.1 docker镜像结构共享宿主机的kernelbase镜像提供的是最小的Linux发行版同一docker主机支持运行多种Linux发行版采用分层结构的最大好处是共享资源3.2 镜像运行的基本原理Copy-on-Write 可写容器层容器层以下所有镜像层都是只读的docker从上往下依次查找文件容器层保存镜像变化的部分并不会对镜像本身进行任何修改一个镜像最多127层3.3 镜像获得方式基本镜像通常由软件官方提供企业镜像可以用官方镜像Dockerfile来生成系统关于镜像的获取动作有两种docker pull 镜像地址docker load –i 本地镜像包3.4 镜像构建3.4.1 构建参数参数示例用法#FROM LABEL COPTY ADD 示例#注意add可以解压缩,COPY不能验证EXPOSE验证VOLUME验证WORKDIR验证 CMD可被覆盖方法2验证验证 ENTRYPOINT不可被覆盖3.4.2 Dockerfile实例我这里是先准备了一个centos-7 的文件所以用load -i 导入镜像如果你没有文件的话就用前面的拉取镜像命令3.5 镜像优化方案3.5.1 镜像优化策略选择最精简的基础镜像减少镜像的层数清理镜像构建的中间产物3.5.2 镜像优化示例方法1.缩减镜像层方法(1)此方法创建容器很大不建议可以看见容器运行成功方法2此方法容器大小减少明显方法2.多阶段构可以清晰看到此方法的镜像更小了验证方法跟前面一样。方法3.使用最精简镜像先准备图中框中的包再导入镜像。可以运行说明实验成功镜像变得很小了四 docker 镜像仓库的管理4.1 什么是docker仓库Docker 仓库Docker Registry 是用于存储和分发 Docker 镜像的集中式存储库。它就像是一个大型的镜像仓库开发者可以将自己创建的 Docker 镜像推送到仓库中也可以从仓库中拉 取所需的镜像。Docker 仓库可以分为公共仓库和私有仓库公共仓库如 Docker Hub任何人都可以访问和使用其中的镜像。许多常用的软件和应用都有在 Docker Hub 上提供的镜像方便用户直接获取和使用。例如您想要部署一个 Nginx 服务器就可以从 Docker Hub 上拉取 Nginx 的镜像。私有仓库则是由组织或个人自己搭建和管理的用于存储内部使用的、不希望公开的镜像。 比如一家企业为其特定的业务应用创建了定制化的镜像并将其存储在自己的私有仓库中 以保证安全性和控制访问权限。通过 Docker 仓库开发者能够方便地共享和复用镜像加速应用的开发和部署过程。4.2 docker hubDocker Hub 是 Docker 官方提供的一个公共的镜像仓库服务。它是 Docker 生态系统中最知名和广泛使用的镜像仓库之一拥有大量的官方和社区贡献的镜像。 以下是 Docker Hub 的一些关键特点和优势1. 丰富的镜像资源涵盖了各种常见的操作系统、编程语言运行时、数据库、Web 服务器等众多应用 的镜像。例如您可以轻松找到 Ubuntu、CentOS 等操作系统的镜像以及 MySQL、Redis 等数据库 的镜像。2. 官方支持提供了由 Docker 官方维护的一些重要镜像确保其质量和安全性。3. 社区贡献开发者们可以自由上传和分享他们创建的镜像促进了知识和资源的共享。4. 版本管理对于每个镜像通常都有多个版本可供选择方便用户根据需求获取特定版本。5. 便于搜索用户可以通过关键词轻松搜索到所需的镜像。4.3 docker仓库的工作原理仓库中的三个角色 index docker索引服务负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。registry docker仓库是镜像和图表的仓库它不具有本地数据库以及不提供用户认证通过Index Auth service的Token的方式进行认证Registry Client Docker充当registry客户端来维护推送和拉取以及客户端的授权。4.3.1 pull原理镜像拉取分为以下几步1.docker客户端向index发送镜像拉去请求并完成与index的认证2.index发送认证token和镜像位置给dockerclient3.dockerclient携带token和根据index指引的镜像位置取连接registry4.Registry会根据client持有的token跟index核实身份合法性5.index确认此token合法性 6.Registry会根据client的请求传递镜像到客户端4.3.2 push原理镜像上传的步骤1.client向index发送上传请求并完成用户认证2.index会发方token给client来证明client的合法性3.client携带index提供的token连接Registry4.Registry向index合适token的合法性5.index证实token的合法性6.Registry开始接收客户端上传过来的镜像4.3 搭建docker的私有仓库4.3.1 为什么搭建私有仓库docker hub虽然方便但是还是有限制需要internet连接速度慢所有人都可以访问由于安全原因企业不允许将镜像放到外网好消息是docker公司已经将registry开源我们可以快速构建企业私有仓库地址 https://docs.docker.com/registry/deploying/4.3.2 搭建简单的Registry仓库1.下载Registry镜像我是提前准备的包所以不需要拉取镜像注意此方法安全度低不推荐使用。输入自己的IP配置非加密端口客户端给客户也配置非加密端口4.3.3 为Registry提加密传输将之前的非加密删掉服务端客户端加密实验#生成认证key和证书查看证书#启动registry仓库测试#docker客 户端没有key和证书所以会有最后面的报错。#为客户端建立证书之后就成功了。4.3.4 为仓库建立登陆认证#安装建立认证文件的工具包#建立认证文件#添加认证到registry容器中上传镜像没有成功进行登录认证认证之后就能够上传了。客户端想要访问的话需要认证文件登录验证否则不能用。4.4 构建企业级私有仓库下载软件包地址https://github.com/goharbor/harbor/releasesHarbor 是由vmware公司开源的企业级 Docker Registry 项目。它提供了以下主要功能和特点1. 基于角色的访问控制RBAC可以为不同的用户和用户组分配不同的权限增强了安全性和管理 的灵活性。2. 镜像复制支持在不同的 Harbor 实例之间复制镜像方便在多个数据中心或环境中分发镜像。 3. 图形化用户界面UI提供了直观的 Web 界面便于管理镜像仓库、项目、用户等。4. 审计日志记录了对镜像仓库的各种操作有助于追踪和审查活动。5. 垃圾回收可以清理不再使用的镜像节省存储空间4.4.1 部署harbor就改以下三个地方#管理harbor的容器4.4.2 管理仓库1.登陆2.建立仓库项目!错误问题注意这个可能是docker版本问题下载其他版本试一下。这里把docker重新下载了所以要将前面刚安装时的准备工作再做一遍如vim 部分。假如我需要上传红色部分的镜像我需要先打上标签再登录加密仓库最后把镜像上传。客户端拉取镜像也是要先重新下载docker按照之前的部署准备再登录仓库认证最后就拉取成功了。可以看到成功获取五 Docker 网络docker的镜像是令人称道的地方但网络功能还是相对薄弱的部分docker安装后会自动创建3种网络bridge、host、none5.1 docker原生bridge网路原生bridge网络ip会因为开启容器顺序而改变原生网络不会自动解析docker安装时会创建一个名为 docker0 的Linux bridge新建的容器会自动桥接到这个接口bridge模式下容器没有一个公有ip只有宿主机可以直接访问外部主机是不可见的。容器通过宿主机的NAT规则后可以访问外网5.2 docker原生网络hosthost网络模式需要在容器创建时指定 --networkhosthost模式可以让容器共享宿主机网络栈这样的好处是外部主机与容器直接通信但是容器的网络缺少 隔离性如果公用一个网络那么所有的网络资源都是公用的比如启动了nginx容器那么真实主机的80端口被占 用在启动第二个nginx容器就会失败5.3 docker 原生网络nonenone模式是指禁用网络功能只有lo接口在容器创建时使用--networknone指定。5.4 docker的自定义网络自定义网络模式docker提供了三种自定义网络驱动bridgeoverlaymacvlanbridge驱动类似默认的bridge网络模式但增加了一些新的功能overlay和macvlan是用于创建跨主机网络建议使用自定义的网络来控制哪些容器可以相互通信还可以自动DNS解析容器名称到IP地址。5.4.1 自定义桥接网络在建立自定义网络时默认使用桥接模式删除自定义网络要先把使用了自定义网络的容器关闭才能删除否则会出现跟我一开始的报错5.4.2 为什么要自定义桥接多容器之间如何互访通过ip可以但是有什么问题如果通过IP的话会因为开启容器的顺序而改变IP所以我们要用名字来进行解析访问这样的话不管IP是多少只要名字没有改变它的IP就可以通过解析来获取docker引擎在分配ip时时根据容器启动顺序分配到谁先启动谁用是动态变更的 多容器互访用ip很显然不是很靠谱那么多容器访问一般使用容器的名字访问更加稳定 docker原生网络是不支持dns解析的自定义网络中内嵌了dns自定义两个网络my_net1 是172.18网段。my_net2 是19网段。注意不同的自定义网络是不能通讯的5.4.3 如何让不同的自定义网络互通可以看到不能对my_net2访问。#在上面modest_mendeleev 容器中加入网络my_net2.现在可以对my_net2访问5.4.4 joined容器网络Joined容器一种较为特别的网络模式•在容器创建时使用--networkcontainer:vm1指定。vm1指定 的是运行的容器名处于这个模式下的 Docker 容器会共享一个网络栈这样两个容器之间可以使用localhost高效快速通 信。可以看到它的IP是172.17.0.3可以看到他们两个容器的IP是一样的。5.4.5 joined网络示例演示一. 导入镜像二.运行php-myadmin mysql 容器四.访问phpmyadmin开启的phpmyadmin容器中是没有数据库的这里填写的localhost:3306 是因为mysql容器和phpmyadmin容器公用一个网络站5.5. 容器内外网的访问5.5.1 容器访问外网在rhel7中docker访问外网是通过iptables添加地址伪装策略来完成容器网文外网在rhel7之后的版本中通过nftables添加地址伪装来访问外网再去访问外网就不能访问了5.5.2 外网访问docker容器端口映射 -p 本机端口:容器端口来暴漏端口从而达到访问效果docker-proxy和dnat在容器建立端口映射后都会开启那个传输速录高走那个5.6 docker跨主机网络在生产环境中我们的容器不可能都在同一个系统中所以需要容器具备跨主机通信的能力跨主机网络解决方案docker原生的overlay和macvlan第三方的flannel、weave、calico众多网络方案是如何与docker集成在一起的libnetwork docker容器网络库CNM Container Network Model这个模型对容器网络进行了抽象5.6.1 CNM Container Network ModelCNM分三类组件Sandbox容器网络栈包含容器接口、dns、路由表。namespaceEndpoint作用是将sandbox接入network veth pairNetwork包含一组endpoint同一network的endpoint可以通信5.6.2 macvlan网络方式实现跨主机通信macvlan网络方式1.Linux kernel提供的一种网卡虚拟化技术。2.无需Linux bridge直接使用物理接口性能极好3.容器的接口直接与主机网卡连接无需NAT或端口映射。4.macvlan会独占主机网卡但可以使用vlan子接口实现多macvlan网络5.vlan可以将物理二层网络划分为4094个逻辑网络彼此隔离vlan id取值为1~4094macvlan网络间的隔离和连通1.macvlan网络在二层上是隔离的所以不同macvlan网络的容器是不能通信的2.可以在三层上通过网关将macvlan网络连通起来3.docker本身不做任何限制像传统vlan网络那样管理即可实现方法如下1.在两台docker主机上各添加一块网卡打开网卡混杂模式eth1这款网卡在vmware中要设定为仅主机模式2.添加macvlan网路3.测试六 Docker 数据卷管理及优化Docker 数据卷是一个可供容器使用的特殊目录它绕过了容器的文件系统直接将数据存储在宿主机 上。这样可以实现以下几个重要的目的1.数据持久化即使容器被删除或重新创建数据卷中的数据仍然存在不会丢失。2.数据共享多个容器可以同时挂载同一个数据卷实现数据的共享和交互。3.独立于容器生命周期数据卷的生命周期独立于容器不受容器的启动、停止和删除的影响。6.1 为什么要用数据卷docker分层文件系统1.性能差2.生命周期与容器相同docker数据卷1.mount到主机中绕开分层文件系统2.和主机磁盘性能相同容器删除后依然保留3.仅限本地磁盘不能随容器迁移docker提供了两种卷1.bind mount2.docker managed volume6.2 bind mount 数据卷是将主机上的目录或文件mount到容器里。使用直观高效易于理解。使用 -v 选项指定路径格式 :host path:container path-v选项指定的路径如果不存在挂载时会自动创建6.3 docker managed 数据卷bind mount必须指定host文件系统路径限制了移植性docker managed volume 不需要指定mount源docker自动为容器创建数据卷目录默认创建的数据卷目录都在 /var/lib/docker/volumes 中如果挂载时指向容器内已有的目录原有数据会被复制到volume中清理未使用的 Docker 数据卷1. 在执行 docker volume prune 命令之前请确保你确实不再需要这些数据卷中的数据因为 该操作是不可逆的一旦删除数据将无法恢复。2. 如果有重要的数据存储在数据卷中建议先进行备份或者确保数据已经被妥善保存到其他地 方建立数据卷6.4 数据卷容器Data Volume Container数据卷容器Data Volume Container是 Docker 中一种特殊的容器主要用于方便地在多个容器之间 共享数据卷。1.建立数据卷容器2.使用数据卷容器可以看到完全跟前面的容器一样。6.5 bind mount 数据卷和docker managed 数据卷的对比相同点 两者都是 host 文件系统中的某个路径不同点6.6 备份与迁移数据卷备份数据卷数据恢复七 Docker 的安全优化Docker容器的安全性很大程度上依赖于Linux系统自身评估Docker的安全性时主要考虑以下几个方面1. Linux内核的命名空间机制提供的容器隔离安全2.Linux控制组机制对容器资源的控制能力安全。3.Linux内核的能力机制所带来的操作权限安全4.Docker程序特别是服务端本身的抗攻击性。5.其他安全增强机制对容器安全性的影响一.更改系统cgroup版本企业中非必须#在rhel9中默认使用cgroup-v2 但是cgroup-v2中不利于观察docker的资源限制情况所以推荐使用 cgroup-v11 命名空间隔离的安全当docker run启动一个容器时Docker将在后台为容器创建一个独立的命名空间。命名空间提供了 最基础也最直接的隔离。与虚拟机方式相比通过Linux namespace来实现的隔离不是那么彻底。容器只是运行在宿主机上的一种特殊的进程那么多个容器之间使用的就还是同一个宿主机的操作 系统内核。在 Linux 内核中有很多资源和对象是不能被 Namespace 化的比如磁盘等等2 控制组资源控制的安全当docker run启动一个容器时Docker将在后台为容器创建一个独立的控制组策略集合。Linux Cgroups提供了很多有用的特性确保各容器可以公平地分享主机的内存、CPU、磁盘IO等 资源。确保当发生在容器内的资源压力不会影响到本地主机系统和其他容器它在防止拒绝服务攻击 DDoS方面必不可少3 内核能力机制能力机制Capability是Linux内核一个强大的特性可以提供细粒度的权限访问控制。大部分情况下容器并不需要“真正的”root权限容器只需要少数的能力即可。默认情况下Docker采用“白名单”机制禁用“必需功能”之外的其他权限。4 Docker服务端防护使用Docker容器的核心是Docker服务端确保只有可信的用户才能访问到Docker服务。将容器的root用户映射到本地主机上的非root用户减轻容器和主机之间因权限提升而引起的安全 问题。允许Docker 服务端在非root权限下运行利用安全可靠的子进程来代理执行需要特权权限的操作。 这些子进程只允许在特定范围内进行操作。7.1 Docker的资源限制Linux Cgroups 的全称是 Linux Control Group。是限制一个进程组能够使用的资源上限包括 CPU、内存、磁盘、网络带宽等等。对进程进行优先级设置、审计以及将进程挂起和恢复等操作。Linux Cgroups 给用户暴露出来的操作接口是文件系统它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。执行此命令查看mount -t cgroup在 /sys/fs/cgroup 下面有很多诸如 cpuset、cpu、 memory 这样的子目录也叫子系统。在每个子系统下面为每个容器创建一个控制组即创建一个新目录。控制组下面的资源文件里填上什么值就靠用户执行 docker run 时的参数指定。cpu资源被 dd命令占用100%的使用量而其他程序会因为得不到cpu的使用量而导致系统崩溃7.1.1.限制cpu使用1.限制cpu的使用量2.限制cpu的优先级我们开一个容器时CPU被独占再开一个容器时默认是平分CPU使用量资源限制#设定cpu优先 级最大为1024值越大优先级越高这个是第一个有限制cpu容器的使用量 #cpu有限制被限制#cpu为被限制7.1.2 限制内存使用#开启容器并限制容器使用内存大小#查看容器内存使用限制#测试容器内存限制在容器中我们测试内存限制效果不是很明显可以利用工具模拟容器在内存中写入数据 #在系统中/dev/shm这个目录被挂在到内存中cgexec -g memory:doceker/容器id -g表示使用指定控制器类型7.1.3 限制docker的磁盘io#开启容器后会发现速度和设定不匹配是因为系统的缓存机制注意磁盘想要nvme 的磁盘7.2 Docker的安全加固7.2.1 Docker默认隔离性在系统中运行容器我们会发现资源并没有完全隔离开#虽然我们限制了容器的内容使用情况但是查看到的信息依然是系统中内存的使用信息并没有隔离开7.2.2 解决Docker的默认隔离性LXCFS 是一个为 LXCLinux Containers容器提供增强文件系统功能的工具。主要功能1. 资源可见性LXCFS 可以使容器内的进程看到准确的 CPU、内存和磁盘 I/O 等资源使用信息。在没有 LXCFS 时容器内看到的资源信息可能不准确这会影响到在容器内运行的应用程序对资源的评估和 管理。2. 性能监控方便对容器内的资源使用情况进行监控和性能分析。通过提供准确的资源信息管理员和开发 人员可以更好地了解容器化应用的性能瓶颈并进行相应的优化。7.2.3 容器特权在容器中默认情况下即使我是容器的超级用户也无法修改某些系统设定比如网络这是因为容器使用的很多资源都是和系统真实主机公用的如果允许容器修改这些重要资源系统的稳 定性会变的非常差但是由于某些需要求容器需要控制一些默认控制不了的资源如何解决此问题这时我们就要设置容器特#如果添加了--privileged 参数开启容器容器获得权限近乎于宿主机的root用户7.2.4 容器特权的白名单--privilegedtrue 的权限非常大接近于宿主机的权限为了防止用户的滥用需要增加限制只提供 给容器必须的权限。此时Docker 提供了权限白名单的机制使用--cap-add添加必要的权限capabilities手册地址 http://man7.org/linux/man-pages/man7/capabilities.7.html#限制容器对网络有root权限#网络可以设定#无法管理磁盘八 容器编排工具Docker Compose8.1 Docker Compose 概述Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。 其是官方的一个开源项目托管到github上网址https://github.com/docker/compose主要功能使用 YAML 格式的配置文件来定义一组相关的容器服务。每个服务可以指定镜像、端口映射、 环境变量、存储卷等参数。例如可以在配置文件中定义一个 Web 服务和一个数据库服务以及它们之间的连接关系。2. 一键启动和停止通过一个简单的命令可以启动或停止整个应用程序所包含的所有容器。这大大简化了多容器 应用的部署和管理过程。例如使用 docker-compose up 命令可以启动配置文件中定义的所有服务使用 compose down 命令可以停止并删除这些服务。3. 服务编排docker 可以定义容器之间的依赖关系确保服务按照正确的顺序启动和停止。例如可以指定数据库 服务必须在 Web 服务之前启动。支持网络配置使不同服务的容器可以相互通信。可以定义一个自定义的网络将所有相关的 容器连接到这个网络上。4. 环境变量管理可以在配置文件中定义环境变量并在容器启动时传递给容器。这使得在不同环境如开发、 测试和生产环境中使用不同的配置变得更加容易。例如可以定义一个数据库连接字符串的环境变量在不同环境中可以设置不同的值。工作原理1. 读取配置文件Docker Compose 读取 YAML 配置文件解析其中定义的服务和参数。2. 创建容器根据配置文件中的定义Docker Compose 调用 Docker 引擎创建相应的容器。它会下载所需 的镜像如果本地没有并设置容器的各种参数。3. 管理容器生命周期Docker Compose 监控容器的状态并在需要时启动、停止、重启容器。 它还可以处理容器的故障恢复例如自动重启失败的容器。Docker Compose 中的管理层1. 服务 (service) 一个应用的容器实际上可以包括若干运行相同镜像的容器实例2. 项目 (project) 由一组关联的应用容器组成的一个完整业务单元在 docker-compose.yml 文件中 定义3. 容器container容器是服务的具体实例每个服务可以有一个或多个容器。容器是基于服务定义 的镜像创建的运行实例8.2 Docker Compose 的常用命令参数一、服务管理1. docker-compose up 启动配置文件中定义的所有服务。可以使用 -d 参数在后台启动服务。可以使用-f 来指定yml文件 例如 docker-compose up -d。2. docker-compose down 停止并删除配置文件中定义的所有服务以及相关的网络和存储卷。3. docker-compose start 启动已经存在的服务但不会创建新的服务。4. docker-compose stop 停止正在运行的服务5. docker-compose restart 重启服务。二、服务状态查看1. docker-compose ps 列出正在运行的服务以及它们的状态包括容器 ID、名称、端口映射等信息。2. docker-compose logs 查看服务的日志输出。可以指定服务名称来查看特定服务的日志。三、构建和重新构建服务了解1. docker-compose build 构建配置文件中定义的服务的镜像。可以指定服务名称来只构建特定的服务。2. docker-compose up --build启动服务并在启动前重新构建镜像。四、其他操作1. docker-compose exec 在正在运行的服务容器中执行命令。2. docker-compose pull 拉取配置文件中定义的服务所使用的镜像。3. docker-compose config 验证并查看解析后的 Compose 文件内容8.3 Docker Compose 的yml文件Docker Compose 的 YAML 文件用于定义和配置多容器应用程序的各个服务。以下是一个基本的 Docker Compose YAML 文件结构及内容解释一、服务services1. 服务名称service1_name/service2_name 等每个服务在配置文件中都有一个唯一的名称用于在命令行和其他部分引用该服务。2. 镜像image指定服务所使用的 Docker 镜像名称和标签。列如image: nginx:latest 表示使用 nginx镜像的最新版本3. 端口映射ports将容器内部的端口映射到主机的端口以便外部可以访问容器内的服务。例如 8080:80 表示将主机的 8080 端口映射到容器内部的 80 端口。4. 环境变量environment为容器设置环境变量可以在容器内部的应用程序中使用。例如VAR1: value1 设置环境变量 VAR1 的值为 value15. 存储卷volumes将主机上的目录或文件挂载到容器中以实现数据持久化或共享。例如/host/data:/container/data 将主机上的 /host/data 目录挂载到容器内的/container/data 路径。6. 网络networks将服务连接到特定的网络以便不同服务的容器可以相互通信#在networks中指定自建网络但是自建网络需要通过项目构建7. 命令command覆盖容器启动时默认执行的命令。例如 command: python app.py 指定容器启动时运行python app.py命令。二、网络networks定义 Docker Compose 应用程序中使用的网络。可以自定义网络名称和驱动程序等属性。默认情况下docker compose 在执行时会自动建立网路default网络自建网络三、存储卷volumes定义 Docker Compose 应用程序中使用的存储卷。可以自定义卷名称和存储位置等属性。8.4 企业示例利用容器编排完成haproxy和nginx负载均衡架构实施测试