Docker 容器技术:颠覆传统,重塑软件世界的新势力

news2024/11/6 7:15:42

一、Docker简介

什么是docker

Docker 是一种开源的容器化平台,它可以让开发者将应用程序及其所有的依赖项打包成一个标准化的容器,从而实现快速部署、可移植性和一致性。

从功能角度来看,Docker 主要有以下几个重要特点:

轻量级虚拟化

与传统的虚拟机相比,Docker 容器更加轻量级。虚拟机需要模拟整个操作系统,而 Docker 容器只包含应用程序及其必要的运行环境,共享宿主机的操作系统内核,因此启动速度更快,占用的系统资源更少。

可移植性

由于 Docker 将应用程序及其依赖打包成一个独立的容器,这个容器可以在不同的环境中运行,无论是在本地开发环境、测试环境还是生产环境,甚至在不同的操作系统和云平台上,都能保持一致的运行效果。这大大提高了应用程序的可移植性,降低了部署的复杂性。

高效的部署和扩展

使用 Docker,可以快速部署应用程序。开发者只需要将容器推送到容器仓库,然后在目标环境中拉取并运行容器即可。同时,Docker 还支持快速扩展,可以根据需求轻松地增加或减少容器的数量,以应对不同的负载情况。

资源隔离

Docker 容器为应用程序提供了一定程度的资源隔离,每个容器都有自己独立的文件系统、网络配置和进程空间。这样可以避免不同应用程序之间的相互干扰,提高系统的稳定性和安全性。

持续集成和持续部署(CI/CD)支持

Docker 与持续集成和持续部署工具紧密结合,使得开发团队能够更高效地进行软件开发和交付。通过自动化的构建、测试和部署流程,可以快速将新的功能和修复推送到生产环境。 

Docker在企业中的应用场景

应用部署与交付

  1. 快速部署:企业可以利用 Docker 将应用及其依赖打包成容器,实现快速部署。相比传统的部署方式,大大缩短了部署时间,提高了业务上线的速度。
  2. 一致性保障:确保在不同的环境(开发、测试、生产)中应用的运行环境一致,减少因环境差异导致的问题。

微服务架构

  1. 服务隔离:在微服务架构中,每个微服务可以独立地运行在一个 Docker 容器中。这样可以实现服务之间的资源隔离,提高系统的稳定性和可靠性。
  2. 易于扩展:根据业务需求,可以轻松地增加或减少微服务容器的数量,实现弹性扩展。

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

  1. 构建标准化:Docker 可以作为持续集成和持续部署流程中的标准化构建和部署单元。开发团队可以确保每次构建的结果都是一致的,便于进行测试和部署。
  2. 快速反馈:通过快速构建和部署容器,可以实现更快的反馈循环,让开发人员更快地发现和修复问题。

开发与测试环境

  1. 环境一致性:开发人员和测试人员可以使用相同的 Docker 容器来搭建开发和测试环境,确保环境的一致性,减少因环境差异导致的问题。
  2. 易于共享:可以方便地将开发环境打包成 Docker 容器分享给其他团队成员,提高协作效率。

多云环境部署

  1. 跨云平台:企业可以使用 Docker 将应用打包成容器,在不同的云平台上进行部署,提高了应用的可移植性,降低了对单一云平台的依赖。
  2. 混合云部署:支持在企业内部私有云和公有云之间进行灵活的部署,实现资源的优化配置。

数据库部署与管理

  1. 快速部署数据库:可以使用 Docker 快速部署各种数据库,如 MySQL、PostgreSQL 等,简化数据库的安装和配置过程。
  2. 数据库容器化管理:通过容器化的方式管理数据库,方便进行备份、恢复和升级等操作。

大数据处理

  1. 构建大数据平台:可以使用 Docker 容器来构建大数据处理平台,如 Hadoop、Spark 等,提高平台的部署效率和可维护性。
  2. 弹性扩展:根据数据处理的需求,可以动态地增加或减少大数据处理容器的数量,实现弹性扩展。

Docker与虚拟化的对比

架构与实现方式

  1. 传统虚拟化:

    • 通常使用虚拟机管理程序(Hypervisor)在物理硬件之上创建多个虚拟机。每个虚拟机都包含完整的操作系统、内核以及应用程序运行所需的各种库和依赖。
    • 虚拟机管理程序对物理资源进行抽象和分配,为每个虚拟机提供独立的计算、存储和网络资源。
  2. Docker 容器:

    • 基于操作系统的容器化技术,利用宿主机的操作系统内核,通过容器引擎(如 Docker Engine)将应用程序及其依赖打包成一个轻量级的容器。
    • 容器之间共享宿主机的内核,因此不需要像虚拟机那样模拟完整的操作系统,从而更加轻量级和高效。

资源占用

  1. 传统虚拟化:

    • 由于每个虚拟机都需要运行完整的操作系统,因此资源占用相对较大。包括内存、磁盘空间和 CPU 资源等。
    • 启动时间较长,因为需要启动完整的操作系统。
  2. Docker 容器:

    • 容器只包含应用程序及其必要的依赖,资源占用较少。通常只需要几兆到几百兆的磁盘空间,启动时间可以在秒级甚至毫秒级。
    • 可以在同一台物理机上运行更多的容器,提高资源利用率。

可移植性

  1. 传统虚拟化:

    • 虚拟机通常可以在不同的虚拟机管理程序之间进行迁移,但需要考虑硬件兼容性和虚拟机格式的转换。
    • 在不同的云平台或数据中心之间迁移虚拟机可能需要一些额外的工作。
  2. Docker 容器:

    • 由于容器是基于标准化的镜像格式,可以在不同的环境中轻松迁移。无论是在本地开发环境、测试环境还是生产环境,甚至在不同的云平台上,都可以快速部署和运行相同的容器。
    • 容器的可移植性使得应用程序的部署更加灵活和高效。

隔离性

  1. 传统虚拟化:

    • 提供了强大的隔离性,每个虚拟机都有独立的操作系统和资源空间,完全隔离于其他虚拟机。
    • 安全性较高,因为虚拟机之间的攻击面相对较小。
  2. Docker 容器:

    • 容器提供了一定程度的隔离性,但不如虚拟机完全。容器之间共享宿主机的内核,因此存在一定的安全风险。
    • 不过,Docker 也提供了一些安全机制,如命名空间隔离、资源限制和安全策略等,可以在一定程度上提高容器的安全性。

部署与管理

  1. 传统虚拟化:

    • 虚拟机的部署和管理相对复杂,需要使用专门的虚拟化管理工具。例如,VMware vSphere、Microsoft Hyper-V 等。
    • 虚拟机的创建、配置和维护需要一定的技术知识和经验。
  2. Docker 容器:

    • 容器的部署和管理相对简单,可以使用 Docker 命令行工具或各种容器编排工具(如 Kubernetes、Docker Swarm 等)进行管理。
    • 容器的镜像可以轻松地创建、共享和更新,使得应用程序的部署更加便捷和高效。

 Docker的优势

轻量级与高效性

  1. 资源占用少:Docker 容器只包含应用程序及其必要的依赖,相比传统虚拟机,它不需要运行完整的操作系统,因此占用的系统资源极少。这使得在同一台物理服务器上可以运行更多的容器实例,提高了资源利用率。
  2. 快速启动:容器的启动速度非常快,通常可以在秒级甚至毫秒级完成启动。这对于需要快速部署和扩展的应用场景非常重要,例如微服务架构中的服务实例启动。

可移植性

  1. 跨平台部署:Docker 容器可以在不同的操作系统和云平台上运行,具有很强的可移植性。开发人员可以在本地开发环境中构建和测试容器,然后轻松地将其部署到生产环境中,无论是在本地服务器、私有云还是公有云平台上。
  2. 一致性保证:由于容器包含了应用程序及其所有依赖,因此可以确保在不同环境中的运行一致性。这有助于减少因环境差异而导致的问题,提高应用程序的稳定性和可靠性。

易于部署与管理

  1. 简单的部署流程:使用 Docker,应用程序的部署变得非常简单。只需要将容器镜像推送到容器仓库,然后在目标环境中拉取并运行容器即可。无需复杂的安装和配置过程,大大降低了部署的难度和成本。
  2. 高效的管理工具:Docker 提供了丰富的命令行工具和 API,方便用户对容器进行管理和操作。同时,还有许多第三方工具和平台可以与 Docker 集成,提供更强大的管理功能,如容器编排工具 Kubernetes 和 Docker Swarm。

