Docker Daemon可以认为是通过Docker Server模块接受Docker Client的请求,并在Engine中处理请求,然后根据请求类型,创建出指定的Job并运行。Docker Daemon运行在Docker Host上,负责创建、运行、监控容器,构建、存储镜像。
运行过程的作用有以下几种可能:
-
向Docker Registry获取镜像
-
通过grapthdriver执行容器镜像的本地化操作
-
通过networkdriver执行容器网络环境的配置
-
通过execdriver执行容器内部运行的执行工作
由于Docker Daemon和Docker Client的启动都是通过可执行文件Docker来完成的,因此两者的启动流程非常相似。Docker可执行文件运行时,运行代码通过不同的命令行flag参数,区分两者,并最终运行两者各自相应的部分。
启动Docker Daemon时,一般可以使用一下命令来完成
docker --daemon = true
docker –d
docker –d = true
再由docker的main函数来解析以上命令的相应的flag参数,并最终完成Docker Daemon的启动。
Docker Daemon的启动流程:
默认配置下, Docker Daemon只能相应来自本地host的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开TCP监听。我们可以照着如下步骤进行配置:
(1)编辑配置文件 /etc/systemd/system/multi-user.target.wants/docker.service
,在环境变量 ExecStart
后面添加 -H tcp://0.0.0.0
,允许来自任意 IP 的客户端连接。
(2)重启 Docker Daemon
systemctl daemon-reload
systemctl restart docker.service
(3)我们通过以下命令即可实现与远程服务器通信
docker -H 服务器IP地址 info
-H 是用来指定服务器主机,info子命令用于查看docker服务器的信息
3、Docker Image
Docker镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。我们可将Docker镜像看成只读模板,通过它可以创建Docker容器。
镜像有多种生成方法:
-
从无到有开始创建镜像
-
下载并使用别人创建好的现成的镜像
-
在现有镜像上创建新的镜像
我们可以将镜像的内容和创建步骤描述在一个文本文件中,这个文本文件称作Dockerfile,通过执行docker build命令可以构建出docker镜像。
4、Docker Registry
Docker Registry是存储Docker Image的仓库,它在Docker生态环境中的位置如下图所示:
运行Docker Push、Docker pull、Docker search时,实际上是通过 Docker Daemon与 Docker registry通信。
5、Docker Container
Docker容器就是Docker镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。Docker Container提供了系统硬件环境,我们可以使用Docker Image这些制作好的系统盘,再加上我们编写好的项目代码,run一下就可以提供服务了。
五、Docker组件如何协作运行容器
容器启动过程如下:
-
Docker客户端执行docker run命令
-
Docker Daemon发现本地没有hello-world镜像
-
Daemon从Docker Hub下载镜像
-
下载完成,镜像hello-world被保存到本地
-
Docker Daemon启动容器
具体过程可以看如下这幅演示图:
我们可以通过Docker Image可以查看到hello-world已经下载到本地
六、Docker常用命令
我们可以通过docker -h去查看命令的详细的帮助文档。在这里我只会讲一些平常日常比赛或者生活中我们可能会用的比较多的一些命令。
例如,我们需要拉取一个docker镜像,我们可以用如下命令:
docker pull image_name
image_name为镜像的名称,而如果我们想从Docker Hub上去下载某个镜像,我们可以使用以下命令:
docker pull centos:latest
centos:lastest是镜像的名称,Docker daemon发现本地没有我们需要的镜像,会自动去Docker Hub上去下载镜像,下载完成后,该镜像被默认保存到/var/lib/docker目录下。
接着我们如果想查看下主机下存在多少镜像,我们可以用如下命令:
docker images
我们要想知道当前有哪些容器在运行,我们可以用如下命令:
docker ps -a
-a是查看当前所有的容器,包括未运行的
我们该如何去对一个容器进行启动,重启和停止呢?我们可以用如下命令:
docker start container_name/container_id
docker restart container_name/container_id
docker stop container_name/container_id
这个时候我们如果想进入到这个容器中,我们可以使用attach命令:
docker attach container_name/container_id
那如果我们想运行这个容器中的镜像的话,并且调用镜像里面的bash,我们可以使用如下命令:
docker run -t -i container_name/container_id /bin/bash
那如果这个时候,我们想删除指定镜像的话,由于image被某个container引用(拿来运行),如果不将这个引用的container销毁(删除),那image肯定是不能被删除。我们首先得先去停止这个容器:
然后我们用如下命令去删除这个容器:
docker ps
docker stop container_name/container_id
然后这个时候我们再去删除这个镜像:
docker rmi image_name
此时,常用的Docker相关的命令就讲到这里为止了,我们在后续的文章中还会反复地提到这些命令。
七、Dockerfile
Dockerfile是自动构建docker镜像的配置文件,用户可以使用Dockerfile快速创建自定义的镜像,Dockerfile中的命令非常类似于Linux下的shell命令。
我们可以通过下面这幅图来直观地感受下 Docker 镜像、容器和 Dockerfile 三者之间的关系。
我们从上图中可以看到,Dockerfile可以自定义镜像,通过Docker命令去运行镜像,从而达到启动容器的目的。
Dockerfile 是由一行行命令语句组成,并且支持已#开头的注释行。
一般来说,我们可以将Dockerfile分为四个部分:
-
基础镜像(父镜像)信息指令FROM
-
维护者信息指令MAINTAINER
-
镜像操作指令RUN、EVN、ADD和WORKER等
-
容器启动指令CMD、ENTRYPOINT和USER 等
下面是一段简单的Dockerfile的例子:
1、从Docker Hub上pull下python 2.7的基础镜像
2、显示维护者的信息
3、copy 当前目录到容器中的/app目录下 复制本地主机的(Dockerfile所在目录的相对路径)到容器里
4、指定工作路径为/app
5、安装依赖包
6、暴露5000端口
7、启动app
这个例子是启动一个Python flask app的Dockerfile(flask是Python的一个轻量级的web框架),相信大家从这个例子中能够稍微理解了Dockerfile的组成以及指令的编写过程。
八、构建Dockerfile代码实例
mkdir static_web
cd static_web
touch Dockerfile
然后 vi Dockerfile 开始编辑该文件
输入 i 开始编辑
以下是我们构建的Dockerfile内容
FROM nginx
MAINTAINER Angel_Kitty angelkitty6698@gmail.com
RUN echo ‘
Hello, Docker!
’ > /usr/share/nginx/html/index.html编辑完后 按 esc 退出编辑
然后 :wq 写入 退出
我们在Dockerfile文件所在目录执行:
docker build -t angelkitty/nginx_web:v1 .
我们解释一下,-t是为新镜像设置仓库和名称,其中angelkitty为仓库名,nginx_web为镜像名,:v1为标签(不添加为默认latest)
我们构建完成之后,使用docker images命令查看所有镜像,如果存在REPOSTORY为nginx和TAG是v1的信息,就表示构建成功。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://i-blog.csdnimg.cn/blog_migrate/5cfed236f04cc1e6635d3d9dfe39377c.jpeg)
Kafka实战笔记
关于这份笔记,为了不影响大家的阅读体验,我只能在文章中展示部分的章节内容和核心截图
- Kafka入门
- 为什么选择Kafka
- Karka的安装、管理和配置
- Kafka的集群
- 第一个Kafka程序
afka的生产者
- Kafka的消费者
- 深入理解Kafka
- 可靠的数据传递
- Spring和Kalka的整合
- Sprinboot和Kafka的整合
- Kafka实战之削峰填谷
- 数据管道和流式处理(了解即可)
- Kafka实战之削峰填谷
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
转存中…(img-iU3yFpA3-1713391724875)]
- Kafka的消费者
- 深入理解Kafka
- 可靠的数据传递
[外链图片转存中…(img-EQ0pllRp-1713391724875)]
[外链图片转存中…(img-YAGmDpuC-1713391724875)]
- Spring和Kalka的整合
- Sprinboot和Kafka的整合
- Kafka实战之削峰填谷
- 数据管道和流式处理(了解即可)
[外链图片转存中…(img-j7kaeflX-1713391724875)]
- Kafka实战之削峰填谷
[外链图片转存中…(img-MBTKvxNL-1713391724876)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!