> 文档中心 > EdgeX Foundry第一弹 容器运行时docker与服务编排

EdgeX Foundry第一弹 容器运行时docker与服务编排

本文为Edgex系列第一篇文章,主要探讨容器化相关内容。

一、了解Edgex为什么先学习容器?

1.应用服务调度。Edgex服务众多,包含应用服务支持服务设备服务安全服务中间件等,使用容器部署更为便利。

2.官方对于云原生的支持,参考仓库:

docker-compose :github.com/edgexfoundr…

kubernetes :github.com/edgexfoundr…

3.边缘计算社区生态的支持,如kubeedgek3s等轻量级k8s服务。另外kubeedge也提供一定的设备接入与云边协同能力。

3.为应用服务提供CI/CD支持,如集成jenkins等。

二、容器与虚拟机差异

因为资源关系,目前内部集群搭建也有使用基于KVM的虚拟化,那么虚拟机和容器有何区别,容器为什么比虚拟机更受欢迎?

如图所示,虚拟机基于hypervisor软件在操作系统上对硬件资源做了虚拟化,并在虚拟化设备上重新构建了一个操作系统Guest OS,对宿主机的网络请求、磁盘I/O等造成较大的负荷,具体对比参数请参考 Docker容器与KVM虚拟机的性能对比与研究;

虚拟化技术则基于Namespace等技术,创建一个隔离视图,使得进程之间资源相互隔离,但本质还是直接运行在宿主机的进程,因而资源开销更少,性能更高。不过容器受欢迎的原因远不止于此,如Docker镜像等功能也至关重要,即所谓的Build once, Run anywhere

三、Docker技术原理

Docker 是利用 Linux 的 NamespaceCgroups 和联合文件系统三大机制来保证实现的, 所以它的原理是使用 Namespace 做主机名、网络、PID 等资源的隔离,使用 Cgroups 对进程或者进程组做资源(例如:CPU、内存等)的限制,联合文件系统用于镜像构建和容器运行环境。

Namespace 是 Linux 内核的一项功能,该功能对内核资源进行隔离,使得容器中的进程都可以在单独的命名空间中运行,并且只可以访问当前容器命名空间的资源。Namespace 可以隔离进程 ID、主机名、用户 ID、文件名、网络访问和进程间通信等相关资源。

Docker 主要用到以下五种命名空间。

pid namespace:用于隔离进程 ID。

net namespace:隔离网络接口,在虚拟的 net namespace 内用户可以拥有自己独立的 IP、路由、端口等。

mnt namespace:文件系统挂载点隔离。

ipc namespace:信号量,消息队列和共享内存的隔离。

uts namespace:主机名和域名的隔离。

Cgroups 是一种 Linux 内核功能,可以限制和隔离进程的资源使用情况(CPU、内存、磁盘 I/O、网络等)。在容器的实现中,Cgroups 通常用来限制容器的 CPU 和内存等资源的使用。

联合文件系统 联合文件系统,又叫 UnionFS,是一种通过创建文件层进程操作的文件系统,因此,联合文件系统非常轻快。Docker 使用联合文件系统为容器提供构建层,使得容器可以实现写时复制以及镜像的分层构建和存储。常用的联合文件系统有 AUFS、Overlay 和 Devicemapper 等。

四、Docker 核心概念

镜像:一个只读的文件和文件夹组合,包含了容器运行时需要得所有基础文件和配置信息,是容器启动的基础。

容器:镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有初建、运行、停止、暂停和删除五种状态。

仓库:Docker 的镜像仓库类似于代码仓库,用来存储和分发 Docker 镜像。镜像仓库分为公共镜像仓库和私有镜像仓库。常用公共镜像仓库:hub.docker.com/,私有仓库可以使用阿里云(测试),或者自建habor仓库等。

镜像、容器、仓库,三者之间的联系:

docker架构:

Docker 整体架构采用 C/S(客户端 / 服务器)模式,客户端负责发送操作指令,服务端负责接收和处理指令。

五、docker安装

step 1:卸载已有资源 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine

step 2:添加 Docker 安装源 yum-config-manager \ --add-repo \

step 3: 安装最新版本Docker yum install docker-ce docker-ce-cli containerd.io

如果想要安装指定版本的Docker,可以使用以下命令

yum list docker-ce --showduplicates | sort -r

yum install docker-ce- docker-ce-cli- containerd.io

step 4: 启动docker

