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 nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@zyl-server ~]#
2、查看镜像
[root@zyl-server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.234.10:5000/centos 1.2 d0a52e21dd65 20 hours ago 231MB
centos 1.2 d0a52e21dd65 20 hours ago 231MB
nginx latest 605c77e624dd 19 months ago 141MB
registry.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 nginx
926fd257ed887f86894e1fb3b99c2f5edda141e9fdd92c04de3255fd2b1b4973
[root@zyl-server ~]#
[root@zyl-server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
926fd257ed88 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/bash
root@926fd257ed88:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@926fd257ed88:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@926fd257ed88:/# cd /etc/nginx/
root@926fd257ed88:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
root@926fd257ed88:/etc/nginx#
root@926fd257ed88:/etc/nginx#
本地访问8011测试:
[root@zyl-server ~]# curl localhost:8011
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@zyl-server ~]#
❓ 思考:每次修改nginx配置文件,都需要进入容器内部十分麻烦,------》引入数据卷,通过路径映射,在容器外部即可修改。
1.2、部署tomcat
1、下载tomcat
### --rm 用完即删(一般用来测试)
docker run -it --rm tomcat:9.0
###(这里使用这个)
docker pull tomcat:9.0
2、运行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/bash
root@f8e5b8f57b2b:/usr/local/tomcat# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
root@f8e5b8f57b2b:/usr/local/tomcat# cd webapps
root@f8e5b8f57b2b:/usr/local/tomcat/webapps# ls
root@f8e5b8f57b2b:/usr/local/tomcat/webapps#
2、拷贝webapps.dist下的文件到webapps
root@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.2
Unable to find image 'elasticsearch:7.6.2' locally
7.6.2: Pulling from library/elasticsearch
ab5ef0e58194: Pull complete
c4d1ca5c8a25: Pull complete
941a3cc8e7b8: Pull complete
43ec483d9618: Pull complete
c486fd200684: Pull complete
1b960df074b2: Pull complete
1719d48d6823: Pull complete
Digest: sha256:1b09dbd93085a1e7bca34830e77d2981521a7210e11f11eda997add1c12711fa
Status: Downloaded newer image for elasticsearch:7.6.2
89b955d50f2fd130d2e19e4048d30a8c38c6beb1023552be2af0c49b6fbf5951
2、查看当前运行的镜像
[root@zyl-server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
89b955d50f2f 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 elasticsearch
f8e5b8f57b2b tomcat "catalina.sh run" 20 minutes ago Up 20 minutes 0.0.0.0:8012->8080/tcp, :::8012->8080/tcp mytomcat
926fd257ed88 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 89b955d50f2f
89b955d50f2f
[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.2
7、再次查看内存
[root@zyl-server ~]# docker stats
1.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/portainer
2、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/portainer
Unable to find image 'portainer/portainer:latest' locally
latest: Pulling from portainer/portainer
94cfa856b2b1: Pull complete
49d59ee0881a: Pull complete
a2300fd28637: Pull complete
Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f
Status: Downloaded newer image for portainer/portainer:latest
99974acec5857c8559b5230e5c76063a82346a0e986780582ea6a40a7f62628c
[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💖点点关注,收藏不迷路💖
|