一位老司机 发表于 2025-4-19 14:50:21

KylinSP3 | 两篇搞定金砖信息技术应用创新赛Docker容器集群管理(2/2)

使用环境 Kylin-Server-V10-SP3
有疑问可以加交流群:912987429
一、知识准备

1. Docker Network

Docker的网络实现其实就是利用Linux上网络命名空间、网桥和虚拟网络设备(VETH)来实现。默认情况下,Docker 安装完成后会创建一个网桥 docker0。Docker中的网络接口默认都是虚拟的网络接口。Docker容器网络在本地主机和容器内分别创建一个虚拟接口,并让它们彼此连通。
创建容器的时候可以通过 --network 命令来指定容器网络,网络类型共分为以下四种:
bridge host none 容器网络
1.1 bridge网络

桥接网络是指容器通过桥接的方式将容器网卡桥接到宿主机的 docker0 网桥,然后通过宿主机防火墙的NAT表与外网联系。 bridge 模式下容器没有公网IP地址,只有宿主机可以直接访问,外部主机是不可见的,但是容器通过宿主机的NAT后可以访问外网。默认创建容器所使用的网络为bridge。
查看docker0网桥信息
ip address show docker0xxxxxxxxxx ip address show docker0ip add show

Bridge网络示例图



1.2 host网络

host模式是bridge桥接模式的补充。采用host模式的 Docker Container,可以直接使用宿主机的IP地址与外界进行通信,如果宿主机的eth0是一个公有网卡,那么容器也拥有这个公有IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外的NAT转换。


1.3 none网络

网络环境为none,也就是不给Docker Container 任何的网络环境。一旦Docker Container采用了none网络模式,那么容器内部只能使用loopback设备,不会存在其它网络资源。none模式为Docker Container做了即极少的网络设定。
1.4 容器网络

查找 other container(需要被共享网络环境的容器)的网络 namespace,将新创建的 Docker Container(需要被共享其它网络的容器)的namespace,使用other container的namespace。Docker Container的other container网络模式,可以用来服务容器间的通信。这种模式节约了一定数量的网络资源,但是没有改善容器与宿主机以外世界通信。
1.5 overlay模型

在Docker中,overlay是众多Docker网络模型中的一种,是一种跨主机的全局网络模型,有一个数据库专门来存储网络分配信息,避免IP地址冲突,同时内部还有一个小型的DNS我们可以直接通过主机名进行访问。会定义一个DHCP地址池,比如10.0.9.0/24,容器的IP地址会通过DHCP获取,获取完毕后会通过eth1进行通信,实现跨主机访问。



1.6 macvlan模型

在Docker中,macvlan是众多Docker网络模型中的一种,并且是一种跨主机的网络模型,作为一种驱动启用,Docker macvlan只支持 bridge模式。macvlan需要一块独立的网卡来进行使用,所以我们需要新添加一块网卡。
2. Registry镜像仓库

在Docker中,当我们执行docker pull xxx时,实际上是通过hub.docker.com这个地址下面去查找,这是Docker公司为我们所提供的公共仓库。为了更好的管理镜像,Docker不仅提供了一个中央仓库,还允许我们搭建本地私有仓库。
公网仓库:docker hub 私有仓库:registry、harbor
2.1 registry工作原理

Docker registry一共有三个角色,分别是 index、registry 和 registry client
index:负责并维护有关用户账户、镜像的校验以及公共命名空间的信息
Web UI 元数据存储 认证服务 符号化
2.2 用户请求下载镜像

当用户发送请求到index来下载镜像时,index 响应返回三个相关部分信息:
该镜像所在的 resgistry 该镜像所有层的校验 授权目的的 Token
用户通过响应返回的 Token 和 registry 沟通,registry 负责镜像,registry存储基本的镜像和继承的层。
registry 会与 index 证实该 Token是被授权的。index 会发送 “true”或“false”返回给 registry,由此允许用户下载所需要的镜像。



2.3 用户上传镜像

