前言
两年前我还没有接触过Docker,也不理解Docker在自动化工程应用中有什么帮助,但随着逐渐深入学习体会到了它的优点,这篇文章就从一个软件工程师角度来说说我在使用中哪些场景下发现了哪些易用点。
一、Docker是什么?
Docker是一种开源容器化平台,用于构建、发布和运行应用程序。它允许开发人员将应用程序及其依赖打包成一个轻量级、可移植的容器,并在不同的环境中快速部署和运行。它可以帮助开发人员轻松地创建、部署和运行应用程序,同时提高应用程序的可靠性、安全性和可维护性。Docker的核心是Docker引擎,它是一个轻量级的运行时环境,可以在任何操作系统上运行。
二、Docker和Virtual Machine的区别
上边这张图大家可能在之前也有见过,说明容器和虚拟机的区别,对于这两种方式在使用中有什么区别呢。刚好在这里介绍下之前了解到微内核与宏内核的区别,他们是操作系统设计的两种不同架构方式:
微内核:基于最小化核心设计,将最基本的操作系统服务和功能放在核心中,而其他高级功能则以独立的进程的形式运行在核心之外,这些独立的进程相互之间通过信息传递来实现进程间通信和协调功能。微内核相对较为简单,安全性高,易于扩展和维护,但是因为多个进程之间需要通信,所以性能较差。
宏内核:将操作系统的所有基本服务和功能,包括设备驱动程序、文件系统等全部都集成在内核中,形成一个庞大而复杂的内核结构。它的优点是性能高,运行效率高,但是随着内核不断增大,操作系统的可扩展性和可移植性都大大降低,且容易出现内核故障。
在Docker与Virtual Machine中有类似的情况,Docker
可以类比为宏内核,统筹所有通用资源,每个container都可以使用宏内核的资源。而Virtual Machine
可以类比为微内核,每个对象都有全部的程序和资源(即操作系统),这样必然导致不同的虚拟机重复运行了很多底层服务,占用过多资源。
三、Docker架构
Docker使用客户端-服务器架构。
Docker客户端与Docker守护进程进行对话,后者负责构建、运行和分发Docker容器。Docker客户端和守护进程可以在同一系统上运行,也可以将Docker客户端连接到远程Docker守护进程。Docker客户端和守护进程使用REST API通过UNIX套接字或网络接口进行通信。另一种Docker客户端是Docker Compose,它允许你启动由过个容器组成的应用程序。
1. Client
Client通过一些接口与其他两部分沟通交互,博主通常会用到的是:
# 推送镜像到registry
docker push ***
# 从registry拉镜像到本地
docker pull ***
# 根据docker file打包镜像
docker build *** ***
# 停止容器
docker stop ***
# 启动容器
docker start ***
# 搜索registry按特定名称
docker search ***
# 使用bash接入容器中
docker exec -it *** bash
# ...更多可以使用man 或 -h查看
这些指令让你和镜像及容器建立联系,后续你可能涉及搭建或使用本地registry但是原理是相同的。
2. Docker Host
Docker Daemon守护进程
它的工作是监听第1部分这些接口的,同时负责管理Docker的具体对象包括images, containers, networks, volumes等
守护进程还可以与其他守护进程通信以管理Docker服务。
通常我们在docker run
时配置的镜像、网络、卷等信息就通过守护进程进行管理和执行。
Images本地镜像
除了在registry上有大家push上去的镜像外,我们在本地运行时也需要有镜像对象的存在,我们通常使用docker images
来看本地的镜像情况,可以显示本地从registry pull下来的所有对象。
Container容器
这部分与我们平时联系也比较多,Container是镜像运行的实例,image是无法运行的,我们可以根据一个image构建多个Container对象出来,这些对象可以运行和执行程序及指令,通常我们的代码就在这里边运行。
3. Registry
Registry相对比较好理解,它就是镜像的管理服务器,类似github、gitee等存在,我们也可以在本地搭建Registry,之前有写多篇文章讲如何使用harbor搭建镜像服务器,如何配置gitlab registry等。
四、Docker在实际应用中的好处
配置环境
博主是从两年前接触到Docker的,在我们通常情况下入职第一件事是安装软件配置环境等,这就需要至少花费一天的时间,根据你所被安排不同的项目你还得安装和配置更多的软件及环境变量等,可怕的是万一有多个项目同时进行开发,那么你电脑内部的依赖软件和库版本会非常复杂,很容易造成异常。
在切入到Docker后这一块就很难造成困扰了,公司一般会更具情况分层级打包镜像,你在镜像基础上去构建对应的容器对象后进行开发,环境、依赖等都已经配好,大大降低了大家在配置环境上开发的时间和精力。
网络和卷
如果你是做网络开发对于端口管理往往比较多,Docker提供简单映射服务可以将host端口映射到容器中的端口,这意味着你不需要不停修改容器或虚拟机的端口来保证大家独特性,只需要通过映射服务就能将host外部端口与内部端口做绑定。同时支持多ip的绑定,将不同ip端口和特定容器端口绑定。
同时文件的管理也会更加方便:
- 可以将编译好的可执行文件映射到容器中
- 可以将日志文件很方便的映射到host
- 可以快速搭建文件共享等服务,将本地文件通过docker中的vsftp等镜像快速搭建共享服务器
更新管理
通过对镜像的分层管理,我们可以很便捷的进行程序的更新和环境的更新。
例子1:在项目运行过程中发现有一个依赖库或多个依赖库需要添加,按照传统方法大家每个人电脑都需要安装对应的依赖库,这个过程中通常会发生有人下载的版本不对,不知道什么奇怪的原因安装不上等。
如果通过对底层镜像统一管理,就可以由系统架构师更新底层镜像的库依赖,大家pull一下最新镜像重新运行编译程序即可。文章来源:https://www.toymoban.com/news/detail-481999.html
总结
以上就是博主想要分享给大家的内容,即使在机器人自动化这类相对比较传统的行业中,Docker的使用也极大推动了研发效率、降低了维护的难度、且极大弱化了本地操作系统环境的影响。文章来源地址https://www.toymoban.com/news/detail-481999.html
到了这里,关于作为软件工程师对Docker的认知和看法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!