隔离性与安全性

  1. 资源隔离:Docker 容器为应用程序提供了一定程度的资源隔离,每个容器都有自己独立的文件系统、网络配置和进程空间。这可以避免不同应用程序之间的相互干扰,提高系统的稳定性和安全性。
  2. 安全机制:Docker 提供了一些安全机制,如命名空间隔离、资源限制和安全策略等,可以有效地保护容器和宿主机的安全。此外,容器镜像的签名和验证功能也可以确保镜像的来源可靠,防止恶意镜像的使用。

适合微服务架构

  1. 服务独立部署:在微服务架构中,每个微服务可以独立地运行在一个 Docker 容器中。这样可以实现服务之间的隔离,便于进行独立部署、升级和扩展。同时,也可以根据服务的负载情况动态地调整容器的数量,提高系统的弹性和可扩展性。
  2. 快速迭代:由于容器的轻量级和可移植性,开发人员可以快速地构建、测试和部署微服务。这有助于加快开发周期,提高团队的开发效率。

持续集成与持续部署(CI/CD)支持

  1. 标准化构建:Docker 可以作为持续集成和持续部署流程中的标准化构建和部署单元。开发团队可以确保每次构建的结果都是一致的,便于进行测试和部署。
  2. 自动化流程:通过与持续集成和持续部署工具的集成,Docker 可以实现自动化的构建、测试和部署流程。这有助于提高软件开发和交付的效率,减少人为错误。

 二、部署docker

配置软件仓库

或者上传安装包

安装docker-ce并启动服务

三、Docker的基本操作

Docker镜像管理

搜索镜像

创建镜像加速器

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

拉取镜像

查看镜像信息

查看镜像结构

导出镜像

-o :指定导出镜像的位置;
可以同时导出多个镜像到一个文件中;
指定 .tar.gz 可以导出并压缩。

保存所有镜像

删除镜像

容器的常用操作

启动容器

-d #后台运行
-i #交互式运行
-t #打开一个终端
--name #指定容器名称
-p #端口映射 -p 80:8080 把容器8080端口映射到本机80端口
--rm #容器停止自动删除容器
--network #指定容器使用的网络

查看容器运行信息

停止和运行容器

[root@docker-node1 ~]# docker stop busybox                 #停止容器
[root@docker-node1 ~]# docker kill busybox                 #杀死容器,可以使用信号
[root@docker-node1 ~]# docker start busybox                 #开启停止的容器

删除容器

[root@docker-node1 ~]# docker rm test                         #删除停止的容器
[root@docker-node1 ~]# docker rm -f test                         #删除运行的容器
[root@docker-node1 ~]# docker container prune -f         #删除所有停止的容器

容器内容提交

默认情况下,容器被删除后,在容器中的所有操作都会被清理,包括要保存的文件
如果想永久保存,那么我们需要把动作提交,提交后会生成新的镜像
当我们在运行新镜像后即可看到我们提交的内容

系统中的文件和容器中的文件传输

查询容器内部日志

四、docker镜像构建

docker镜像结构

Docker 镜像是一个分层的文件系统结构,主要由以下几个部分组成:

基础镜像层

最底层通常是一个基础操作系统镜像,比如基于 Ubuntu、CentOS 等发行版的镜像。这一层为上层的应用程序提供了基本的运行环境,包括内核和一些基本的系统工具和库。

只读层(多个)

在基础镜像层之上,有多个只读层。这些层可能包含应用程序运行所需的各种依赖库、配置文件、二进制文件等。每个只读层都代表了一个特定的状态或版本,它们叠加在一起形成了最终的镜像内容。

  • 每一层都是通过对前一层进行修改或添加新的文件而构建的。例如,如果一个新的应用程序版本需要更新某个库文件,那么只会在新的层中包含这个更新后的库文件,而不会影响其他层。
  • 这些只读层的好处是可以实现高效的存储和分发。如果多个镜像共享相同的底层只读层,那么在存储和传输时只需要保存一份底层的内容,大大节省了空间和网络带宽。

可写层

在只读层的顶部是一个可写层。当容器从镜像启动时,Docker 会在这个可写层中进行各种修改操作,比如写入新的文件、修改配置等。

  • 可写层是容器运行时的临时存储区域,它不会影响到镜像本身的内容。当容器停止或删除时,可写层中的数据通常也会被丢弃,除非进行了特定的持久化设置。

元数据

Docker 镜像还包含一些元数据,用于描述镜像的属性和配置信息。这些元数据包括:

 
  • 镜像名称和标签:用于唯一标识一个镜像。
  • 作者信息:记录镜像的创建者。
  • 构建指令:描述了如何构建这个镜像的步骤。
  • 环境变量:可以在容器启动时设置的环境变量。
  • 暴露的端口:指示容器中哪些端口需要对外暴露。
共享宿主机的 kernel
base 镜像提供的是最小的 Linux 发行版
同一 docker 主机支持运行多种 Linux 发行版
采用分层结构的最大好处是:共享资源

镜像运行的基本原理 

镜像的本质

Docker 镜像是一个只读的模板,它包含了运行一个特定应用程序所需的所有文件和依赖项。镜像通常由多个层组成,每个层代表了对基础镜像的一次修改或添加。这种分层结构使得镜像的构建、存储和分发更加高效。

运行过程

  1. 客户端请求

    • 当用户使用 Docker 命令行工具或 API 启动一个容器时,Docker 客户端会向 Docker 守护进程发送一个请求,指定要运行的镜像名称和其他参数,如容器的端口映射、环境变量等。
  2. 查找镜像

    • Docker 守护进程首先会在本地查找是否存在指定名称的镜像。如果本地没有该镜像,它会尝试从远程仓库(如 Docker Hub)下载。
  3. 加载镜像

    • 一旦找到镜像,Docker 会将镜像的各个层加载到内存中,并将它们合并成一个完整的文件系统。这个文件系统将作为容器的根文件系统。
  4. 创建容器

    • Docker 为容器创建一个独立的命名空间,包括网络命名空间、进程命名空间、挂载命名空间等。这使得容器看起来像是一个独立的操作系统环境,与主机和其他容器隔离。
  5. 启动容器

    • Docker 在容器中执行指定的命令,通常是启动应用程序的入口点。这个入口点可以是一个脚本、一个可执行文件或者一个命令行。
    • Docker 会为容器分配资源,如 CPU、内存、网络带宽等。容器可以在这些资源限制下独立运行,不会影响主机和其他容器的性能。
  6. 运行中的容器

    • 容器在运行过程中,可以通过 Docker 的命令行工具或 API 进行管理和监控。用户可以查看容器的日志、获取容器的状态、停止或重启容器等。
    • 容器可以与其他容器或主机进行通信,通过端口映射或网络连接实现。容器也可以访问主机的文件系统或其他资源,通过挂载卷实现。

隔离与资源管理

  1. 命名空间隔离

    • 容器通过命名空间实现了与主机和其他容器的隔离。每个容器都有自己独立的进程 ID 空间、网络空间、文件系统空间等。这使得容器中的进程无法看到主机和其他容器的资源,从而提高了安全性和稳定性。
  2. 资源限制

    • Docker 可以对容器的资源使用进行限制,如 CPU、内存、网络带宽等。这可以防止一个容器占用过多的资源,影响其他容器或主机的性能。资源限制可以通过 Docker 的命令行参数或配置文件进行设置。
  3. 存储管理

    • 容器的文件系统是由镜像的层和容器的可写层组成的。当容器对文件系统进行修改时,这些修改会被保存在容器的可写层中。如果容器被删除,可写层中的数据也会被删除,除非进行了持久化存储的设置。 
Copy-on-Write 可写容器层
容器层以下所有镜像层都是只读的
docker 从上往下依次查找文件
容器层保存镜像变化的部分,并不会对镜像本身进行任何修改
一个镜像最多 127

镜像获得方式

基本镜像通常由软件官方提供
企业镜像可以用官方镜像 +Dockerfile 来生成
系统关于镜像的获取动作有两种:
docker pull 镜像地址
docker load –i 本地镜像包

镜像构建