用户发送带证书请求到index请求分配库名。在认证后,当命名空间可用和库名被成功分配,index返回临时的 Token。
用户要求上传的Token + 镜像,一起被上传到 Registry中,Registry与index一起验证 Token,在index验证后开读取上传流,随后更新Docker生成的镜像校验。



2.4 用户删除镜像

index 接收到来自Docker的一个删除信号,如果index验证库成功,将会删除该库,并返回一个临时Token,Registry接受到带有该Token的删除信号,会向index核实该Token,然后删除库以及相关信息。Docker现在通知有关删除的index,然后index移除库中的所有记录。



3. Harbor镜像仓库

harbor是一个用于存储和分发 Docker镜像的企业级 Register服务器,通过添加向一些企业必须的功能特性,例如安全、标识、管理等。作为一个企业级私有Register服务器,Harbor提供了更好的性能和安全,提升用户使用Register构建和运行环境传输镜像的效率。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
Harbor特性
基于角色的访问控制:用户与Docker镜像仓库通过“项目“进行组织管理 镜像复制:镜像可以在多个Register实例中复制(同步) 图形化用户界面:用户可以通过浏览器来浏览,检索当前Docker 镜像仓库,管理项目和命名空间 AD/LDAP支持:Harbor可以集成企业内部已有的 AD/LDAP 审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理 国际化:拥有英文、中文、德文、日文和俄文的本地化版本 RESTful API:RESTful API提供给管理员对于Harbor更多的操控 部署简单:提供在线和离线两种安装工具
二、Dockerfile

1. 理解镜像

镜像可以看成是由多个镜像层叠加起来的一个文件系统(通过UnionFS与AUFS文件联合系统实现),镜像层可以理解为一个基本的镜像,而每个镜像层之间通过指针的形式进行叠加。



镜像层的主要组成部分包括镜像层ID、镜像层指针指向父层、元数据Layer Metadata,包含Docker构建和运行信息和父层的层次信息。只读层和读写层Top Layer的组成部分基本一致,同时读写层可以转换为只读层,通过docker commit实现。


每一层都包括一个指向父层的指针,如果某一层不存在指针,证明该层是最底层。



2. Dockerfile

Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像。Dockerfile由一行行命令语句组成,支持以#开头的注释行。Dockerfile主体内容分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
常见的操作指令
指令说明RUN运行执行命令CMD启动容器时自动执行的命令COPY复制本地文件到镜像ADD复制文件到镜像常见的配置指令
指令说明ARG定义创建镜像过程中使用的变量FROM指定基础镜像LABEL为生成的镜像添加元数据标签信息EXPOSE声明镜像内服务监听的端口ENV指定环境变量ENTRYPOINT指定镜像的默认入口命令VOLUME挂载USER指定运行容器时的用户名或UIDWORKDIR配置工作目录ONBUILD创建子镜像时自动执行的操作指令STOPSIGNAL配置退出信号值HEALTHCHECK配置启动容器如何进行健康检查SHELL指定默认shell类型2.1 FROM指令

功能为指定基础镜像,必须是第一条指令,如果不以任何镜像为基础,写法为如下:
FROM scratch同时意味着接下来所写的指令作为镜像的第一层开始。如果没有指定镜像的TAG,默认值为latest。
FROM centos                # 等同于 FROM centos:latest2.2 MAINTAINER指令

指定作者信息
MAINTAINER mike2.3 LABEL指令

为镜像指定标签
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"

# 换行符写法
LABEL description="This text illustrates \
that label-values can span multiple lines."2.4 RUN指令

运行指定的命令,第一项为执行的文件或程序,后面接上参数
多行命令不要写多个RUN,在Dockerfile中每一个指令都会建立一层。RUN书写时的换行符是\,可以通过换行来区分命令。而不要书写多个RUN指令,书写多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅增加了构建部署的时间,还容器出错。
# 有两种格式,例如打印 Hello
RUN /bin/sh -c'echo Hello'
RUN ['/bin/sh','-c','echo Hello'
页: [1]
查看完整版本: KylinSP3 | 两篇搞定金砖信息技术应用创新赛Docker容器集群管理(2/2)