前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >快速入门Docker(3)——安装实战练习|Docker境像讲解(还不收藏?)

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

作者头像
大数据老哥
发布2021-02-04 15:07:22
3900
发布2021-02-04 15:07:22
举报
文章被收录于专栏:大数据解决方案

上篇文章给大家讲解了一下关于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基础面试题即可获取。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据老哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、使用Docker 安装Nginx
  • 二、使用Docker 安装Tomcat
  • 三、使用Docker 安装Elasticsearch
  • 四、Docker境像讲解
    • 4.1 镜像是什么
      • 4.2 Docker镜像加载原理 (面试可能会被问到)
        • 4.3 分层理解
        • 四、 总结
        • 五、 粉丝福利
        相关产品与服务
        容器镜像服务
        容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档