构建参数

参数示例及用法
#FROM COPY 和MAINTAINER
[root@docker-node1 ~]# mkdir docker
[root@docker-node1 ~]# cd docker/
[root@docker-node1 docker]# ls

#MAINTAINER 在最新版的 docker 中用 LABEL KEY="VALUE" 代替

#ADD
[root@docker-node1 docker]# touch tcfile{1..3}
[root@docker-node1 docker]# tar zcf tcfile.gz tcfile*
[root@docker-node1 docker]# vim Dockerfile 

#ENV CMD

#ENTRYPOINT 

#EXPOSE VOLUME VOLUME

五、Dockerfile实例

建立构建目录,编写构建文件

[root@docker-node1 docker]# docker build -t nginx:v1 .

出现报错(下载软件时连接网上的仓库失败)

对镜像进行处理(搭建一个本地的仓库)

让出端口

添加一个镜像

[root@docker-node1 ~]# docker inspect centos

提交

修改Dokerfile

 问题解决

通过dockerfile生成镜像

测试镜像可用性

查看容器详情

六、镜像优化方案

镜像优化策略

选择最精简的基础镜像
减少镜像的层数
清理镜像构建的中间产物
选择最精简的基础镜像
减少镜像的层数
清理镜像构建的中间产物

镜像优化示例

方法1.缩减镜像层

方法2.多阶段构建

方法3.使用最精简镜像 

使用 google 提供的最精简镜像
上传需要的镜像
debian11.tar.gz                nginx-1.23.tar.gz

七、Docker镜像仓库的管理

什么是docker仓库

Docker 仓库是用于存储和分发 Docker 镜像的集中式存储库。

主要作用

  1. 存储镜像

    • Docker 仓库就像一个巨大的镜像仓库,可以保存各种各样的 Docker 镜像。这些镜像可以是官方提供的基础镜像,如各种操作系统的镜像,也可以是由开发者自己创建并上传的自定义镜像。
    • 例如,一个开发团队可以将他们开发的应用程序打包成 Docker 镜像,并上传到私有仓库中,以便团队成员在不同的环境中快速部署和使用。
  2. 分发镜像

    • 允许用户从仓库中下载所需的镜像。用户可以在本地使用 Docker 命令从仓库中拉取镜像,然后在本地环境中运行容器。
    • 比如,你想要部署一个基于特定版本的 Web 服务器的容器,就可以从仓库中拉取相应的镜像,而不需要自己手动安装和配置 Web 服务器。

类型

  1. 公共仓库

    • 由 Docker 公司或其他组织提供的公开可用的仓库,例如 Docker Hub。Docker Hub 上有大量的官方镜像和由社区贡献的镜像,任何人都可以免费使用。
    • 优点是资源丰富,方便快捷,不需要自己搭建和维护仓库。缺点是可能存在网络延迟问题,并且对于一些企业来说,使用公共仓库可能存在安全风险。
  2. 私有仓库

    • 由企业或个人自己搭建和管理的仓库,可以在内部网络中使用。
    • 优点是安全性高,可以更好地控制镜像的访问权限和版本管理。缺点是需要一定的技术和资源来搭建和维护。

 docker hub

Docker Hub 是一个由 Docker 公司维护的公共容器镜像仓库。

主要特点

  1. 丰富的镜像资源

    • 拥有大量的官方镜像,涵盖了各种常见的操作系统、编程语言运行环境、数据库等。例如,你可以轻松找到 Ubuntu、CentOS 等操作系统的镜像,以及 Java、Python、Node.js 等编程语言的运行环境镜像。
    • 还有众多由社区开发者贡献的镜像,这些镜像可以满足不同用户的特定需求。比如,有专门为特定项目或应用程序定制的镜像。
  2. 便捷的使用方式

    • 用户可以通过简单的 Docker 命令从 Docker Hub 拉取所需的镜像。例如,使用 “docker pull [镜像名称]” 命令即可快速获取镜像到本地。
    • 同时,开发者也可以将自己创建的镜像推送到 Docker Hub 上与他人分享,方便协作和复用。
  3. 自动化构建

    • 支持自动化构建功能。开发者可以将自己的代码仓库(如 GitHub、Bitbucket 等)与 Docker Hub 关联起来,当代码发生变化时,Docker Hub 会自动触发镜像的构建和更新。
    • 这使得持续集成和持续部署(CI/CD)变得更加容易和高效。

用户群体

  1. 开发者

    • 对于开发者来说,Docker Hub 是一个非常方便的资源库,可以快速获取所需的开发环境和工具。例如,在开发一个 Web 应用程序时,可以直接拉取相应的 Web 服务器镜像、数据库镜像等,大大提高开发效率。
    • 开发者还可以将自己的项目打包成镜像并上传到 Docker Hub,方便团队成员协作开发和部署。
  2. 企业用户

    • 企业可以利用 Docker Hub 上的官方镜像和社区镜像来快速搭建自己的应用环境。同时,企业也可以建立自己的私有仓库,并与 Docker Hub 结合使用,实现更安全、高效的容器化部署。

安全性

  1. 官方审核

    • Docker 公司对官方镜像进行严格的审核和维护,确保其安全性和稳定性。
    • 对于社区贡献的镜像,虽然审核力度相对较小,但用户可以通过查看镜像的评分、评论等信息来评估其安全性。
  2. 访问控制

    • 用户可以设置自己的账号权限,控制对镜像的访问和操作。例如,可以将镜像设置为私有,只有授权的用户才能访问和拉取。

 docker hub的使用方法

登陆官方仓库

登陆信息保存位置

docker仓库的工作原理

仓库中的三个角色
index docker 索引服务,负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。
registry docker 仓库,是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过 Index
Auth service Token 的方式进行认证
Registry Client Docker 充当 registry 客户端来维护推送和拉取,以及客户端的授权。

pull原理

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

push原理

镜像上传的步骤:
1.client index 发送上传请求并完成用户认证
2.index 会发方 token client 来证明 client 的合法性
3.client 携带 index 提供的 token 连接 Registry
4.Registry index 合适 token 的合法性
5.index 证实 token 的合法性
6.Registry 开始接收客户端上传过来的镜像

搭建docker的私有仓库

为什么搭建私有仓库

数据安全与隐私保护

  1. 敏感数据保护

    • 如果你的组织正在处理敏感数据,如客户信息、财务数据或知识产权相关的内容,使用私有仓库可以确保这些数据不会被意外地暴露在公共网络上。
    • 例如,金融机构在开发和部署内部应用程序时,不希望将包含关键业务逻辑和客户数据的镜像存储在公共仓库中,以免遭受潜在的安全威胁。
  2. 知识产权保护

    • 对于拥有独特技术或商业秘密的企业,私有仓库可以防止竞争对手获取其软件镜像,从而保护知识产权。
    • 一家软件开发公司可能花费大量时间和资源开发了一款创新的应用程序,通过将其镜像存储在私有仓库中,可以降低被竞争对手复制或逆向工程的风险。

定制化与灵活性

  1. 满足特定需求

    • 私有仓库允许你根据组织的特定需求进行定制化配置。你可以设置特定的访问权限、存储策略和网络配置,以满足内部的安全和合规要求。
    • 例如,某些企业可能需要对镜像进行加密存储,或者限制特定用户或团队对某些镜像的访问权限。通过搭建私有仓库,可以轻松实现这些定制化需求。
  2. 内部开发与测试

    • 在软件开发过程中,团队可能需要频繁地构建、测试和部署新的镜像。私有仓库可以提供一个快速、可靠的环境,方便团队成员在内部进行镜像的共享和测试。
    • 开发人员可以将正在开发中的镜像推送到私有仓库,其他团队成员可以快速拉取并进行测试,从而提高开发效率和协作能力。

网络性能与可靠性

  1. 减少网络延迟

    • 当你的应用程序部署在内部网络中时,从私有仓库拉取镜像可以显著减少网络延迟,提高应用程序的启动速度和响应时间。
    • 特别是对于大型企业或分布式团队,使用本地私有仓库可以避免从公共网络下载镜像时可能遇到的带宽限制和网络拥塞问题。
  2. 提高可靠性

    • 依赖公共仓库可能会受到网络故障、服务中断或镜像不可用等问题的影响。而拥有自己的私有仓库可以提供更高的可靠性,确保在任何情况下都能快速获取所需的镜像。
    • 在一些关键业务场景中,如生产环境的部署,可靠性是至关重要的。私有仓库可以作为一个稳定的镜像存储和分发中心,减少因外部因素导致的部署中断风险。

 搭建简单的Registry仓库

