docker容器与宿主机数据存储的关系
在 Docker 中,宿主机和容器之间可以通过数据卷(Volume)来实现数据共享。数据卷是一个目录或文件,可以将它挂载到容器中,使容器可以访问宿主机上的文件系统中的文件。数据卷可以用于持久化存储数据,以便在容器删除后仍然可以保留数据。
Docker 中的数据卷可以分为两种类型:
宿主机挂载的数据卷:这种数据卷可以将宿主机上的目录或文件挂载到容器中,容器可以读写宿主机上的文件系统中的文件。
匿名卷:这种数据卷由 Docker 自动生成,用于在容器中临时存储数据。容器删除后,这些数据卷也会被删除。
数据卷可以通过命令行参数或 Dockerfile 中的指令来定义和使用。例如,使用以下命令可以将宿主机上的 /var/data 目录挂载到容器的 /data 目录中:
docker run -v /var/data:/data <image>
在容器中,可以使用 /data 目录来读写宿主机上的 /var/data 目录中的文件。
数据卷的使用可以帮助将容器与宿主机分离,从而实现更好的安全性和可移植性。同时,它还可以帮助容器之间共享数据,以便实现更复杂的应用程序。
我们公司自己用docker+gogs 搭建了一套代码仓库,连接的mysql 也是用docker构建的。
很长一段时间都没有问题,突然有一天不知道什么原因gogs仓库访问不了啦。把mysql容器重启了一下,gogs一直报errror:dial tcp xxx.xxx.xxx.xxx(宿主机的ip):3306: connection time out 。当时弄了一下午也没解决,估计当时也没有认真找问题。
今天领导突然问起现在代码放在那里,我说码云上,领导说公司以后 准备要融资,这里好好弄一下最好放到咱们自己的仓库上,我说咱们的仓库现在打不开啦。领导说加紧处理一下,没有办法又回过头看了看问题,就想既然连mysql(宿主机ip)连不上,不如直接把连mysql的ip换成mysql容器的ip,试了试果然可以啦。
本篇讲解Docker 日志驱动切换到Linux Syslog。
首先来看下Docker 日志架构。
Docker容器(Docker Container)中的应用程序(Application)将日志写入到标准输出设备(STDOUT),Docker守护进程(Docker Daemon)负责从STDOUT中获取日志,并将日志写入对应的日志驱动中,如图1所示。
默认地, Docker 日志驱动是写到json-file 里面的,我们通过docker info | grep "Logging Driver" ,即可观察到默认的日志设置,如图2所示。
在这里,我们将介绍将Docker 的日志切换到Docker 的Linux宿主机的日志中。
日志是系统中发生的事情的重要信息来源。Linux 的默认日志是syslog,Syslog是消息日志记录的标准。长期以来,它一直是Linux/Unix系统上的标准日志记录机制。
Syslog包含三个部分:
-Syslog守护程序:它是一个监听日志并将其写入特定位置的守护程序。位置在守护程序的配置文件中定义。rsyslog是大多数发行版附带的Syslog守护程序。
-Syslog消息格式:指Syslog消息的语法。
-Syslog协议:指用于远程日志记录的协议。现代Syslog守护程序可以使用TCP和TLS,以及UDP,UDP是远程日志记录的传统协议。
通常,日志写入/var/log目录下,通过命令 sudo ls /var/log, 即可看到当前系统下的多个log文件,如图3所示。
Linux操作系统已安装了Syslog软件包,但它叫Rsyslog。实际上,Rsyslog是Syslog标准的一种实现。除了Rsyslog这一种实现,还有一种叫Syslogng的第三方实现。
虽然Syslogng的功能较为强大,但我们还是选择使用Rsyslog,因为操作系统已经预装了,我们无须再单独安装。当然,也可通过以下命令查看Rsyslog是否已安装
rsyslogd -v
Linux 系统基本已经默认安装了rsyslogd, 图4显示的是RockyLinux 8.5 的执行结果。
可以看到, 这里的rsyslogd已经安装, 并且已经配置了systemd服务。
下面,我们将修改rsyslogd的配置文件,开启514端口,这样我们就可以是用TCP 协议来查看系统的log 日志了, 这么做的目的,当然是为了日志能够和ELK集成。
执行:sudo vim /etc/rsyslog.conf
本机为RockyLinux 8.5, 也就是类似于Redhat 8.5, 修改配置为:
module(load=&34;) # needs to be done just once
input(type=&34; port=&34;)
然后,重启rsyslog服务: sudo systemctl restart rsyslog
之后,查看本机端口,确认514端口已经打开:
stat -anpt | grep 514
当我们打开了syslog的远程端口514之后,我们就可以在启动Docker 的时候,指定Docker 的日志驱动为syslog,同时指定远程端口:
执行命令:
docker run -d -p 81:80 --log-driver syslog --log-opt syslog-address=tcp://localhost:514 --name nginx nginx
本命令中,首先需要使用logdriver指定Syslog为日志驱动,此外使用log-opt指定地址tcp://localhost:514,表示Docker容器可通过TCP协议连接本地的514端口,从而将日志写入Rsyslog中。如图6所示,我们得到一个id为70d761开头的Docker 容器。
Nginx容器启动成功后,在浏览器上发出请求,此时会发现,在/var/lib/docker/containers/<container_id>目录中不再生成<container_id>json.log文件了。如图7所示。
那么日志输出到哪里去了呢?当然是在Linux的系统日志文件中了。此时可使用以下命令来查看Linux系统日志文件,该文件中的内容就是Syslog所生成的日志。
执行: tail -f /var/log/messages
结果如图8所示,在日志信息中,可以看到一个12位的字符串70d761efae8d,它就是Docker的容器ID。
以上,我们实现了 Docker 日志的syslog 输出。
Docker 日志Docker syslog#@Docker 自定义日志输出
1.容器技术使应用软件具有可移植的能力,其是通过把应用和应用依赖的内容打包成镜像来实现的。只要部署环境中安装了docker,那么该镜像可以在任何的部署环境(物理机、虚拟机、云服务)上无差别的进行一键部署。
2.Docker容器的本质是一个特殊的进程,基于NameSpace技术实现了进程的视图的隔离,基于Cgroup技术实现了资源使用的限制,从而实现了容器之间的资源隔离与限制
3.Docker镜像里面其实并不包含linux内核文件,而仅仅包含用户空间的文件系统rootfs,以及开发者自己的应用以及其依赖的文件
4.Docker的镜像是分层结构,镜像层是只读并且共享的,容器层是运行时容器隔离并且可写的。
5.Docker容器中的文件和宿主机上的卷各自拥有独立的生命周期,前者随容器删除而消失,后者则会持久化到宿主机上。
6.Docker网络解决了同一个宿主机上的多个容器之间如何通信、容器与外部如何通信、跨主机容器如何通信的问题
容器与外界交互方式概况?
1、容器访问外部世界
只要宿主机可以访问外网,默认容器是可以访问外网的;
2、外部世界访问容器
A、通过端口映射来;
B、参考例子:
将容器里的端口8080映射到宿主机端口8081
docker run -itd -p 0.0.0.0:8081:8080 --name tomcat01 /bin/bash
Docker没前途了。出公告了,要遵守美国条令,不遵守就禁用。虽然还有podman ,但是坑太多。scratch好是好,就是后期线上出了问题不太好debug,Alpine可能是一个折中。能不能搞个像squashfs那样的数据压缩,如果不打算经常重启容器的话。先docker run编译,挂载宿主机目录,再把编译好的文件docker build进新的小镜像。你这么做确实精巧,但有个问题,如果用go,如何避免每次下载新的外部gomod依赖。
容器内执行宿主机命令天行1st
Docker容器内执行宿主机指令
进一步理解Docker容器日志
平时,我们使用docker logs命令可以随时查看Docker容器内部应用程序运行时所产生的日志,这样可以避免首先进入Docker容器,再打开应用程序的日志文件的过程。
可见,docker logs是一种相当便捷的工具。 docker logs会监控容器中操作系统的标准输出设备(STDOUT),一旦STDOUT有数据产生,就会将这些数据传输到另一个“设备”中,该设备在Docker的世界中被称为“日志驱动(Logging Driver)”。
为了便于研究,我们以官方提供的Nginx镜像为例,来初步学习dockerlogs的基本技法。首先我们要做的是,通过以下Docker命令启动Nginx容器。
docker run -d -p 80:80 --name nginx nginx
我们启动了一个Nginx容器,该容器中的Nginx进程在后台运行(d),对外暴露了一个80端口,同时也映射到容器内部的80端口(p80:80),该容器的名称为nginx( 。打开浏览器,在地址栏中发送网页链接请求(80端口可以省略不写),可以立即看到Nginx的首页。
随后我们使用docker logs命令,查看Nginx容器的日志:
docker logs -f nginx
具体执行结果如图一所示,我们监控日志尾部(f),此后在浏览器中刷新几下,同时观察到Docker日志也在同步输出,此时输出的日志类似下面这样。
172.17.0.1 - - [27/Dec/2022:05:12:20 +0000] "GET / HTTP/1.1" 304
0 &34; "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36" &34;
很明显,这是Nginx收集的浏览器信息,此外还包括了客户端IP、请求时间、请求状态等信息。只要Docker容器内部的应用程序在控制台中有日志输出,就能通过docker logs命令来查看相应的日志。
Docker是怎样做到的呢?或者说,所谓的Docker日志驱动,到底做了些什么事情呢?我们带着这些问题继续探索。
我们使用docker info命令,可以看到Docker容器的相关信息,其中有一项叫LoggingDriver的字段:
docker info | grep 'Logging Driver'
通过输入以上命令,将得到Docker当前所设置的日志驱动类型,它就是jsonfile。顾名思义,jsonfile表示JSON文件,也就是说,Docker容器内部的应用程序所输出的日志,将自动写入一个JSON文件中。那么这个JSON日志文件到底存储在哪里呢?
通过学习Docker官方文档可知,有一个/var/lib/docker目录用于存放Docker的系统文件。进入该目录,就能看到一个名为containers的目录,这个目录中存放的就是当前运行的Docker容器,那么这个JSON日志文件是否也在containers目录中呢?
进入/var/lib/docker/containers/<container_id>目录,就会看到一个名为<container_id>json.log的文件,它就是我们要寻找的JSON日志文件了.
如图
3 所示,这里的containerId 是1a0fe, 目录下也存在一个1a0fe20e760f71a05f310974bad80055e6d677e4ef0fe64722895f876d725d27-json.log文件。
原来如此,当我们通过docker logs命令所看到的日志,实际上就是解析这个JSON日志文件后的输出。
既然应用程序的日志可以写入JSON文件中,那么也能写入其他日志驱动中,jsonfile只是Docker日志驱动的一种默认选项,Docker已为我们提供了大量的日志驱动类型。
●none:容器不输出任何日志
●jsonfile:容器输出的日志以JSON格式写入文件中(默认)
●syslog:容器输出的日志写入宿主机的Syslog中
●journald:容器输出的日志写入宿主机的Journald中
●fluentd:容器输出的日志写入宿主机的Fluentd中
。。。
在以上众多日志驱动类型中,最为常用的是Syslog,因为Syslog是Linux的日志系统,很多日志分析工具都可以从Syslog中获取日志,比如流行的ELK框架。
Docker 日志Docker 日志文件Docker json-file#
docker和kvm的区别,作为程序员你知道多少?
docker是一个开源的应用容器引擎,启动可以在秒级实现,比传统的虚拟机快得多,docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 docker 容器,docker是go语言编写的。
docker比kvm更省资源,可以提供非常接近宿主机的性能,而kvm资源隔离比docker更高,kvm支持的操作系统类型更多。
在应用方面docker(经得起折腾,部署速度快),在系统方面kvm( 宿主隔离,支持快照)
docker的优点:
1.高效的利用系统资源
2.快速的启动时间
3.一致的运行环境
4.持续交付和部署
5.更轻松的维护和扩展
KVM是一个开源的系统虚拟化模块,使用的是liunx自身的调度器管理,用kvm把多台物理机虚拟化后,组成一个大的虚拟化资源池,方便用户从资源池中按分配计算能力,
提升资源的使用效率,保证多用户资源之间的隔离性,安全性。
kvn的优点:
1.支持多种操作系统
2.支持实时迁移
3.支持混合虚拟化
4.性能和可伸缩性
5.存储和客户机镜像的格式