当前位置: 欣欣网 > 码农

用了这么多年Docker,殊不知你还有这么多弯弯绕!

2024-06-05码农

嗨,你好呀,我是哪吒。

单体应用拆分成微服务后,能够实现快速开发迭代,但因为小服务太多,导致测试和部署的成本提高。

单体应用中,将Spring Boot工程打包成一个war包,然后部署在Linux服务器的Tomcat中就可以了。

拆分成微服务后,修改一个需求,可能会涉及多个微服务,这个时候,被修改过的代码都需要重新测试、打包、部署、上线发布。无形之中,给现场运维人员增加了成倍的工作压力。

微服务通常会在共有云上创建ECS进行扩容,ECS通常只包含了基本的操作系统环境,没有包含运行java的环境jdk,就需要在ECS上安装jdk,而且每个服务依赖的jdk版本可能也不会相同,一般情况下,都会采用jdk8, 有些喜爱前言技术的项目经理,可能要试一下jdk21,毕竟也是一个长期稳定的大版本。

而容器技术可以解决上面的两个问题(代码部署难、缺环境)。

时下容器技术最火的当属Docker, 很多小伙伴也用了多年,只知道它是容器技术,可以将程序和依赖打到Docker里,然后发布在Linux服务器中,就完成了程序的部署, 一次构建、到处运行 ,很牛逼, 至于其它的,就不知道了,也不想知道~

一、神之容器 Docker

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker属于Linux容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的Linux容器解决方案。

一个完整的Docker由以下七个部分组成:

  1. Docker Client 客户端

  2. Docker Daemon 守护进程 ,提供Docker Server,用于接收Docker Client的请求,Docker Server 通过路由Router与分发调度,找到相应的 Handler 来执行请求;

  3. Docker Image 镜像 ,包含Distribution(分发)、Layer(层)、Image(镜像)、Registry(注册中心)、Reference(引用);

  4. Docker Driver 驱动 ,Docker架构中的驱动模块,它主要通过与Docker守护进程进行交互,实现对Docker容器执行环境的定制和管理;

  5. Docker Graph 内部数据库 ,Docker Graph是Docker中的一种数据结构,用于记录和跟踪Docker镜像和容器之间的关系;

  6. Libcontainer 函数库 ,Libcontainer是Docker的底层容器管理库,它提供了一组接口和函数,用于创建和管理容器。Libcontainer直接与内核交互,负责容器的命名空间、cgroup、网络设备等底层操作;

  7. Docker Container 容器 ,Docker Container是Docker中的容器实例,它是通过Driver和Libcontainer共同协作创建出来的。Driver提供了容器的运行环境定制,而Libcontainer则负责容器的具体创建和管理操作。

二、Docker架构图

  1. 用户使用 Docker Client (客户端) 与 Docker Daemon 建立通信,并发送请求给后者,客户端和守护程序之间通过REST API进行通信,可以使用UNIX套接字或网络接口;

  2. Docker Daemon (后台守护进程)提供Docker Server,用于接收Docker Client的请求,Docker Server 通过路由Router与分发调度,找到相应的 Handler 来执行请求,Docker Daemon提供Docker Engine,Engine是Docker 架构中的运行引擎,在Docker Engine中,一个Job可以被认为是内部最基本的工作执行单元。Docker可以做的每一项工作,都可以抽象为一个Job。例如,在容器内部运行一个进程,这是一个Job;创建一个新的容器,这也是一个Job。

  3. Docker Image 镜像,包含Distribution(分发)、Layer(层)、Image(镜像)、Registry(注册中心)、Reference(引用)。

  4. Docker Driver 驱动,Docker架构中的驱动模块,它主要通过与Docker守护进程进行交互,实现对Docker容器执行环境的定制和管理;

  5. 当需要容器镜像时,则从 Registry(注册中心) 中下载镜像,并通过镜像管理驱动 Graphdriver 将下载镜像以 Graph 的形式存储;

  6. Docker Graph 内部数据库 ,Docker Graph是Docker中的一种数据结构,用于记录和跟踪Docker镜像和容器之间的关系;

  7. 一个 Repository 表示某类镜像的仓库,同一个 Repository 内的镜像用 Tag 来区分,一个 Registry 包含多个Repository,一个 Repository 包含同类型的多个 Image,并存储着每一个容器镜像的具体信息;GraphDB是一个基于SQLite的小型图数据库,记录容器镜像之间的关系;

  8. rootfs是Docker容器的根文件系统,它位于bootfs之上,表现为Docker容器的根目录,包含基本的文件和目录。在Docker中,rootfs由内核挂载为「只读」模式,而后通过「联合挂载」技术额外挂载一个「可写」层;

  9. 通过 Networkdriver 完成Docker容器网络环境的配置,其中包括Docker启动时为Docker环境创建网桥等功能;

  10. Docker Execdriver是Docker容器的执行驱动,负责创建容器运行命名空间,负责容器资源使用的统计与限制,负责容器内部进程的真正运行等;

  11. Libcontainer 是Docker的底层容器管理库,它提供了一组接口和函数,用于创建和管理容器。Libcontainer直接与内核交互,负责容器的命名空间、cgroup、网络设备等底层操作;

  12. Docker Container 是Docker中的容器实例,它是通过Driver和Libcontainer共同协作创建出来的。Driver提供了容器的运行环境定制,而Libcontainer则负责容器的具体创建和管理操作。Docker Container是Docker架构中服务交付的最终体现形式。实现「一次构建,到处运行」的目标,大大提高了应用程序的部署效率和可移植性。

