行业知识
Docker基础入门:常规软件安装与镜像加载原理
Docker基础入门:常规软件安装与镜像加载原理
- 一、Docker常规软件安装
- 1.1、部署nginx
- 1.2、部署tomcat
- 1.3、部署elasticsearch
- 1.4、如何部署kibana-->连接elasticsearch
- 1.5、部署可视化工具
- 二、 镜像加载原理
- 2.1、镜像是什么
- 2.2、Docker镜像加速原理
- 2.3、分层���解
The Begin点点关注,收藏不迷路 一、Docker常规软件安装
1.1、部署nginx
1、拉取nginx镜像[root@zyl-server ~]# docker pull nginxUsing default tag: latestlatest: Pulling from library/nginxa2abf6c4d29d: Pull complete a9edb18cadd1: Pull complete 589b7251471a: Pull complete 186b1aaa4aa6: Pull complete b4df32aa5a72: Pull complete a0bcbecc962e: Pull complete Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31Status: Downloaded newer image for nginx:latestdocker.io/library/nginx:latest[root@zyl-server ~]# 2、查看镜像[root@zyl-server ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE192.168.234.10:5000/centos 1.2 d0a52e21dd65 20 hours ago 231MBcentos 1.2 d0a52e21dd65 20 hours ago 231MBnginx latest 605c77e624dd 19 months ago 141MBregistry.cn-hangzhou.aliyuncs.com/zhaohaibao/centos 7.9 5d0da3dc9764 23 months ago 231MB[root@zyl-server ~]# 3、运行nginx,8011为容器外部端口,80端口为容器内部nginx的端口[root@zyl-server ~]# docker run -d --name=mynginx -p 8011:80 nginx926fd257ed887f86894e1fb3b99c2f5edda141e9fdd92c04de3255fd2b1b4973[root@zyl-server ~]# [root@zyl-server ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES926fd257ed88 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:8011->80/tcp, :::8011->80/tcp mynginx[root@zyl-server ~]# 4、进入nginx容器[root@zyl-server ~]# docker exec -it mynginx /bin/bashroot@926fd257ed88:/# lsbin boot devdocker-entrypoint.d docker-entrypoint.sh etchome lib lib64 media mnt opt proc root run sbin srv sys tmp usr varroot@926fd257ed88:/# whereis nginxnginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginxroot@926fd257ed88:/# cd /etc/nginx/root@926fd257ed88:/etc/nginx# lsconf.dfastcgi_paramsmime.types modules nginx.conf scgi_params uwsgi_paramsroot@926fd257ed88:/etc/nginx# root@926fd257ed88:/etc/nginx#
本地访问8011测试:
[root@zyl-server ~]# curl localhost:8011Welcome to nginx!html { color-scheme: light dark; }body { width: 35em; margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif; }Welcome to nginx!
If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.
For online documentation and support please refer tonginx.org.
Commercial support is available atnginx.com.Thank you for using nginx.
[root@zyl-server ~]#❓ 思考:每次修改nginx配置文件,都需要进入容器内部十分麻烦,------》引入数据卷,通过路径映射,在容器外部即可修改。
1.2、部署tomcat
1、下载tomcat### --rm 用完即删(一般用来测试)docker run -it --rm tomcat:9.0###(这里使用这个)docker pull tomcat:9.02、运行tomcat参数说明:-p 小写 主机端口:容器端口-P 大写 随机分配端口i 交互t 终端d 后台docker run -d -p 8012:8080 --name=mytomcat tomcat
原因tomcat默认是最小的镜像,有的文件被删除了。保证最小运行环境。
解决:
1、进入容器[root@zyl-server ~]# docker exec -it mytomcat /bin/bashroot@f8e5b8f57b2b:/usr/local/tomcat# lsBUILDING.txt CONTRIBUTING.md LICENSENOTICEREADME.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist workroot@f8e5b8f57b2b:/usr/local/tomcat# cd webappsroot@f8e5b8f57b2b:/usr/local/tomcat/webapps# lsroot@f8e5b8f57b2b:/usr/local/tomcat/webapps# 2、拷贝webapps.dist下的文件到webappsroot@f8e5b8f57b2b:/usr/local/tomcat# cp -r webapps.dist/* webapps/root@f8e5b8f57b2b:/usr/local/tomcat#
测试访问:
❓ 思考:部署项目,每次进入容器内部,是不是很麻烦?------》引入数据卷,通过路径映射,在容器外部即可修改。
1.3、部署elasticsearch
❓ 思考:
es暴露端口多
es内存占用大
es的数据一般要放置到安全目录(挂载)
——————怎么解决?
1、下载、启动elasticsearch [root@zyl-server ~]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2Unable to find image 'elasticsearch:7.6.2' locally7.6.2: Pulling from library/elasticsearchab5ef0e58194: Pull complete c4d1ca5c8a25: Pull complete 941a3cc8e7b8: Pull complete 43ec483d9618: Pull complete c486fd200684: Pull complete 1b960df074b2: Pull complete 1719d48d6823: Pull complete Digest: sha256:1b09dbd93085a1e7bca34830e77d2981521a7210e11f11eda997add1c12711faStatus: Downloaded newer image for elasticsearch:7.6.289b955d50f2fd130d2e19e4048d30a8c38c6beb1023552be2af0c49b6fbf59512、查看当前运行的镜像[root@zyl-server ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES89b955d50f2f elasticsearch:7.6.2 "/usr/local/bin/dock…" 7 seconds ago Up 6 seconds 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp elasticsearchf8e5b8f57b2b tomcat "catalina.sh run" 20 minutes ago Up 20 minutes 0.0.0.0:8012->8080/tcp, :::8012->8080/tcp mytomcat926fd257ed88 nginx "/docker-entrypoint.…" 57 minutes ago Up 57 minutes 0.0.0.0:8011->80/tcp, :::8011->80/tcp mynginx[root@zyl-server ~]# 3、查看当前cpu使用情况(50%)docker status
4、测试访问elasticsearch[root@zyl-server ~]# curl localhost:9200{ "name" : "89b955d50f2f", "cluster_name" : "docker-cluster", "cluster_uuid" : "pJGBGgBpTOSEqmbG0uMUdg", "version" : { "number" : "7.6.2", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f", "build_date" : "2020-03-26T06:34:37.794943Z", "build_snapshot" : false, "lucene_version" : "8.4.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search"}[root@zyl-server ~]# 5、停止elasticsearch、增加内存限制(-e ES_JAVA_OPTS="-Xms64m -Xmx512m"),最低占用64m内存,最高占用512m内存。[root@zyl-server ~]# docker stop 89b955d50f2f89b955d50f2f[root@zyl-server ~]# 6、再次运行[root@zyl-server ~]# docker run -d --name myelasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.27、再次查看内存[root@zyl-server ~]# docker stats1.4、如何部署kibana–>连接elasticsearch
1.5、部署可视化工具
1、portainer(使用这个)docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer2、Rancher(CI/CD、持续部署、集成时再用这个)
什么是portainer ?
portainer 是 Docker的图形化界面管理工具!提供一个后台面板供我们操作!
1、启动运行[root@zyl-server ~]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainerUnable to find image 'portainer/portainer:latest' locallylatest: Pulling from portainer/portainer94cfa856b2b1: Pull complete 49d59ee0881a: Pull complete a2300fd28637: Pull complete Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3fStatus: Downloaded newer image for portainer/portainer:latest99974acec5857c8559b5230e5c76063a82346a0e986780582ea6a40a7f62628c[root@zyl-server ~]# 2、访问测试:http://192.168.234.10:8088
二、 镜像加载原理
2.1、镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!
如何得到镜像:
从远程仓库下载
朋友拷贝给你
自己制作一个镜像DockerFile
2.2、Docker镜像加速原理
UnionFS(联合文件系统)
我们下载的时候看到的一层层就是这个!
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker镜像加载原型
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system),在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。
rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M?
对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。
由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
(虚拟机是分钟级,容器是秒级!)
2.3、分层理解
分层的镜像
我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层一层的在下载!
思考:为什么Docker镜像要采用这种分层的结构呢?
最大的好处,我觉得莫过于是资源共享了!比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
查看镜像分层的方式可以通过 docker image inspect命令!
[root@zyl-server ~]# docker image inspect tomcat:9.0
所有的Docker 镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
、
该镜像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。
上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版本。
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
Linux上可用的存储引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顾名思义,每种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在Windows 上仅支持 windowsfilter一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW[1]。
下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。
特点:
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层!
The End点点关注,收藏不迷路
上一篇:零的英文怎么写单词?
下一篇:存储服务器怎么入账?