大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说docker通俗易懂_docker的工作原理的理解,希望您对编程的造诣更进一步.
「这是我参与2022首次更文挑战的第一天,活动详情查看:2022首次更文挑战」。
关于Docker
Docker的是什么
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker的功能
虚拟机技术:
由于虚拟机技术有着以下缺点:
- 因为模拟一台电脑,导致资源占用十分的多
- 冗余的步骤比较多
- 启动很慢!!!
- 而且环境是共用的,一个出问题可能会导致全部崩盘
容器化技术
比较docker与虚拟机技术的不同:
- 传统虚拟机,虚拟出一条硬件,与运行一整个完整的操作系统,然后在这个系统上安装和与逆行软件
- 容器内的应该用直接运行宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
- 每个容器之间是互相相隔的,眉哥哥容器内都有一个属于自己的文件系统,互不影响。
DevOps(开发,运维)
应该用更快速的交付和部署
传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运行
更便捷的升级与扩缩容
使用了Docker之后,我们部署应用就像搭积木一样!
可以将项目打包为一个镜像,扩展。
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的。
更高效的计算机资源的利用
Docker是内核级别的虚拟化,可以在一个物理机上运行很多容器实力!服务器的性能可以被压榨到极致。
Dockers的基本组成
镜像(image) :
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomocat镜像===> run ===>tomacat01容器(提供给服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)
**容器(container) : **
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。启动,停止,删除,基本命令。
仓库(repository) :
仓库就是存放镜像的地方
仓库分为公有仓库和私有仓库
安装Docker
1.卸载旧版本的Docker
sudo apt-get remove docker docker-engine docker.io containerd runc
2.更新包索引
sudo apt-get update
3.升级支持https类型库
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
4.添加官方的GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
5.配置使用stable版本
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
6..安装最新版本的Docker
sudo apt-get install docker-ce docker-ce-cli containerd.io
4.检测是否安装成功
sudo docker run hello-world
成功后会有这样一堆代码
helloWorld运行原理
底层原理
Docker是怎么工作的
Docker是一个Client-Server结构的系统,Docker的守护进程与逆行在主机上,通过Socker从客户端访问!DockerSever接受到Docker-Client的指令,就会执行这个命令!
Docker为什么比VM快
1.Docker有着比虚拟机更少的抽象层
2.docker利用的是宿主机的内核,vm需要的是Guest OS
所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导,虚拟机是加载Guest OS,虚拟机是分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,所以启动是秒级的。
Docker常用的命令
帮助命令
docker version #显示docker版本信息
docker info #显示docker的系统信息
docker 命令 --help #万能命令(帮助)
镜像命令
docker images #查看所有本地主机的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 3 months ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选项
-a #列出所有镜像
-q #只显示镜像的id
docker search 镜像名:版本号 #搜索镜像
docker pull #下载镜像
docker rmi -f 容器id #删除指定容器
docker rmi -f $(docker images -aq) #删除全部容器
容器命令
有镜像才可以创建容器,linux,下载一个ubuntu镜像
docker pull ubuntu
新建容器并启动
docker run [可选参数] image
#参数说明
--name="name" 容器名字,用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器端口 -p 8080:8080
-P 随机指定端口
#测试
docker run -it ubuntu /bin/bash #启动并进入容器
成功之后用户名会变成镜像id
exit #从容器退回主机
列出所有正在运行的容器
docker ps
#可选择
-a #列出当前正在运行的容器+带出历史运行过的容器
-n=? #显示最近创建的容器
-q #只显示容器的编号
退出容器
exit #容器通知退出
ctrl + p + q #容器不停止推出
删除容器
docker rm 容器id #删除指定容器【不能删除正在运行的容器】
docker rm -f $(docker ps -aq) #删除所有容器
docker ps -a -q|xargs docker rm #删除所有容器
启动和停止容器
docker start 容器id #启动容器
docker retart 容器id #重启容器
docker stop 容器id #停止容器
docker kill 容器id #强制停止当前容器
常用的其他命令
后台启动容器
#docker run -d 镜像名
#问题docker ps 发现Ubuntu停止了
#常见的坑,docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
查看日志
docker logs -ft --tail 数字 容器id #查看容器最近几条日志
查看容器进程信息
docker top 容器id
查看镜像元数据
docker inspect 容器id
进入当前正在运行的容器
docker exec -it 容器id /bin/bash #进入容器后开启一个新终端
docker attach 容器id #进入容器正在执行的终端,不会启动新进程
从容器内拷贝文件到主机上
docker cp 容器id: 容器路径 目的主机的路径
部署nginx
首先下载nginx
docker pull nginx
然后查看是否有该镜像
docker images
启动nginx
docker run -d --name nginx01 -p 3344:80 nginx
-d # 后台运行
--name # 给容器命名
-p # 宿主机端口:容器内部端口
端口暴露
我在外网访问3344端口,但访问的是docker里nginx的80端口
Docker镜像讲解
镜像是什么
镜像是一种轻量级,可执行的独立的软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!!!
如何得到镜像:
- 从远程镜像仓库下载
- 朋友拷贝给你
- 自己制造一个
Docker镜像加载原理
UnionFS(联合文件系统)
我们下载的时候看到的一层层就是这个!
联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。
联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看卡里,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker镜像加载原理
Docker 的镜像是有一层一层的文件系统组成的,这个层级的文件系统就叫做联合文件系统,一般底下的层都是共用的
一般系统启动,是一个加载的过程,这个过程是 bootloader 引导加载 kernel,linux 操作系统刚启动的时候还会加载 bootfs 文件系统,而咱们的 Docker 镜像最底层就是 bootfs
boot file system 是一个文件系统,主要是包含 bootloader 和 kernel当 boot 加载完毕之后,整个内核都在运行正在内存中的,此时内存的使用权已经由 bootfs 交接给内核,这个时候系统会将 bootfs 卸载掉
在来说一下 rootfs,root file system,根文件系统,它是在 bootfs 之上的,就是包含了,linux 操作系统中的 /dev ,/proc,/bin,/etc 等目录和文件例如我们知道的 rootfs 有 centos,ubuntu等等
Commit镜像
docker commit 提交容器称为一个新的镜像
#命令和git原理相似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像命,[TAG]
实践测试
#1.启动该一个默认的tomcat
#2.发现这个默认的tomcat是没有webapps应用的,镜像的原因,官方默认的镜像webapps下面是没有文件的
#3.我我自己拷贝进去了基本的文件
#4.将我们操作过的容器通过commit提交一个镜像!我们以后就使用我们修改过的镜像即可,这就是我们自己的一个修改镜像
如果你想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像,这就好比游戏存档。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13621.html