1、Docker Client 客户端

Docker Client是Docker的客户端工具,也被称为Docker命令行界面(CLI)。它是用户与Docker平台进行交互的主要方式。

Docker Client 的主要作用如下:

  1. 用户交互界面 :Docker Client提供了用户友好的命令行交互界面,用户可以通过输入命令来执行各种Docker操作,例如创建容器、启动容器、停止容器、构建镜像等。

  2. 容器管理 :通过Docker Client,用户可以方便地管理Docker容器。可以创建新的容器、启动、停止、重启容器,并且还可以查看容器的日志、状态等信息。

  3. 镜像管理 :Docker Client也允许用户管理Docker镜像。用户可以搜索、下载、构建、删除镜像等操作,以满足应用程序部署的需求。

  4. 资源配置 :用户可以通过Docker Client配置容器的运行资源,例如CPU、内存等。这样可以确保容器在运行时具有合适的资源配置。

  5. 网络通信 :Docker Client可以与Docker Daemon进行通信,发送请求并接收响应。它使用REST API或其他通信协议与Docker Daemon进行交互,从而实现对Docker容器的远程管理。

Docker Client是用户与Docker平台进行交互的重要工具。它提供了命令行界面,让用户能够方便地管理Docker容器和镜像,并进行资源配置和网络通信等操作。

2、Docker Daemon 守护进程

Docker Daemon是Docker的守护进程,它是Docker平台的后台服务组件,充当服务器角色。

Docker Daemon 的主要作用如下:

  1. 容器管理 :Docker Daemon负责创建、启动、停止、删除和管理Docker容器。它接收来自Docker客户端的请求,并根据请求执行相应的容器管理操作。

  2. 镜像管理 :Docker Daemon也管理Docker镜像。它可以下载、上传、构建和删除镜像,并管理镜像的版本控制和安全性。

  3. 网络资源管理 :Docker Daemon负责创建和管理Docker容器的网络环境。它配置和管理容器的网络设置,确保容器之间的通信和互相访问。

  4. 数据卷管理 :Docker Daemon还管理容器的数据卷,用于持久化存储容器中的数据,保证数据的可靠性和持久性。

Docker Daemon是Docker平台的核心组件,提供容器、镜像、网络和数据卷的管理功能。它扮演着守护进程的角色,确保Docker平台的正常运行和管理。

3、镜像(Image)

在Docker镜像中,Distribution、Layer、Image、Registry和Reference各自扮演了重要角色。

  1. Distribution(分发) :通常涉及到Docker镜像的分发和运输。Docker镜像可以通过不同的方式进行分发,例如直接从Registry下载,或者通过特定的工具导入和导出;

  2. Layer(层) :Docker镜像由多个layer层组成,每层都是一个只读的文件系统。这种分层设计可以实现共享和复用,提高效率。当镜像中的文件发生变化时,Docker只会下载发生变化的层,而不是整体镜像,节省了时间和宽带;

  3. Image(镜像) :镜像是Docker的核心,它是运行容器的基础。镜像包含了运行应用程序的所有文件和依赖,是一个只读模板,可以通过镜像创建新的容器实例;

  4. Registry(注册中心) :Registry是存储和管理Docker镜像的服务器。它是用户上传、下载、管理Docker镜像的地方。例如Dokcer Hub就是一个公共的Registry;

  5. Reference(引用) :引用指的是Docker镜像的一种标识,通过引用,用户可以指定需要操作的特定镜像;


