快速入门Docker(3)——安装实战练习|Docker境像讲解(还不收藏?)

2021-02-04 15:07:22 浏览数 (1)

上篇文章给大家讲解了一下关于docker中的常用命令,有很多小伙伴就知道了命令的背后肯定需要练习的,所以他今天来了。博主发现下完实战操作过后觉得有点少,所有又给大家讲解了关于镜像原理的方面的内容。

「看完掌握以下内容:」

  • 完成Docker安装Nginx
  • 完成Docker安装Tomcat
  • 完成Docker安装Elasticsearch
  • 深度了解Docker镜像背后的原理

一、使用Docker 安装Nginx

「操作步骤」

  1. 首先搜索镜像 可以通过命令或者通过官网进行搜索
  2. 通过pull方式进行下载
  3. 通过后台的方式进行运行
代码语言:javascript复制
# 查询镜像
[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基础面试题即可获取。

0 人点赞