本文为Edgex系列第一篇文章,主要探讨容器化相关内容。
1.应用服务调度。Edgex
服务众多,包含应用服务
、支持服务
、设备服务
、安全服务
、中间件
等,使用容器部署更为便利。
2.官方对于云原生的支持,参考仓库:
docker-compose :github.com/edgexfoundr…
kubernetes :github.com/edgexfoundr…
3.边缘计算社区生态的支持,如kubeedge
、k3s
等轻量级k8s
服务。另外kubeedge
也提供一定的设备接入与云边协同能力。
3.为应用服务提供CI/CD
支持,如集成jenkins
等。
因为资源关系,目前内部集群搭建也有使用基于KVM的虚拟化,那么虚拟机和容器有何区别,容器为什么比虚拟机更受欢迎?
如图所示,虚拟机基于hypervisor软件在操作系统上对硬件资源做了虚拟化,并在虚拟化设备上重新构建了一个操作系统Guest OS,对宿主机的网络请求、磁盘I/O等造成较大的负荷,具体对比参数请参考 Docker容器与KVM虚拟机的性能对比与研究;
虚拟化技术则基于Namespace等技术,创建一个隔离视图,使得进程之间资源相互隔离,但本质还是直接运行在宿主机的进程,因而资源开销更少,性能更高。不过容器受欢迎的原因远不止于此,如Docker镜像等功能也至关重要,即所谓的Build once, Run anywhere
。
Docker 是利用 Linux 的 Namespace
、Cgroups
和联合文件系统三大机制来保证实现的, 所以它的原理是使用 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 镜像。镜像仓库分为公共镜像仓库和私有镜像仓库。常用公共镜像仓库:hub.docker.com/,私有仓库可以使用阿里云(测试),或者自建habor仓库等。
镜像、容器、仓库,三者之间的联系:
docker架构:
Docker 整体架构采用 C/S(客户端 / 服务器)模式,客户端负责发送操作指令,服务端负责接收和处理指令。
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-
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 pull命令拉取远程仓库的镜像到本地 ;
命令格式:docker pull [Registry]/[Repository]/[Image]:[Tag]
重命名镜像,使用docker tag命令“重命名”镜像 ;
命令格式:docker tag [SOURCE_IMAGE](#) [TARGET_IMAGE](#)
查看镜像,使用docker image ls
或docker 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…