前篇文中讲到了如何构建一个镜像,构建好的镜像该如何使用呢?从的hello-world我们了解到 run指令可以将镜像运行起来,这里已经构建好,可以使用如下指令运行。
run -d -p 8080:8080 -test-:001
其中,“-d”表示在后台运行,“-p”表示将容器端口映射到主机端口,格式是主机(宿主)端口:容器端口,即将容器中的8080端口映射到主机的8080端口,当我们访问:8080时,等于访问了容器的8080端口。最后,-test-:001表示运行的镜像名称,即tag。 run的指令格式如下。
run [] IMAGE[][ARG…]
下面列举一些常用的指令。
(1)–name=”test-“:为容器指定一个名称。
(2)–dns 8.8.8.8:指定容器使用的DNS服务器,默认和宿主一致。
(3)–dns- :指定容器DNS搜索域名,默认和宿主一致。
(4)-e ..=”dev”:设置环境变量。
(5)–env-file=[]:从指定文件读入环境变量。
(6)–=”0-2″ or –=”0,1,2″:绑定容器到指定CPU运行。
(7)-m:设置容器使用内存最大值。
(8)–net=””:指定容器的网络连接类型,支持、host、none、 4种类型。
(9)–link=[]:添加链接到另一个容器。
(10)–=[]:开放一个端口或一组端口。
通常可以在 Hub上查询到很多官方的镜像,并且附有详细的 run的说明,当然这个Web App比较简单,下面尝试一个稍微复杂的镜像:sebp/elk, 这是ELK( 、 和)工具的镜像,这个镜像中会运行3个服务,公开3个端口,其中9200为的端口,5044为的端口,5601为的端口,通过下面的指令来运行ELK的镜像。
run -d -it -p 5601:5601 -p 9200:9200 -p 5044:5044 sebp/elk
可以看出,这里并没有先下载,即没有先执行 /elk的指令下载镜像,而是直接执行 run,这时引擎会先在本地查找该镜像,如果没有就会去默认的公网镜像仓库下载,所以第一次运行时需要等待一定的下载时间。
执行完成后,我们运行 ps就可以看到容器的运行情况,结果如下。
我们也可以使用 logs的指令查看容器的运行日志,内容如下。
logs
其中,就是ELK的容器ID,通过容器ID可以完成很多对容器的操作,如 stop可以停止正在运行的容器,指令如下。
stop
已经停止的容器并不会被删除,但是不会出现在 ps的结果中,我们可以通过如下指令来查询全部的容器,包括已经停止的容器。
ps -a
然后可以将查询到的容器重新启动,指令如下。
start
或者将已经启动的容器重启,指令如下。
当然,有时在一些复杂的镜像下需要编写很多启动参数,这些启动方式能不能文件化?不然每次启动都需要编写一长串难以理解的参数或指令,还提供了-的方式,可以通过yaml文件将容器的启动方式配置化。例如,启动ELK需要公开3个端口映射,编写一个-.yml的文件,内容如下。
然后直接运行如下指令。
– up elk
就相当于执行了 run,并且指定了镜像和公开的端口,而且如果想在后台运行,同样可以使用-d参数,指令如下。
– up -d elk
访问的首页(:5601)即可验证ELK是否成功启动。关于 的更多详细用法不再介绍,了解它可以帮助我们配置容器的启动方式,具体的用法可以在的官网上找到。
了解的网络
至此,的一些常规用法基本上已经介绍完毕,不过要想熟练地使用,解决日常工作中的一些问题,清楚的网络方式很有必要。
容器之所以强大,很大程度上是因为我们可以很方便地将它们连接在一起,甚至无论主机是运行在Linux上,还是运行在上,或者两者都有,都可以使用的方式管理它们,这些功能大部分都要依赖的网络。的网络系统可插拔,使用
驱动的方式,默认情况下存在多个驱动,驱动用来提供核心的网络功能,所以我们也可以安装和使用第三方网络插件,这些插件都可以从 Hub或第三方插件供应商处获得。通常默认提供的几个网络驱动足以满足我们的日常使用,具体如下。
(1):桥接网络,默认的网络驱动程序,即如果未指定驱动程序,那么默认在容器运行时会创建桥接网络,通常应用程序需要独立在容器中运行和通信时使用。
(2)host:主机网络,即完全共享主机网络,host仅适用于 17.06及更高版本上的群集服务。
(3):覆盖网络,将多个的守护进程连接在一起,并使群集服务能够相互通信,通常还可以使用覆盖网络来促进群集服务和独立容器之间的通信,或者在不同的守护进程上的两个独立容器之间进行通信,使用此网络类型无须在这些容器之间执行OS级别的路由。
(4):网络,允许为容器分配MAC地址,使其显示为网络上的物理设备,守护进程通过其MAC地址将流量路由到容器,通常在需要直接连接到物理网络上的传统应用程序时,会使用网络。
(5)none:禁用网络,对于此容器禁用所有网络,通常与自定义网络驱动程序一起使用。none不适用于群组服务。
通过如下指令可以清楚地看到已经创建的网络。
我们知道默认的在运行时会创建容器,而容器会默认创建网络,那么如果想要切换到host网络怎么办?很简单,在运行时添加“–”指令即可,内容如下。
run — host -p 8080:8080 –test-:002
除了修改网络类型,还可以设置来提供隔离网络的规则,启动支持IPv6、网络加密、使用代理服务等功能,由于在项目中并不多见,这里就不详细说明。
日志监控的利器ELK
其实,ELK不应该算作容器的技术,由于这里介绍容器日志的一般处理方式,因此将ELK放在容器来讲。
无论是微服务架构还是使用容器,都会遇到一个难题,那就是如何处理这些海量的分布在不同主机或容器内的日志,当一个错误发生时,或者要跟踪一个问题时,最先做的就是去看服务的日志。但在分布式的架构中,往往一个服务会存在多个实例,在微服务下会有成百上千个正在运行的容器,这时如果还是人工登录服务器或使用 logs去观察日志肯定不现实,那么有没有一种工具可以帮助我们将这些杂乱无章,且分散在各处的日志都收集起来,以方便快速检索呢?
ELK(、和)就是这样一种工具,是由公司所开发的专门用于处理海量日志收集、分析和检索的工具,、和都是系列的工具。
其中,最早成名的是,它是一个基于库的搜索引擎,用Java开发并开源发布,是一个分布式的提供友好 API的全文搜索系统。最开始的起源是一个业余项目,做菜谱App用来管理和检索菜谱,首个迭代的版本称为,第二个迭代版 本 就 是 ( 基 于 开 发 ),然 后作为开源产品发布给公众,公众反响十分强烈,自然而然地就喜欢上了这一软件,由于使用量急速攀升,此软件开始有了自己的社区,并引起人们的高度关注,最后成为一家搜索公司。
当然,我们的日志管理只能搜索还不行,还需要将日志收集起来,就是一款开源的输入功能强大的服务端数据处理管道,能够同时从多个来源采集数据、转换数据,然后将数据发送到我们喜欢的存储库中。当然,在ELK中我们的存储库自然是,通过将日志快速地收集、转换和发送到中。
最后,日志已经收集和存储,查询的API也有,那么我们还需要将日志信息展示出来,就是一款数据可视化的工具,通过,不但能快速地定义各种查询条件来检索基础日志,而且可以自由地选择如何呈现自己的数据,内置一批经典功能的图形工具:柱状图、线状图、饼图和旭日图等。不仅如此,我们还可以使用Vega语法来设计独属于自己的可视化图形,构建地图、时序图、关系图等。
当然,这一切都要依赖 的 检 索 功 能 , 而自然也要依赖于送来的数据,所以在中,我们的日志处理方式如图8.5所示。
在前文中介绍了如何通过容器的方式运行ELK,该如何将容器的日志发送给?主要有两种方式:一种是通过容器的日志驱动将容器的日志发送给管道;另一种是使用Beats系列工具——,将容器的日志主动地收集并发送给。
使用容器的日志驱动的好处是不需要再引入额外的工具,会将日志发送给,需要配置中日志的输入方式,这里使用的是ELK的组合镜像sebp/elk,所以很多配置都是默认的,包括之前在启动sebp/elk时所公开的5044端口其实就是用来监听传送的文件所使用的输入管道端口。
这里介绍一下使用的日志驱动发送日志的方法。首先,我们需要在的配置文件中添加新的input项来支持的日志驱动发送的日志,配置如下。
其次,需要重启来使配置生效,只需在想要被收集日志的容器运行时加入指定的log驱动的参数即可,以-test-为例,指令如下。
run -d –log- gelf –log-opt gelf-=udp://:12201-p 8080:8080 -test-:001
这样我们就可以在中查询到想要看到的日志,地址是:5601,但是需要注意,一旦使用“–log-”的方式将日志发送给,就无法使用 logs指令手动地在命令行观察日志了。
除了容器主动将日志发送给,我们还可以使用来收集和转发日志给ELK,也是公司旗下的Beats系列产品,主要负责发送日志数据给或,如图8.6所示。
下面演示一下直接让将日志发给的例子,同样,我们可以使用的方式来快速启动一个的实例,指令如下。
在上述指令中,指定 本地的配置文件的路径
///..yml,然后指定容器的相关配置,这样会自动收集当前服务器上所有容器的日志,可以使用curl指令来快速获取一个简单的配置文件,具体如下。
curl -L -O
然后修改..yml的配置,内容如下。
如上述配置,我们将日志输出给,这里ELK的主机地址是192.168.1.100,大家根据自己的网络情况进行配置,更多详细的配置可以在官网上找到,或者不使用的方式运行,通过官网下载安装包的方式可以获得更详细的配置文件。启动成功后,打开的首页,可以看到创建索引页面,如图8.7所示。
这就表示已经有数据,我们可以创建的索引来查看这些日志,这里创建名为“-*”的索引,然后在中搜索想要看到的日志,可以通过时间、容器名称或ID等丰富的过滤条件来搜索我们的日志,如图8.8所示。
除了直接将日志发送给,还可以通过来集中提取、处理和转换我们的数据,使用方式也很简单,只需修改之前的配置文件的方式即可,修改..yml的文件内容如下。
然后重新运行新的容器即可,这里需要注意,我们使用的sebp/elk默认的配置开启ssl安全认证,需要复制和配置正确的证书文件才可以将数据发送给ELK的5044端口,我们通过exec指令进入容器,可以在路径“/etc//conf.d”中找到beats对应的配置文件02-beats-input.conf,内容如下。
为了演示方便,我们可以通过修改这个配置文件的配置关闭ssl,首先在本地环境中编写新的配置文件,内容如下。
然后使用如下指令启动sebp/elk即可。
上述指令中“
///02-beats-input.conf”就是本地的配置文件,ELK启动成功后,进入的首页,创建索引后应用容器的日志同样也可以查询到,这就是使用将容器日志收集发送给的用法。
本文给大家讲解的内容是运行容器;下篇文章给大家讲解的是容器编排;觉得文章不错的朋友可以转发此文关注小编;感谢大家的支持!
———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,永久会员只需109元,全站资源免费下载 点击查看详情
站 长 微 信: nanadh666