下载Registry镜像

开启Registry

上传镜像到仓库中  
给要上传的经镜像打标签

docker在上传的过程中默认使用https,但是我们并没有建立https认证需要的认证文件所以会报错
配置非加密端口

上传镜像

注意查看这块 

查看镜像上传

再推一个

Registry提加密传输  

创建目录、配置解析

[root@docker-node1 ~]# mkdir certs

生成认证key和证书

启动registry仓库

测试

  docker客户端没有key和证书  
为客户端建立证书

为仓库建立登陆认证
安装建立认证文件的工具包

建立认证文件

添加认证到registry容器中

登陆测试

构建企业级私有仓库

Harbor 是一个功能强大的企业级容器镜像仓库,它提供了以下主要特点和优势,非常适合用于构建企业级私有仓库:

  1. 基于角色的访问控制(RBAC):

    • 可以精细地管理用户对仓库的访问权限,确保只有授权用户能够访问特定的项目和镜像。
    • 支持创建不同的用户角色,如管理员、开发者、访客等,并为每个角色分配相应的权限。
  2. 镜像复制和同步:

    • 可以在不同的 Harbor 实例之间复制和同步镜像,实现跨数据中心或多环境的镜像分发。
    • 支持定时同步和手动触发同步,确保镜像在不同环境中的一致性。
  3. 安全扫描:

    • 集成了漏洞扫描工具,可以对上传的镜像进行安全扫描,检测潜在的安全漏洞。
    • 提供详细的扫描报告,帮助用户及时发现和修复安全问题。
  4. 图形用户界面:

    • 提供直观的 Web 界面,方便用户管理仓库、项目、用户和镜像。
    • 支持搜索、过滤和排序功能,快速找到所需的镜像。
  5. 审计日志:记录了对镜像仓库的各种操作,有助于追踪和审查活动。
  6. 垃圾回收:可以清理不再使用的镜像,节省存储空间。

部署harbor

上传需要的压缩包harbor-offline-installer-v2.5.4.tgz

修改下面这几个地方

hostname: reg.timingtc.org

certificate: /data/certs/timingtc.org.crt
private_key: /data/certs/timingtc.org.key

harbor_admin_password: 123456

Please set --with-notary         #证书签名

Please set --with-trivy                #安全扫描

Please set --with-chartmuseum if needs enable Chartmuseum in Harbor

配置解析

 

管理仓库

登陆

建立仓库项目

点击新建项目

上传镜像

需要登录

八、 Docker的webUI工具

1Panel 是一款功能强大的服务器运维管理工具,在构建企业级私有仓库方面具有诸多优势。

简洁高效的界面设计

1Panel 拥有直观简洁的用户界面,使得操作更加便捷。无论是管理员还是普通用户,都能轻松上手管理私有仓库。通过清晰的菜单和导航,你可以快速找到所需的功能,如仓库创建、镜像管理、用户权限设置等。

强大的仓库管理功能

  1. 多类型仓库支持:1Panel 支持多种类型的私有仓库,包括 Docker 镜像仓库、Helm 仓库等。这使得企业可以根据不同的需求选择合适的仓库类型,实现对各类软件包的集中管理。
  2. 镜像管理:提供了全面的镜像管理功能,包括镜像上传、下载、删除、搜索等。你可以轻松管理仓库中的镜像,确保镜像的版本控制和安全性。
  3. 仓库权限控制:支持精细的权限控制,你可以为不同的用户或用户组分配不同的权限,确保仓库的安全性和合规性。例如,管理员可以拥有完全的管理权限,而普通用户只能进行镜像的拉取和使用。

与其他工具的集成

  1. 持续集成 / 持续部署(CI/CD)集成:1Panel 可以与常见的 CI/CD 工具集成,实现自动化的镜像构建和部署。这大大提高了开发和运维的效率,减少了人工干预和错误。
  2. 容器编排工具集成:与 Kubernetes、Docker Swarm 等容器编排工具集成,方便进行容器化应用的部署和管理。你可以直接从私有仓库中拉取镜像,并在容器编排环境中进行部署。

安全与稳定性

  1. 安全认证:提供多种安全认证方式,如用户名 / 密码、密钥认证等,确保只有授权用户能够访问私有仓库。同时,还支持 SSL/TLS 加密,保障数据传输的安全性。
  2. 高可用性:1Panel 可以部署在高可用的环境中,确保私有仓库的稳定运行。即使出现硬件故障或网络问题,也能保证仓库的可用性,不影响业务的正常进行。

监控与日志管理

  1. 监控功能:实时监控私有仓库的状态和性能指标,如存储空间使用情况、网络流量、镜像拉取次数等。通过监控数据,你可以及时发现问题并采取相应的措施。
  2. 日志管理:记录仓库的操作日志和错误日志,方便进行故障排查和审计。你可以随时查看日志,了解仓库的运行情况和用户的操作记录

上传需要的压缩包1panel-v1.10.13-lts-linux-amd64.tar.gz

访问

获取访问信息

浏览器输入地址、用户名和密码即可访问

九、Docker网络

Docker 网络的主要类型

  1. bridge网络(默认网络):

    • 当你启动一个 Docker 容器而不指定网络时,Docker 会为容器创建一个连接到 bridge 网络的接口。
    • 容器在这个网络中可以通过 IP 地址相互通信。
  2. host网络:

    • 使用 host 网络模式时,容器将直接使用宿主机的网络栈,不会为容器创建独立的网络命名空间。
    • 容器将与宿主机共享网络端口,这可能会导致端口冲突问题,但在某些性能敏感的场景下可能会有优势。
  3. none网络:

    • 容器将没有任何网络连接,只有一个本地的环回接口。
    • 这种模式通常在需要完全自定义网络配置的情况下使用。
  4. 用户自定义网络:

    • Docker 允许用户创建自定义的网络,可以是 bridge 类型或 overlay 类型(用于多主机网络)。
    • 自定义网络提供更好的网络隔离和可管理性,可以为容器指定自定义的名称和 IP 地址范围。

网络的功能和优势

  1. 容器间通信:

    • 通过合适的网络配置,容器可以轻松地相互通信,无需关心它们在不同的主机上还是在同一主机上运行。
    • 可以使用容器名称或 IP 地址进行通信。
  2. 端口映射:

    • 可以将容器内的端口映射到宿主机的端口,使得外部可以通过宿主机的 IP 地址和映射后的端口访问容器内的服务。
  3. 多主机网络:

    • 在多主机环境中,可以使用 overlay 网络实现容器在不同主机之间的通信。
    • 这种网络类型通常需要一个键值存储系统(如 Consul、Etcd 等)来维护网络状态。
  4. 网络隔离:

    • 不同的网络可以提供不同程度的隔离,确保容器之间的通信不会干扰或被意外访问。

docker原生bridge网路

docker 安装时会创建一个名为 docker0 Linux bridge ,新建的容器会自动桥接到这个接口
bridge 模式下容器没有一个公有 ip ,只有宿主机可以直接访问,外部主机是不可见的。
容器通过宿主机的 NAT 规则后可以访问外网

修改默认的防火墙为iptables

docker原生网络host

host 网络模式需要在容器创建时指定 --network=host
host 模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性 ​​​​
​​​
如果公用一个网络,那么所有的网络资源都是公用的,比如启动了 nginx 容器那么真实主机的 80 端口被占用,在启动第二个nginx 容器就会失败

docker 原生网络none

none 模式是指禁用网络功能,只有 lo 接口,在容器创建时使用--network=none指定。

docker的自定义网络

自定义网络模式, docker 提供了三种自定义网络驱动:
bridge
overlay
macvlan

bridge

  1. 特点:

    • 类似于 Docker 默认的 bridge 网络,但提供了更多的可配置性和管理功能。
    • 在单主机环境中非常实用,可以方便地实现容器之间的通信以及与宿主机的交互。
    • 容器连接到 bridge 自定义网络后,可以通过容器名称进行通信,无需关心具体的 IP 地址。
  2. 使用场景:

    • 开发和测试环境:在本地开发和测试时,使用 bridge 自定义网络可以轻松管理容器之间的通信,方便调试。
    • 小型应用部署:对于规模较小的应用,bridge 自定义网络可以满足基本的网络需求,且配置简单。