三、run的流程和docker原理

1、run的流程

2、与传统虚拟化方式对比

这就是Docker为何比虚拟化更快的原因,Docker有着比虚拟机更少的抽象层,docker利用的是宿主机的内核,VM需要的是Guest OS。

直接访问、经济、稳定 使用最新ChatGpt4o的方法

给大家推荐一个ChatGPT 4o国内网站,是我们团队一直在使用的,我们对接的是OpenAI官网的账号,给大家打造了一个一模一样的ChatGPT,很多粉丝朋友现在也都通过我拿这种号,价格不贵,关键还有售后 。

一句话说明 用官方一半价格的钱,用跟官方 ChatGPT4.0 一模一样功能的工具,而且不需要魔法,直接使用,不用担心网络问题。

功能简介:O penAI最新大模型GPT-4o、ChatGPT4.0知识问答、最强代码大模型Code Copilot、DALL-E AI绘画、写论文大模型Consensus、论文降重大模型(中文论文降重)、图片自动识别、联网查询、BUG解决、代码优化、上传文件、数据分析等。

国内直接使用 ChatGPT4o

  1. 支持OpenAI最新的ChatGPT4o。

  2. 无需魔法, 同时支持 PC、手机、平板,浏览器直接使用

  3. 一个账号一个专属授权码,保护个人隐私,使用记录长期保存。

  4. ChatGPT3.5永久免费, 提供免费共享GPT3.5授权码 。

  5. 官方独立账户规定每3小时40次 4.0提问,我们这个不限制4.0提问次数。

  6. 我们这个不会出现封号的情况,避免你因为封号多花冤枉钱。

  7. 联系站长 18640839506 ,备注AI,直接使用ChatGPT4o,拉你进ChatGPT售后群,群公告有使用说明和注意事项,有任何问题群里交流,群里有专业的技术支持

ChatGPT4o

NOW 6 .3

四、Docker安装

1、卸载Docker

sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

2、需要的安装包

yum install -y yum-utils

3、设置镜像仓库

yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

用国内的

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新软件包索引

yum mackecache fast

4、安装Docker相关

ce社区版,ee企业版,推荐安装企业版

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

5、启动Docker

systemctl start docker

6、使用docker version查看版本

7、启动hello world镜像

docker run hello-world

五、docker常用命令小结

常用命令 命令含义
attach 当前shell下attach连接指定运行镜像
build 通过Dockerfile定制镜像
commit 提交当前容器为新的镜像
cp 从容器中拷贝指定文件或者目录到宿主机中
create 创建一个新的容器,同run 但不启动容器
diff 查看docker容器变化
events 从docker服务获取容器实时事件
exec 在已存在的容器上运行命令
export 导出容器的内容流作为一个tar归档文件(对应import)
history 展示一个镜像形成历史
images 列出系统当前镜像
import 从tar包中的内容创建一个新的文件系统映像(对应export)
info 显示系统相关信息
inspect 查看容器详细信息
kill 强制停止指定docker容器
load 从一个tar包中加载一个镜像(对应save)
login 注册或者登陆一个docker源服务器
logout 从当前Docker registry退出
logs 输出当前容器日志信息
pause 暂停容器
port 查看映射端口对应的容器内部源端口
ps 列出容器列表
pull 从docker镜像源服务器拉取指定镜像或者库镜像
push 推送指定镜像或者库镜像至docker源服务器
rename 重命名容器
restart 重启运行的容器
rm 移除一个或者多个容器
rmi 移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)
run 创建一个新的容器并运行一个命令
save 保存一个镜像为一个tar包(对应load)
search 在docker hub中搜索镜像
start 启动容器
stats 统计容器使用资源
stop 停止容器
tag 给镜像打标签
top 查看容器中运行的进程信息
unpause 取消暂停容器
version 查看容器版本号
wait 截取容器停止时的退出状态值

回复gpt,获取ChatGPT4o直接使用地址

点击阅读原文,国内直接使用ChatGpt4o