systemctl start docker

启动完成后,运行hello world容器,检查是否安装正确,命令如下:

docker run hello-world

Docker 首先会检查本地是否有hello-world这个镜像,如果发现本地没有这个镜像,Docker 就会去 Docker Hub 官方仓库下载此镜像,然后运行它。最后输出 "Hello from Docker!" 并退出。

如需卸载docker,执行yum -y remove docker-engine,,如需删除镜像、容器、卷以及自定义文件,可执行以下命令:

rm -rf /var/lib/docker

六、Docker基础操作

拉取镜像,使用docker pull命令拉取远程仓库的镜像到本地 ;

命令格式:docker pull [Registry]/[Repository]/[Image]:[Tag]

重命名镜像,使用docker tag命令“重命名”镜像 ;

命令格式:docker tag [SOURCE_IMAGE](#) [TARGET_IMAGE](#)

查看镜像,使用docker image lsdocker images命令查看本地已经存在的镜像 ;

删除镜像,使用docker rmi命令删除镜像 ;

构建镜像,构建镜像有两种方式。第一种方式是使用docker build命令基于 Dockerfile 构建镜像,也是我比较推荐的镜像构建方式;第二种方式是使用docker commit命令基于已经运行的容器提交为镜像。

Dockerfile常用指令:

eg:

FROM centos:7​COPY nginx.repo /etc/yum.repos.d/nginx.repo​RUN yum install -y nginx​EXPOSE 80​ENV HOST=iotnginx​CMD ["nginx","-g","daemon off;"]复制代码

第一行表示基于 centos:7 这个镜像来构建自定义镜像。这里需要注意,每个 Dockerfile 的第一行除了注释都必须以 FROM 开头。

第二行表示拷贝本地文件 nginx.repo 文件到容器内的 /etc/yum.repos.d 目录下。这里拷贝 nginx.repo 文件是为了添加 nginx 的安装源。

第三行表示在容器内运行yum install -y nginx命令,安装 nginx 服务到容器内,执行完第三行命令,容器内的 nginx 已经安装完成。

第四行声明容器内业务(nginx)使用 80 端口对外提供服务。

第五行定义容器启动时的环境变量 HOST=iotnginx,容器启动后可以获取到环境变量 HOST 的值为 iotnginx。

第六行定义容器的启动命令,命令格式为 json 数组。这里设置了容器的启动命令为 nginx ,并且添加了 nginx 的启动参数 -g 'daemon off;' ,使得 nginx 以前台的方式启动。

七、单机服务编排

单机服务编排工具Docker-compose,这里我们介绍他的安装与基础命令。

下载方式一:github

curl -L "https://github.com/docker/compose/releases/download/${release_tag}/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose复制代码

替换release_tag为对应版本。

下载方式二:百度云

链接:https://pan.baidu.com/s/1E1LW9MVrJ-S6nfqJ1HZ3Ww 提取码:kuqw复制代码

移动到bin目录下,方便调用:

 mv docker-compose-Linux-x86_64-1.22.0 /usr/local/bin/docker-compose复制代码

添加执行权限:

chmod +x /usr/local/bin/docker-compose复制代码

注意:

docker版本是否兼容。

常用命令:

  • 启动:docker-compose up -d 注意这里需要在yml配置文件路径执行,其他路径执行需要-f指定配置文件地址。
  • 查看日志:docker-compose logs -f ${compose-contatainer-name}
  • 停止:docker-compose stop
  • 停止并删除容器:docker-compose down
  • 其他命令帮助:docker-compose --help

八、集群服务编排

集群服务编排,这里介绍四种方式。

docker swarm方式基于Docker API实现,且使用较为简单;

kubernetes方案推荐使用kubespray一键部署生产集群,但注意新版本k8s是不再支持docker;

kubeedge/k3s可以作为边缘端服务编排工作,另外kubeedge提供云边协同能力,后续也会介绍相关的baetyl等内容;

因为本系列使用docker-compose作为编排工具,暂时不展开。如有需要,请参考:

1. docker swarm

2. kubernetes+containerd/cri-o/docker

3.kubeedge

4.k3s

5.baetyl

九、参考资料

docs.docker.com/get-started…

docs.docker.com/compose/ref…

docs.docker.com/engine/swar…

kubernetes.io/zh/docs/set…

www.bilibili.com/video/av887…

kubeedge.io/zh/

github.com/zxxf18/edge…