overlay 

  1. 特点:

    • 主要用于多主机环境,允许容器在不同的 Docker 主机之间进行通信。
    • 依赖于一个键值存储服务(如 Consul、Etcd 等)来维护网络状态信息。
    • 提供了跨主机的容器间名称解析,容器可以通过容器名称直接通信,而无需知道具体的主机 IP 地址。
  2. 使用场景:

    • 分布式应用部署:当需要在多个主机上部署分布式应用时,overlay 自定义网络可以确保容器之间的通信畅通无阻。
    • 容器集群:在容器集群环境中,overlay 网络可以实现容器的高可用性和可扩展性。

macvlan 

  1. 特点:

    • 允许容器直接连接到物理网络,每个容器都有一个独立的 MAC 地址。
    • 可以将容器配置为与物理网络中的其他设备处于同一子网,实现与物理网络的无缝集成。
    • 需要对物理网络有一定的了解和管理权限,配置相对复杂。
  2. 使用场景:

    • 特殊网络需求:当需要容器直接与物理网络中的设备进行通信,或者需要容器在物理网络中具有特定的网络配置时,可以使用 macvlan 自定义网络。
    • 网络隔离要求高的场景:由于每个容器都有独立的 MAC 地址,可以实现更高程度的网络隔离。

自定义桥接网络

在建立自定以网络时,默认使用桥接模式
桥接默认是单调递增

为什么要自定义桥接

在 Docker 中自定义桥接网络有以下几个重要原因:

更好的网络隔离

  1. 避免干扰:默认的桥接网络中可能会有多个不同应用的容器在运行,它们之间的网络通信可能会相互干扰。通过自定义桥接网络,可以将特定的一组容器划分到一个独立的网络中,减少不同应用之间的网络冲突和干扰。
  2. 安全考虑:对于一些对安全性要求较高的应用,可以创建独立的自定义桥接网络,限制网络访问权限,降低被其他容器或外部攻击的风险。

灵活的容器命名和通信

  1. 容器命名解析:在自定义桥接网络中,容器可以通过名称直接进行通信,无需依赖 IP 地址。这使得容器之间的通信更加方便和易于管理,尤其是在容器频繁启动、停止或 IP 地址可能发生变化的情况下。
  2. 可预测的网络环境:通过自定义网络,可以为容器分配相对稳定的网络环境。这样,开发人员和运维人员可以更好地预测容器之间的通信方式,减少因网络配置变化而导致的问题。

可管理性和可扩展性

  1. 网络管理:自定义桥接网络可以更方便地进行网络管理。可以对网络进行命名、描述,方便识别不同的网络用途。同时,可以查看连接到特定网络的容器列表,便于监控和管理容器的网络状态。
  2. 扩展和调整:随着应用的发展和变化,可以轻松地创建新的自定义桥接网络来满足不同的需求。例如,可以为新的应用模块或微服务创建独立的网络,或者根据业务增长调整网络规模和配置。

适应复杂的应用架构

  1. 微服务架构:在微服务架构中,不同的微服务可能有不同的网络需求。通过自定义桥接网络,可以为每个微服务创建独立的网络,实现更好的隔离和可管理性。每个微服务可以在自己的网络中进行通信,同时可以通过适当的网络配置与其他微服务进行交互。
  2. 多环境部署:对于开发、测试和生产等不同环境,可以创建不同的自定义桥接网络,以适应不同环境的网络需求。这样可以确保在不同环境中的网络配置一致,减少因环境差异而导致的问题。

 docker容器间的网络通信

 joined容器网络

Joined 容器一种较为特别的网络模式, 在容器创建时使用 --network=container:vm1 指定。( vm1 指定的是运行的容器名)
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用 localhost 高效快速通信。

 

 joined网络示例演示
利用容器部署 phpmyadmin 管理 mysql
上传需要的镜像mysql-5.7.tar.gz        phpmyadmin-latest.tar.gz
运行phpmysqladmin

-e PMA_ARBITRARY=1 \                #在web页面中可以手动输入数据库地址和端口

运行数据库

-e MYSQL_ROOT_PASSWORD='123456' \        #设定数据库密码

--network container:mysqladmin \                        #把数据库容器添加到phpmyadmin容器中

浏览器访问

 

 新建数据库和表

插入数据

docker中容器内外网访问原理

容器访问外网

rhel7 中, docker 访问外网是通过 iptables 添加地址伪装策略来完成容器网文外网
rhel7 之后的版本中通过 nftables 添加地址伪装来访问外网

外网访问docker容器

 端口映射 -p 本机端口:容器端口来暴漏端口从而达到访问效果

通过dnat策略来完成浏览内转

  通过docker-proxy对数据包进行内转 

docker-proxydnat在容器建立端口映射后都会开启,那个传输速率高走那个

docker中容器的跨主机通信

在生产环境中,我们的容器不可能都在同一个系统中,所以需要容器具备跨主机通信的能力跨主机网络解决方案
docker 原生的 overlay macvlan
第三方的 flannel weave calico
众多网络方案是如何与 docker 集成在一起的
libnetwork docker 容器网络库
CNM Container Network Model )这个模型对容器网络进行了抽象

CNM Container Network Model

Container Network Model(CNM)是 Docker 用于容器网络管理的一种模型。

CNM 的主要组成部分

  1. Sandbox(容器网络沙箱):
    • 代表一个容器的网络栈,包括网络接口、路由表、DNS 配置等。
    • 为容器提供了独立的网络环境,实现了网络隔离。
  2. Endpoint(网络端点):
    • 连接 Sandbox 和 Network(下面会介绍)的接口。
    • 可以理解为容器在特定网络中的网络连接点。
  3. Network(网络):
    • 代表一个可以连接多个 Endpoint 的网络基础设施。
    • 可以是不同类型的网络,如 bridge 网络、overlay 网络等。

工作原理

  1. 当创建一个新的容器时,Docker 会为其创建一个 Sandbox。
  2. 根据用户的配置或默认设置,Docker 会将容器的 Sandbox 连接到一个或多个 Network 上,通过创建 Endpoint 来实现连接。
  3. 容器可以通过连接的 Network 与其他连接到同一 Network 的容器进行通信。

优势

  1. 灵活性:支持多种不同类型的网络,可以根据不同的应用场景选择合适的网络类型。
  2. 可扩展性:可以通过开发插件来扩展 CNM 的功能,满足特定的网络需求。
  3. 网络隔离:通过 Sandbox 为容器提供了良好的网络隔离,提高了安全性和稳定性。

与其他网络模型的比较

与其他容器网络模型相比,CNM 具有以下特点:

  1. 与 Docker 紧密集成:作为 Docker 默认的网络模型,CNM 与 Docker 的其他功能(如容器管理、镜像管理等)紧密结合,使用方便。
  2. 丰富的功能:提供了多种网络类型和插件支持,可以满足不同的网络需求。
  3. 社区支持:由于 Docker 的广泛使用,CNM 有较大的社区支持,有很多开发者和用户在使用和改进这个模型。

两台主机(172.25.254.11、172.25.254.12),双网卡(第一块网络为NAT,第二块网卡为仅主机)

macvlan网络方式实现跨主机通信

macvlan网络方式
Linux kernel 提供的一种网卡虚拟化技术。
无需 Linux bridge ,直接使用物理接口,性能极好
容器的接口直接与主机网卡连接,无需 NAT 或端口映射。 macvlan 会独占主机网卡,但可以使用 vlan 子接口实现多 macvlan 网络
vlan 可以将物理二层网络划分为 4094 个逻辑网络,彼此隔离, vlan id 取值为 1~4094
macvlan网络间的隔离和连通
macvlan 网络在二层上是隔离的,所以不同 macvlan 网络的容器是不能通信的
可以在三层上通过网关将 macvlan 网络连通起来
docker 本身不做任何限制,像传统 vlan 网络那样管理即可
实现 
在两台 docker 主机上各添加一块网卡,打开网卡混杂模式 (两台主机都需操作)

添加macvlan网络(两台主机都需操作)

