上篇文章给大家讲解了一下关于docker中的常用命令,有很多小伙伴就知道了命令的背后肯定需要练习的,所以他今天来了。博主发现下完实战操作过后觉得有点少,所有又给大家讲解了关于镜像原理的方面的内容。
「看完掌握以下内容:」
- 完成Docker安装Nginx
- 完成Docker安装Tomcat
- 完成Docker安装Elasticsearch
- 深度了解Docker镜像背后的原理
一、使用Docker 安装Nginx
「操作步骤」
- 首先搜索镜像 可以通过命令或者通过官网进行搜索
- 通过pull方式进行下载
- 通过后台的方式进行运行
# 查询镜像
[root@192 ~]# docker search nginx
#拉去镜像
[root@192 ~]# docker pull nginx
#后台启动镜像
[root@192 ~]# docker run -d --name nginx01 -p 2020:80 nginx
2277fe2b798a4fe8e4a1e66b5335884b72c89882cb300a5fbc23906513827930
# 查看运行镜像
[root@192 ~]# docker ps -q
2277fe2b798a
88c647580c32
#检查直接访问容器中的内容是无法进行访问的
[root@192 ~]# curl localhost:80
curl: (7) Failed connect to localhost:80; 拒绝连接
#访问映射端口
[root@192 ~]# curl localhost:2020
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
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>
「架构图」
❝通过外网进行访问 ❞
二、使用Docker 安装Tomcat
代码语言:javascript复制[root@192 ~]# docker pull tomcat
[root@192 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest e0bd8b34b4ea 2 days ago 649MB
nginx latest daee903b4e43 3 days ago 133MB
centos latest 0d120b6ccaa8 3 months ago 215MB
[root@192 ~]# docker run --name tomcat01 -d -p 2021:8080 tomcat
169f704279328e02d2bc4a4c74888104936091d638186f754b0c1d587585477a
#测试访问没有问题 但是找不到页面
#发现问题 :
#1、inux 少了命令
#2、没有weapp
#原因:
#阿里云镜像的原因 默认是最小的镜像,所以不必要的都剔除掉
#保证最小可运行
#进入容器 拷贝内容
[root@192 ~]# docker exec -it tomcat01 /bin/bash
root@169f70427932:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@169f70427932:/usr/local/tomcat# ls webapps
root@169f70427932:/usr/local/tomcat# cp -r webapps.dist/* webapps/
三、使用Docker 安装Elasticsearch
代码语言:javascript复制es 暴露的端口很多
es 十分的耗内存
es 的数据一般需要放置到安全目录!挂载
-net somenetwork 网络配置
#下载启动
[root@192 ~]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
#测试一下es是否成功
[root@192 ~]# curl localhost:9200
{
"name" : "5531182d4a70",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "EKMhfxqoQbSt7vZnPuHdyA",
"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"
}
#限制es的内存的限制
代码语言:javascript复制在没有加内次限制的时候默认是占用1点几个G的运行内存
查看 docker stats
[root@192 ~]# docker stats 5531182d4a70
加内存限制(可选项)对于内存大的虚拟了可以忽略
代码语言:javascript复制#将docker 停掉
[root@192 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5531182d4a70 elasticsearch:7.6.2 "/usr/local/bin/dock…" 12 hours ago Up 12 hours 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elasticsearch
[root@192 ~]docker run -d --name elasticsearch2 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
c241517849418ec0648f82e18ae46c47c2e7908987e5eacc560211cffd62430f
#使用docker stats 查看运行转态
四、Docker境像讲解
4.1 镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的容,包括代码、运行时、库、环境变量和配置文件所有的应用,直接打包 docker
「镜像,就可以直接跑起来」
- 如何得到镜像
- 从远程合库下载
- 朋友拷贝给你
- 自己制作一个镜像 Docker File
4.2 Docker镜像加载原理 (面试可能会被问到)
❝Unions(联合文件系统) ❞
Unionfs(联合文件系统):Union文件系统( Unionfs)是一种分层、轻量級并且高性能的文件系统,它支持对文件系统的修改 作为一次提交料层层的加,同时可以将不同目录挂载到同一个拟文件系统下( (unite several directories into a single virtual filesystem). Union文件系统是 Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各 种具体的应用镜像 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统加起来,这样最终的 文件系统会包含所有底层的文件和目录
❝docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统 :Unionfs ❞
boots(boot file system)主要包含 bootload「和 kernel, bootloader主要是引导加载 kernel, Linux刚启动时会加载 boots文件系统,在 Dockers镜像的最底层是 boots。这一层与我们典型的 Linux/Uniⅸx系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由 boots?转交给内核,此时系统也会卸载 boots。
rootfs( (root file system),在 boots。之上。包含的就是典型 Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rots就是 各种不同的操作系统发行版,比如 Ubuntu, Centos等等。
❝平时我们安装进虚拟机的 Centos都是好几个G,为什么 Docker这里才200M? ❞
在这里插入图片描述
对于个精简的OS, rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Hos的 Skernel,自己只需要提供 roots就可以了。由此可见对于不同的 llinux发行版, boots基本是一致的, rootfs会有差別,因此不同的发行版可以公用boots
4.3 分层理解
❝分层镜像 ❞
我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层一层的在下载
「思考:」 为什么 Dockers镜像要采用这种分层的结构呢?
❝最大的好处,我觉得莫过于是资源共享了!比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享 ❞
査看镜像分层的方式可以通过 docker image inspect命令
代码语言:javascript复制"RootFS": {
"Type": "layers",
"Layers": [
"sha256:f5600c6330da7bb112776ba067a32a9c20842d6ecc8ee3289f1a713b644092f8",
"sha256:c492b4fe510f674e04af29c5a8be4d0104a53e82e68ae98a3f9a0dd385263b7c",
"sha256:60f4b166131fd0c3b925a04e4976fbc43525e289e5edab72ffc4b7196085905f",
"sha256:4bc5e04ae88961aa002128a1873888ad4adf5ce11712d601fec6ad5f280c547d",
"sha256:06d5c35d63a8e4066ca996005b118a6051d2323c4af64c0fc2be014b4da7740e",
"sha256:d3fc9f08141a1377e718b8a29fd94a8c46793b88efdbed4ad02cbe3a3d91de10"
]
}
「理 解」所有的 Docker镜像都起始于个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层. 举一个「简单的例子」,假如基于 Ubuntu Linux16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加 Python包就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层 该镜像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像包含两个镜像层的6个文件
上图中的镜像层眼之前图中的略有区別,主要目的是便于展示文件。下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中 Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。Linux上可用的存储引擎有AUFS、 Overlay2、 Device Mapper、Btfs以及ZFS。顾名思义,每种存储引擎都基于 Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点 Docker在 Windows上仅支持 windows filter-种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW 下图展示了与系统显示相同的三层镜像。所有镜像层堆并合并,对外提供统一的视图。
❝特点 ❞
Dockers镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部 这一层就是我们通常说的容器层,容器之下的都叫镜像层
四、 总结
上述给大家实操了一下简单的docker练习,还家了一部分的镜像原理等,看起来好多,经过我的经验分享,如果后续面试的时候极大地可能会被问到镜像的原理,所以小伙伴的还不快行动起来? 后面会给大家分享一些高级一点的内容,如 「commit 镜像」、「容器数据卷」、「Docker File」、「Docker 网络」等。我们下期在见。
五、 粉丝福利
以下内容是博主花费了1个星期的时间总结各大厂商的面试题与拜访大佬总结的内容那个 关注公证号【大数据老哥】回复:Docker基础面试题即可获取。