测试

十、Docker 数据卷管理及优化 

Docker 数据卷是一个可供容器使用的特殊目录,它绕过了容器的文件系统,直接将数据存储在宿主机上。
这样可以实现以下几个重要的目的:
数据持久化:即使容器被删除或重新创建,数据卷中的数据仍然存在,不会丢失。
数据共享:多个容器可以同时挂载同一个数据卷,实现数据的共享和交互。
独立于容器生命周期:数据卷的生命周期独立于容器,不受容器的启动、停止和删除的影响

为什么要用数据卷

docker分层文件系统
性能差
生命周期与容器相同
docker数据卷
mount到主机中,绕开分层文件系统
和主机磁盘性能相同,容器删除后依然保留
仅限本地磁盘,不能随容器迁移
docker提供了两种卷:
bind mount
docker managed volume

数据持久化

  1. 容器生命周期独立:Docker 容器的生命周期通常是短暂的,当容器被删除或重新启动时,容器内部的数据会丢失。而数据卷独立于容器的生命周期存在,即使容器被删除,数据卷中的数据仍然保留。
  2. 数据安全:将重要数据存储在数据卷中,可以确保数据不会因为容器的故障或删除而丢失。这对于存储数据库数据、应用配置文件等重要信息非常关键。

数据共享

  1. 多个容器共享数据:可以将一个数据卷挂载到多个容器中,实现多个容器之间的数据共享。例如,多个容器可以共享一个数据库存储卷,或者共享一个配置文件目录。
  2. 方便团队协作:在团队开发环境中,使用数据卷可以方便地共享数据,提高开发效率。不同的开发人员可以在各自的容器中访问相同的数据卷,从而实现数据的共享和协作。

数据隔离

  1. 与容器文件系统隔离:数据卷与容器的文件系统是隔离的,这意味着容器内部的文件系统变化不会影响到数据卷中的数据。同样,数据卷中的数据变化也不会影响到容器的文件系统。
  2. 安全性增强:这种隔离性可以提高数据的安全性,防止容器内部的错误操作或恶意软件破坏数据。同时,也可以方便地对数据进行备份和恢复,而不会影响到容器的运行。

灵活性和可移植性

  1. 独立于容器镜像:数据卷中的数据不包含在容器镜像中,这使得容器镜像更加简洁和可移植。可以在不同的环境中使用相同的容器镜像,而只需要挂载不同的数据卷来适应不同的数据需求。
  2. 方便数据迁移:当需要将数据从一个环境迁移到另一个环境时,只需要将数据卷复制或迁移到目标环境,然后挂载到相应的容器中即可。这种方式比复制整个容器镜像更加方便和高效。

性能优化

  1. 绕过容器文件系统:数据卷直接将数据存储在宿主机的文件系统中,绕过了容器的文件系统层。这可以提高数据的读写性能,特别是对于大量数据的读写操作。
  2. 减少镜像大小:由于数据不包含在容器镜像中,容器镜像的大小可以大大减小。这不仅可以加快镜像的下载和部署速度,还可以节省存储空间。

bind mount 数据卷

在 Docker 中,Bind mount(绑定挂载)数据卷是一种将宿主机上的文件或目录挂载到容器中的方式。

Bind mount 的特点

  1. 直接映射:Bind mount 直接将宿主机上的特定文件或目录映射到容器中的指定路径。这意味着容器可以直接访问和修改宿主机上的文件系统内容。
  2. 灵活性高:可以选择宿主机上的任意文件或目录进行挂载,非常灵活。可以将配置文件、数据存储目录等挂载到容器中,方便在容器和宿主机之间共享数据。
  3. 实时同步:对宿主机上挂载的文件或目录的修改会立即反映在容器中,反之亦然。这种实时同步的特性使得在开发和调试过程中非常方便,可以快速看到对文件的修改在容器中的效果。

docker managed 数据卷

bind mount 必须指定 host 文件系统路径,限制了移植性
docker managed volume 不需要指定 mount 源, docker 自动为容器创建数据卷目录
默认创建的数据卷目录都在 /var/lib/docker/volumes
如果挂载时指向容器内已有的目录,原有数据会被复制到 volume

 清理未使用的 Docker 数据卷

注意:
1. 在执行 docker volume prune 命令之前,请确保你确实不再需要这些数据卷中的数据,因为
该操作是不可逆的,一旦删除数据将无法恢复。
2. 如果有重要的数据存储在数据卷中,建议先进行备份,或者确保数据已经被妥善保存到其他地
方。

建立数据卷

查看卷

使用建立的数据卷

bind mount 数据卷和docker managed 数据卷的对

 

备份与迁移数据卷

备份数据卷

# 建立容器并指定使用卷到要备份的容器
[root@docker-node1 ~]# docker run --volumes-from datavol \
-v `pwd`:/backup busybox \ # 把当前目录挂在到容器中用于和容器交互保存要备
份的容器
tar zcf /backup/data1.tar.gz /data1 # 备份数据到本地

 数据恢复

docker run -it --name test -v tcvol1:/data1 -v `pwd`:/backup busybox /bin/sh -
c "tar zxf /backup/data1.tar.gz;/bin/sh"
/ # ls
backup data1 etc lib proc sys usr
bin dev home lib64 root tmp var
/ # cd data1/ # 查看数据迁移情况
/data1 # ls
index.html tcfile1

 十一、Docker 的安全优化

Docker 容器的安全性,很大程度上依赖于 Linux 系统自身
评估 Docker 的安全性时,主要考虑以下几个方面:
        Linux内核的命名空间机制提供的容器隔离安全
        Linux控制组机制对容器资源的控制能力安全。
        Linux内核的能力机制所带来的操作权限安全
        Docker程序(特别是服务端)本身的抗攻击性。
        其他安全增强机制对容器安全性的影响
#在rhel9中默认使用cgroup-v2 但是cgroup-v2中不利于观察docker的资源限制情况,所以推荐使用cgroup-v1

 [root@docker-node1 ~]# grubby --update-kernel=/boot/vmlinuz-$(uname -r) \
--args="systemd.unified_cgroup_hierarchy=0
systemd.legacy_systemd_cgroup_controller"

命名空间隔离的安全

docker run 启动一个容器时, Docker 将在后台为容器创建一个独立的命名空间。命名空间提供了
最基础也最直接的隔离。
与虚拟机方式相比,通过 Linux namespace 来实现的隔离不是那么彻底。
容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作
系统内核。
Linux 内核中,有很多资源和对象是不能被 Namespace 化的,比如:磁盘等等

 

控制组资源控制的安全 

docker run 启动一个容器时, Docker 将在后台为容器创建一个独立的控制组策略集合。
Linux Cgroups 提供了很多有用的特性,确保各容器可以公平地分享主机的内存、 CPU 、磁盘 IO
资源。
确保当发生在容器内的资源压力不会影响到本地主机系统和其他容器,它在防止拒绝服务攻击 (DDoS )方面必不可少

 

内核能力机制

能力机制( Capability )是 Linux 内核一个强大的特性,可以提供细粒度的权限访问控制。
大部分情况下,容器并不需要 真正的 ”root 权限,容器只需要少数的能力即可。
默认情况下, Docker 采用 白名单 机制,禁用 必需功能 之外的其他权限。

Docker服务端防护 

使用 Docker 容器的核心是 Docker 服务端,确保只有可信的用户才能访问到 Docker 服务。
将容器的 root 用户映射到本地主机上的非 root 用户,减轻容器和主机之间因权限提升而引起的安全问题。
允许 Docker 服务端在非 root 权限下运行,利用安全可靠的子进程来代理执行需要特权权限的操作。
这些子进程只允许在特定范围内进行操作。

Docker的资源限制

Linux Cgroups 的全称是 Linux Control Group
是限制一个进程组能够使用的资源上限,包括 CPU 、内存、磁盘、网络带宽等等。
对进程进行优先级设置、审计,以及将进程挂起和恢复等操作。
Linux Cgroups 给用户暴露出来的操作接口是文件系统
它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。
执行此命令查看: mount -t cgroup

/sys/fs/cgroup 下面有很多诸如 cpuset cpu memory 这样的子目录,也叫子系统。
在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录)。
控制组下面的资源文件里填上什么值,就靠用户执行 docker run 时的参数指定。

限制cpu使用 

限制cpu的使用量

上传需要的镜像ubuntu-latest.tar.gz

再启动一个新的容器

限制cpu的优先级

 #关闭cpu的核心,当cpu都不空闲下才会出现争抢的情况,为了实验效果我们可以关闭一个cpu核心

开启容器并限制资源

[root@docker-node1 ~]# docker run -it --rm --cpu-shares 100 ubuntu

#设定cpu优先级,最大为1024,值越大优先级越高

开启另外一个容器不限制cpu的优先级

 

限制内存使用  

#测试容器内存限制,在容器中我们测试内存限制效果不是很明显,可以利用工具模拟容器在内存中写入数据
#在系统中/dev/shm这个目录被挂在到内存中

上传需要的rpm包libcgroup-0.41-19.el8.x86_64.rpm        libcgroup-tools-0.41-19.el8.x86_64.rpm

 也可以自建控制器

 

cgexec -g memory:doceker/容器id -g表示使用指定控制器类型  

限制docker的磁盘io

[root@docker-node1 ~]# docker run -it --rm        \

--device-write-bps \                                #指定容器使用磁盘io的速率

/dev/nvme0n1:30M ubuntu              #/dev/nvme0n1是指定系统的磁盘,30M即每秒30M数据

开启容器后会发现速度和设定不匹配,是因为系统的缓存机制

Docker的安全加固

Docker默认隔离性

在系统中运行容器,我们会发现资源并没有完全隔离开

解决Docker的默认隔离性

LXCFS 是一个为 LXC Linux Containers )容器提供增强文件系统功能的工具。

LXCFS 主要有以下几个重要作用:

增强容器资源可见性

在容器环境中,传统情况下获取的资源信息可能不准确或不完整。LXCFS 可以为容器提供更准确的资源视图。例如,通过它,容器内的进程可以看到与容器实际分配资源相符的 CPU、内存等信息,而不是仅看到宿主机的全局资源信息。这对于需要准确了解自身资源限制的应用程序至关重要,有助于进行性能调优和资源管理。

提高容器资源监控精度

对于容器化的应用,监控资源使用情况是确保系统稳定运行的关键。LXCFS 使得容器内的监控工具能够获取到更准确的资源使用数据。比如,监控工具可以更精确地测量容器的 CPU 使用率、内存占用等,从而更好地判断容器的健康状态和性能表现。这有助于及时发现资源瓶颈和潜在问题,以便采取相应的措施进行调整和优化。

改善容器资源隔离性感知

在容器化部署中,资源隔离是一个重要的特性。LXCFS 增强了容器对资源隔离的感知能力。容器可以清楚地知道自己所分配到的资源范围,避免因误判资源情况而导致的性能问题或资源竞争。同时,这也有助于提高容器的安全性,防止一个容器过度占用资源而影响其他容器的正常运行。

安装lxcfs

上传需要的rpm包

lxcfs-5.0.4-1.el9.x86_64.rpm
lxc-libs-4.0.12-1.el9.x86_64.rpm
lxc-templates-4.0.12-1.el9.x86_64.rpm

运行lxcfs并解决容器隔离性

容器特权

在容器中默认情况下即使我是容器的超级用户也无法修改某些系统设定,比如网络

这是因为容器使用的很多资源都是和系统真实主机公用的,如果允许容器修改这些重要资源,系统的稳定性会变的非常差
但是由于某些需要求,容器需要控制一些默认控制不了的资源,如何解决此问题,这时我们就要设置容器特权

如果添加了--privileged 参数开启容器,容器获得权限近乎于宿主机的root用户  

容器特权的白名单

--privileged=true 的权限非常大,接近于宿主机的权限,为了防止用户的滥用,需要增加限制,只提供给容器必须的权限。此时Docker 提供了权限白名单的机制,使用 --cap-add 添加必要的权限

capabilities手册地址: capabilities(7) - Linux manual page (man7.org)

限制容器对网络有root权限
网络可以设定,无法管理磁盘

十二、容器编排工具Docker Compose 

Docker Compose 概述

Docker Compose 是一种用于定义和运行多容器 Docker 应用程序的工具。

主要功能

  1. 定义服务配置
    • 可以使用 YAML 格式的文件来定义一组相关的容器服务,包括容器的镜像、端口映射、环境变量、卷挂载等配置信息。这使得可以轻松地在不同环境中重复部署相同的应用架构。
  2. 一键启动和停止
    • 通过简单的命令,可以一次性启动或停止由多个容器组成的应用程序。无需逐个手动启动每个容器,大大提高了部署效率。
    • 使用 docker-compose up 命令可以启动配置文件中定义的所有服务,使用 docker-compose down 命令可以停止并删除这些服务。
  3. 服务编排
    • 可以定义容器之间的依赖关系,确保服务按照正确的顺序启动和停止。例如,可以指定数据库服务必须在 Web 服务之前启动。
    • 支持网络配置,使不同服务的容器可以相互通信。可以定义一个自定义的网络,将所有相关的容器连接到这个网络上。

     4. 环境变量管理

                1.可以在配置文件中定义环境变量,并在容器启动时传递给容器。这使得在不同环境                       (如开发、测试和生产环境)中使用不同的配置变得更加容易。

                2.例如,可以定义一个数据库连接字符串的环境变量,在不同环境中可以设置不同的                         值。

优势

  1. 简化开发和测试环境搭建
    • 在开发过程中,开发人员可以快速创建一个包含多个服务的开发环境,每个服务都在独立的容器中运行。这使得开发、测试和调试更加方便,同时也避免了不同服务之间的冲突。
  2. 一致性部署
    • 由于使用了统一的配置文件,可以确保在不同的环境(如开发、测试、生产)中部署的应用程序具有一致的架构和配置。这有助于减少部署错误和提高应用程序的稳定性。
  3. 高效的资源管理
    • 通过合理配置容器的资源限制和请求,可以更好地管理系统资源,避免某个容器过度占用资源而影响其他容器的性能。

使用场景

  1. 微服务架构应用
    • 对于采用微服务架构的应用程序,Docker Compose 可以方便地管理众多的微服务容器。每个微服务都可以作为一个独立的容器进行部署和管理,通过 Docker Compose 进行统一的启动和配置。
  2. 开发和测试环境
    • 如前所述,为开发和测试团队提供快速搭建和管理一致的环境,提高开发效率和测试准确性。
  3. 小型项目部署
    • 对于一些小型项目,Docker Compose 可以提供一种简单而有效的方式来部署应用程序,无需使用复杂的容器编排工具。

 工作原理

        1. 读取配置文件

                Docker Compose 读取 YAML 配置文件,解析其中定义的服务和参数。

        2. 创建容器

                根据配置文件中的定义,Docker Compose 调用 Docker 引擎创建相应的容器。它会下                    载所需的镜像(如果本地没有),并设置容器的各种参数。

       3. 管理容器生命周期

                Docker Compose 监控容器的状态,并在需要时启动、停止、重启容器。

                它还可以处理容器的故障恢复,例如自动重启失败的容器。

Docker Compose 中的管理层

        1. 服务 (service) 一个应用的容器,实际上可以包括若干运行相同镜像的容器实例

 

        2. 项目 (project) 由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml                 文件中定义

 

        3. 容器( container )容器是服务的具体实例,每个服务可以有一个或多个容器。容器是基于              服务定义的镜像创建的运行实例

 

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
重启服务。

 注意,如果我们把yml文件名字修改成其他的,执行yml文件需要添加-f参数

服务状态查看

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 文件内容

Docker Compose yml文件 

Docker Compose 的 YAML 文件是用于定义和配置多容器 Docker 应用程序的重要工具。

服务(services

1. 服务名称( service1_name/service2_name 等)
每个服务在配置文件中都有一个唯一的名称,用于在命令行和其他部分引用该服务。
services:
        web:
                        # 服务1的配置
        mysql:
                        # 服务2的配置
2. 镜像( image
指定服务所使用的 Docker 镜像名称和标签。例如, image: nginx:latest 表示使用 nginx镜像的最新版本
services:
        web:
                images:nginx
        mysql:
                images:mysql:5.7
3. 端口映射( ports
将容器内部的端口映射到主机的端口,以便外部可以访问容器内的服务。例如, - "8080:80" 表示 将主机的 8080 端口映射到容器内部的 80 端口。

services:

        web:
                image: timinglee/mario
                container_name: game #指定容器名称
                restart: always #docekr容器自动启动
                expose:
                        - 1234 #指定容器暴露那些端口,些端口仅对链接的服务 可见,不会映射到主机的端口
                ports:
                        - "80:8080"

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

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

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

使用本机自带 bridge 网络

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

网络(networks 

定义 Docker Compose 应用程序中使用的网络。可以自定义网络名称和驱动程序等属性。
默认情况下 docker compose 在执行时会自动建立网路

networks:
  default:
    external: true                        #不建立新的网络而使用外部资源
    name: bridge                               #指定外部资源网络名字   

存储卷(volumes

定义 Docker Compose 应用程序中使用的存储卷。可以自定义卷名称和存储位置等属性。

企业示例

利用容器编排完成haproxynginx负载均衡架构实施

创建目录

 下载haproxy

拷贝配置文件

编辑haproxy的配置文件

上传haproxy的镜像包

 [root@docker-node1 test]# echo webserver1 > /var/lib/docker/volumes/data_web1/_data/index.html

[root@docker-node1 test]# echo webserver2 > /var/lib/docker/volumes/data_web2/_data/index.html
[root@docker-node1 test]# docker compose -f haproxy.yml up -d

然后去访问测试即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2166437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用Python实现运筹学——Day 3: 线性规划模型构建

一、学习内容 线性规划模型构建的步骤与技巧 线性规划(Linear Programming, LP)模型构建是运筹学中的核心内容,通常用于求解资源的最优分配问题。要从实际问题中提取出一个线性规划模型,需要按照以下步骤进行: 问题描…

JavaWeb——Vue组件库Element(1/6):快速入门(什么是Element,安装,引入ElementUI组件库,复制组件代码,启动项目 )

目录 什么是Element 快速入门 安装 引入ElementUI组件库 访问官网,复制组件代码 启动项目 小结 了解完前端的工程化之后,接下来了解一门新的前端技术:Vue 的组件库 Element。 学习完 Element 之后,即使作为一名 Java 后…

VMware 如何上网

需求 在PC window中下载了VMware,并且加载的是Ubuntu系统。PC电脑连接的是手机热点。 可以看出WLAN连接的名称是:Wi-Fi 6 AX201 16MHz 如何让Ubuntu系统也能够上网。并且更新库,能够sudo apt-get install xxx相关库。 目前虚拟机中的Ubun…

PMP--二模--解题--121-130

文章目录 9.资源管理!团建不是万能的121、 [单选] 项目团队中一些经验丰富的成员抱怨项目经理。这些高级项目团队成员觉得项目经理在事无巨细地管理他们,阻碍他们完成工作。当项目经理意识到这些问题时,应该怎么做? 14.敏捷--组织…

深度学习之开发环境(CUDA、Conda、Pytorch)准备(4)

目录 1.CUDA 介绍 1.1 CUDA 的基本概念 1.2 CUDA 的工作原理 1.3 CUDA 的应用领域 2. 安装CUDA 2.1 查看GPU版本 2.2 升级驱动(可选) 2.3 查看CUDA版本驱动对应的支持的CUDA ToolKit工具包 2.4 下载Toolkit 2.5 安装(省略&#xff0…

数据结构讲解二叉树 【一】

🎁🎁创作不易,关注作者不迷路🎀🎀 C语言二叉树 【一】 前言一、数概念及结构1.数的概念1.2树的相关概念1.3树的表示 二、二叉树的概念及结构2.12.2二叉树的性质2.3二叉树的存储结构 三、二叉树的顺序结构实现3.1二叉树…

【有啥问啥】“弱激励学习(Weak Incentive Learning)”的原理与过程解析

“弱激励学习(Weak Incentive Learning)”的原理与过程解析 一、引言 在机器学习、人工智能以及更广泛的教育与培训领域,学习范式的多样性为提升智能体(AI模型、学生或企业员工)的能力提供了丰富的路径。弱激励学习作…

【最简单最直观的排序 —— 插入排序算法】

【最简单最直观的排序 —— 插入排序算法】 插入排序是一种简单直观的排序算法。其基本思想是把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。 插入排序的核心就是多趟选择插…

python模块之getopt

getopt.getopt(args, shortopts, longopts[]) 解析命令行选项及参数列表。 args:要解析的参数列表,但不包括当前执行的python脚本名称,一般等同于sys.argv[1:]。 shortopts:要识别的短选项字符串,如果后接:表示需要…

C++入门day4-面向对象编程(下)

前言:C入门day3-面向对象编程(中)-CSDN博客 初识:继承特性 继承的基础语法 class A{ public:int a; }; class B:public A { public:int b; }; B类通过继承A类后,内部会继承一个int变量 a:从下图我们可以…

Mesa三角形光栅化过程关键代码

1.先看下mesa三角形光栅化效果 2.这里是主要实现代码,Mesa的代码也是非常多,看了好多天。关键实现过程代码这个s_tritemp.h中 3.这里主要介绍渲染一个矩形的过程 a)在glut中两行代码: b) 中间过程代码忽略,进入static GLboolean run_render(…

生活英语口语柯桥学英语“再确认一下“ 说成 “double confirm“?这是错误的!

在追求英语表达的过程中,我们常常会遇到一些看似合理实则错误的表达习惯。今天,我们就来聊聊一个常见的误区——“再确认一下”被误译为“double confirm”。 “再次确认”不是double confirm 首先,我们需要明确,“double confi…

POI从3.14升级为5.2.0

最近word用的功能有点多&#xff0c;3.14功能太少&#xff0c;升级一下。 从5.0.X开始&#xff0c;poi-ooxml–schemas被重命名为poi-ooxml–full 最新版是5.3.0&#xff0c;但是word转pdf的工具最新到poi的5.2.0&#xff0c;所以用这个版本了 properties中变量 <poi.versio…

在docker中找不到文件

问题 这是我的Dockerfile&#xff1a; FROM mcr.microsoft.com/dotnet/sdk:8.0 as build WORKDIR /app EXPOSE 80COPY TotechsThunder.sln TotechsThunder.sln COPY mock/programminglanguages/programminglanguage.js mock/programminglanguages/programminglanguage.js COP…

大觅网之业务部署(Business deployment of Da Mi Network)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

ubuntu20.04.6 触摸屏一体机,外接视频流盒子开机输入登录密码触屏失灵问题解决方法

1. 首先直接运行xrandr命令&#xff0c;查看设备的相关信息&#xff1a; 运行之后会显示当前连接设备的屏幕信息&#xff0c;如下图&#xff0c;LVDS和VGA-0&#xff0c;而HDMI屏幕为disconnect&#xff0c;意为没有连接&#xff1a; 2. 设置开机主屏幕显示&#xff1a; xrand…

TypeScript 设计模式之【建造者模式】

文章目录 **建造者模式**&#xff1a;打造你的梦想之屋建造者的秘密建造者有什么利与害&#xff1f;如何使用建造者搭建各种房子代码实现案例建造者模式的主要优点建造者模式的主要缺点建造者模式的适用场景总结 建造者模式&#xff1a;打造你的梦想之屋 假设你想要一栋完美的…

LeetCode[简单] 876. 链表的中间结点

给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 思路 对任意正整数 n&#xff0c;中间结点的编号可以表示成 ⌊2n​⌋1。 解法一 /*** Definition for singly-linked list.* public class L…

数据分析:线性回归计算嵌套的组间差异

文章目录 介绍加载依赖包导入数据数据预处理数据概览线性回归画图森林图的特点:森林图的作用:总结系统信息介绍 在统计学中,嵌套的组间差异分析是一种评估不同组别间差异的方法,尤其适用于层级结构或分组数据。通过线性回归模型,我们可以计算出各个变量对于因变量的影响,…

priority_queue优先级队列(堆)详解。C++经验+1

什么是堆 首先我们先了解什么是堆&#xff1f;堆分为大根堆和小根堆。但其实大根堆会让人误以为是不是大的元素在下面呢&#xff1f;为了防止错误想法&#xff0c;大根堆也可以叫大顶堆。 大顶堆&#xff1a;顶上元素最大&#xff0c;上一层比下一层元素大。 小顶堆&#xff…