<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>CHENSIR</title>
  <icon>https://chensir.ink/pic/head.jpg</icon>
  <subtitle>趙兴晨的博客</subtitle>
  <link href="https://chensir.ink/atom.xml" rel="self"/>
  
  <link href="https://chensir.ink/"/>
  <updated>2025-11-26T14:04:32.779Z</updated>
  <id>https://chensir.ink/</id>
  
  <author>
    <name>趙兴晨</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>基于Docker快速搭建EFK日志中心</title>
    <link href="https://chensir.ink/2023/03/22/%E5%9F%BA%E4%BA%8EDocker%20%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BAEFK%E6%97%A5%E5%BF%97%E4%B8%AD%E5%BF%83/"/>
    <id>https://chensir.ink/2023/03/22/%E5%9F%BA%E4%BA%8EDocker%20%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BAEFK%E6%97%A5%E5%BF%97%E4%B8%AD%E5%BF%83/</id>
    <published>2023-03-22T01:00:00.000Z</published>
    <updated>2025-11-26T14:04:32.779Z</updated>
    
    <content type="html"><![CDATA[<h2 id="需要集中的日志系统的原因"><a href="#需要集中的日志系统的原因" class="headerlink" title="需要集中的日志系统的原因"></a>需要集中的日志系统的原因</h2><p>目前现状，每个服务生产上有三台，定位生产问题，需要连上一台机器，然后使用 cd &#x2F; tail &#x2F; less &#x2F; grep &#x2F; sed &#x2F; awk 等 linux命令去日志里查找故障原因。如果在这台机器没搜索到线索，就去另外两台机器上查日志。</p><p>但在分布式系统中，众多服务分散部署在数十台甚至上百台不同的服务器上，想要快速方便的实现查找、分析和归档等功能，使用Linux命令等传统的方式查询到想要的日志就费事费力，更不要说对日志进行分析与归纳了。</p><p>为解决大量日志归档，文件搜索慢，如何多维度查询就得需要集中化日志管理，将所有服务器上的日志收集汇总，常见的解决思路就是建立集中式日志收集系统。</p><h3 id="EFK"><a href="#EFK" class="headerlink" title="EFK"></a>EFK</h3><ul><li><p><strong>Elasticsearch</strong>：负责存储日志。Elasticsearch 是个开源分布式搜索引擎，提供搜集、分析、存储数据三大功能。它的特点有：分布式，零配置，自动发现，索引自动分片，索引副本机制，restful 风格接口，多数据源，自动搜索负载等。</p></li><li><p><strong>FileBeat</strong>：负责收集日志。</p><ul><li><p>Filebeat 隶属于 Beats。目前 Beats 包含六种工具：</p><p>Packetbeat（搜集网络流量数据）<br>Metricbeat（搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据）<br>Filebeat（搜集文件数据）<br>Winlogbeat（搜集 Windows 事件日志数据）<br>Auditbeat（ 轻量型审计日志采集器）<br>Heartbeat（轻量级服务器健康采集器）</p></li></ul></li><li><p><strong>Kibana</strong>：负责展示日志。Kibana可以为 Logstash 、Beats和 ElasticSearch 提供的日志分析友好的 Web 界面，可以帮助汇总、分析和搜索重要数据日志。</p></li></ul><p>注意：EFK 系统下的各个组件都非常吃内存，后期根据业务需要，EFK 的架构可进行扩展，当 FileBeat 收集的日志越来越多时，为防止数据丢失，可引入 Redis，而 ElasticSearch 也可扩展为集群，并使用 Head 插件进行管理， 所以要保证服务器有充足的运行内存和磁盘空间。</p><h4 id="EFK-与-ELK-区别"><a href="#EFK-与-ELK-区别" class="headerlink" title="EFK 与 ELK 区别"></a>EFK 与 ELK 区别</h4><p>EFK 和 ELK 只有一个区别， 收集日志的组件由 Logstash 替换成了 FileBeat，因为 Filebeat 相对于 Logstash 来说有2个好处：</p><ol><li>侵入低，无需修改 elasticsearch 和 kibana 的配置；</li><li>性能高，IO 占用率比 logstash 小太多；</li></ol><h4 id="快速部署"><a href="#快速部署" class="headerlink" title="快速部署"></a>快速部署</h4><h5 id="离线安装Docker"><a href="#离线安装Docker" class="headerlink" title="离线安装Docker"></a>离线安装Docker</h5><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">1.下载Docker安装包(二进制) docker-19.03.1.tgz  https://download.docker.com/linux/static/stable/x86_64/</span> </span><br><span class="line">yum install -y wget</span><br><span class="line">wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.1.tgz</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">2.解压docker-19.03.1.tgz</span></span><br><span class="line">tar -zxvf docker-19.03.1.tgz</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">3.复制docker目录下所有文件到/usr/bin目录下（/usr/bin是环境变量目录，在任意目录下都执行docker命令）</span></span><br><span class="line">cp docker/* /usr/bin</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">4.添加docker到系统服务</span></span><br><span class="line">vi /etc/systemd/system/docker.service</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">添加内容如下</span></span><br><span class="line">[Unit]</span><br><span class="line">Description=Docker Application Container Engine</span><br><span class="line">Documentation=https://docs.docker.com</span><br><span class="line">After=network-online.target firewalld.service</span><br><span class="line">Wants=network-online.target</span><br><span class="line">[Service]</span><br><span class="line">Type=notify</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">the default is not to use systemd <span class="keyword">for</span> cgroups because the delegate issues still</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">exists and systemd currently does not support the cgroup feature <span class="built_in">set</span> required</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="keyword">for</span> containers run by docker</span></span><br><span class="line">ExecStart=/usr/bin/dockerd</span><br><span class="line">ExecReload=/bin/kill -s HUP </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Having non-zero Limit*s causes performance problems due to accounting overhead</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="keyword">in</span> the kernel. We recommend using cgroups to <span class="keyword">do</span> container-local accounting.</span></span><br><span class="line">LimitNOFILE=infinity</span><br><span class="line">LimitNPROC=infinity</span><br><span class="line">LimitCORE=infinity</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Uncomment TasksMax <span class="keyword">if</span> your systemd version supports it.</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Only systemd 226 and above support this version.</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">TasksMax=infinity</span></span><br><span class="line">TimeoutStartSec=0</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="built_in">set</span> delegate <span class="built_in">yes</span> so that systemd does not reset the cgroups of docker containers</span></span><br><span class="line">Delegate=yes</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="built_in">kill</span> only the docker process, not all processes <span class="keyword">in</span> the cgroup</span></span><br><span class="line">KillMode=process</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">restart the docker process <span class="keyword">if</span> it exits prematurely</span></span><br><span class="line">Restart=on-failure</span><br><span class="line">StartLimitBurst=3</span><br><span class="line">StartLimitInterval=60s</span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">5.赋予docker.service 可执行权限，并设置开机自启</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">赋予可执行权限</span></span><br><span class="line">chmod +x /etc/systemd/system/docker.service</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">设置开机自启并启动</span></span><br><span class="line">systemctl enable --now docker.service</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">6.设置镜像源和docker主目录</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在 docker 19.xx 版本以后使用data-root来代替graph</span></span><br><span class="line">sudo tee /etc/docker/daemon.json &lt;&lt;-&#x27;EOF&#x27;</span><br><span class="line">&#123;</span><br><span class="line">  &quot;registry-mirrors&quot;: [&quot;https://img.chensir.ink&quot;],</span><br><span class="line">  &quot;graph&quot;: &quot;/hsadata/docker&quot; # docker主目录 存储images等</span><br><span class="line">&#125;</span><br><span class="line">EOF</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">重启docker：</span></span><br><span class="line">systemctl restart docker</span><br></pre></td></tr></table></figure><h5 id="部署Elasticsearch"><a href="#部署Elasticsearch" class="headerlink" title="部署Elasticsearch"></a>部署Elasticsearch</h5><p>相关参考地址</p><p>dockerhub：<a href="https://hub.docker.com/_/elasticsearch">https://hub.docker.com/_/elasticsearch</a></p><p>github：<a href="https://github.com/elastic/elasticsearch">https://github.com/elastic/elasticsearch</a></p><p>elastic：<a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/docker.html">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/docker.html</a></p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">1.拉取镜像</span></span><br><span class="line">docker pull docker.elastic.co/elasticsearch/elasticsearch:7.7.1</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">2.调整系统内核参数</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">elastic官方建议 生产环境下使用 elasticsearch镜像 需设置Linux参数 vm.max_map_count</span></span><br><span class="line">echo &quot;vm.max_map_count=262144&quot; &gt;&gt; /etc/sysctl.conf</span><br><span class="line">sysctl -p</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">3.新建 elasticsearch 目录</span></span><br><span class="line">mkdir -p /hsadata/elasticsearch/&#123;config,data,plugins&#125;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">4.修改 elasticsearch 配置</span></span><br><span class="line">vim /hsadata/elasticsearch/config/elasticsearch.yml</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">配置内容如下</span></span><br><span class="line">cluster.name: &quot;docker-cluster&quot;</span><br><span class="line">network.host: 0.0.0.0</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">开启 elasticsearch 安全认证 xpack认证</span></span><br><span class="line">http.cors.allow-headers: Authorization</span><br><span class="line">xpack.security.enabled: true</span><br><span class="line">xpack.security.transport.ssl.enabled: true</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">5.添加系统用户 elasticsearch</span></span><br><span class="line">adduser elasticsearch</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">6.授权目录及所属</span></span><br><span class="line">chmod g+rwx /hsadata/elasticsearch</span><br><span class="line">chown -R elasticsearch:root /hsadata/elasticsearch/</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">7.创建并启动容器（4核8G）</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">ES_JAVA_OPTS=<span class="string">&quot;-Xms2688m -Xmx2688m&quot;</span> JVM内核参数优化</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">--<span class="built_in">ulimit</span> nofile=65535:65535 设置 系统限制用户最大进程数 限制用户打开最大文件数</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">--cpuset-cpus=<span class="string">&quot;1&quot;</span> -m 4G 限制容器可用的CPU和内存资源</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Redhat8.6 涉及到权限问题 导致启动失败</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">解决方案 不挂载data目录启动镜像 然后将容器内的data目录拷贝到宿主机即可</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker <span class="built_in">cp</span> es:/usr/share/elasticsearch/data /hsadata/elasticsearch/data</span></span><br><span class="line">docker run -d -e ES_JAVA_OPTS=&quot;-Xms2688m -Xmx2688m&quot; -e &quot;discovery.type=single-node&quot; -p 9200:9200 -p 9300:9300 --restart=always --ulimit nofile=65535:65535 --cpuset-cpus=&quot;1&quot; -m 4G -v /hsadata/elasticsearch/data:/usr/share/elasticsearch/data -v /hsadata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -v /hsadata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /etc/localtime:/etc/localtime --name es 830a894845e3</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">8.启动xpack认证 并设置 elasticsearch 密码</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">进入 docker 容器</span></span><br><span class="line">docker exec -it es bash</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在容器内执行 并设置密码</span></span><br><span class="line">elasticsearch-setup-passwords interactive</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">.... 设置 es_xpack 认证的6个账户密码 ....</span></span><br></pre></td></tr></table></figure><p>部署完成后 浏览器访问 http:&#x2F;&#x2F;服务器IP:9200 输入设置的用户名和密码即可 如下图</p><img src="https://img.chensir.ink/chensir-pics/202303221440494.png" alt="image-20230322144039465" style="zoom:50%;" /><img src="https://img.chensir.ink/chensir-pics/202303221441128.png" alt="image-20230322144120069" style="zoom:50%;" /><p><strong>elastic 官网部分截图 vm.max_map_count</strong></p><img src="https://img.chensir.ink/chensir-pics/202303221055914.png" style="zoom:50%;" /><p><strong>max_map_count</strong> 文件包含限制一个进程可以拥有的VMA（虚拟内存区域）的数量。</p><p><strong>vm.max_map_count</strong> 是一个系统参数，它限制了一个进程可以拥有的虚拟内存区域(VMA)的数量。虚拟内存区域是一个连续的虚拟地址空间区域，它们在进程映射文件，链接共享内存，或分配堆空间时被创建。一些应用程序，如ES，需要较高的vm.max_map_count值，否则可能出错。vm.max_map_count的默认值是65535，但可以通过修改&#x2F;etc&#x2F;sysctl.conf文件来调整。</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看当前值</span></span><br><span class="line">sysctl -a|grep vm.max_map_count</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">临时修改</span></span><br><span class="line">sysctl -w vm.max_map_count=262144</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">永久修改</span></span><br><span class="line">echo &quot;vm.max_map_count=262144&quot; &gt;&gt; /etc/sysctl.conf</span><br><span class="line">sysctl -p</span><br></pre></td></tr></table></figure><p><strong>elastic 官网部分截图 ulimit</strong></p><img src="https://img.chensir.ink/chensir-pics/202303221122432.png" alt="image-20230322112244396" style="zoom:50%;" /><h5 id="部署Kibana"><a href="#部署Kibana" class="headerlink" title="部署Kibana"></a>部署Kibana</h5><p>相关参考地址：</p><p>dockerhub：<a href="https://hub.docker.com/_/kibana">https://hub.docker.com/_/kibana</a></p><p>github：<a href="https://github.com/elastic/kibana">https://github.com/elastic/kibana</a></p><p>elastic：<a href="https://www.elastic.co/guide/en/kibana/current/get-started.html">https://www.elastic.co/guide/en/kibana/current/get-started.html</a></p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">1.拉取镜像</span></span><br><span class="line">docker pull docker.elastic.co/kibana/kibana:7.7.1</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">2.创建目录</span></span><br><span class="line">mkdir -p /hsadata/kibana/config</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">3.配置文件</span></span><br><span class="line">vim /hsadata/kibana/config/kibana.yml</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">内容如下</span></span><br><span class="line">server.name: kibana</span><br><span class="line">server.host: &quot;0&quot;</span><br><span class="line">elasticsearch.hosts: [ &quot;http://elasticsearch:9200&quot; ]</span><br><span class="line">monitoring.ui.container.elasticsearch.enabled: true</span><br><span class="line">i18n.locale: &quot;zh-CN&quot;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">以下是 elasticsearch安全认证的用户名和密码</span> </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">用户用 Kibana 密码是部署elasticsearch设置的</span></span><br><span class="line">elasticsearch.username: &quot;kibana&quot;</span><br><span class="line">elasticsearch.password: &quot;3cu8rt00@A&quot;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">4.创建并启动容器</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="built_in">link</span> 引用 es容器名称为 elasticsearch</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建容器后在容器内部可以 ping通 elasticsearch（即es容器）</span></span><br><span class="line">docker run -d --restart=always --link es:elasticsearch -p 5601:5601 -v /hsadata/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml -v /etc/localtime:/etc/localtime --name kibana 6de54f813b39</span><br></pre></td></tr></table></figure><p>访问 Kinbana 页面 http:&#x2F;&#x2F;服务器IP:5601 如下图</p><p>用户名 elastic</p><p>密码是在elasticsearch容器中设置的密码（xpack安全认证）</p><img src="https://img.chensir.ink/chensir-pics/202303221228305.png" style="zoom:50%;" /><p>修改Kibana日期格式</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">登录http://localhost:5601/，会进入Kibana的页面，选择Management -&gt; Index Patterns -&gt; Advanced Settings，找到Date format，如何修改这里的值，默认是MMMM Do YYYY, HH:mm:ss.SSS。</span><br><span class="line">可以改成YYYY-MM-DD HH:mm:ss.SSS，这样页面的所有日期就会显示成2023-03-23 09:30:00.000 这种格式了</span><br></pre></td></tr></table></figure><h5 id="部署FileBeat（非docker）"><a href="#部署FileBeat（非docker）" class="headerlink" title="部署FileBeat（非docker）"></a>部署FileBeat（非docker）</h5><p>相关参考地址</p><p>github：<a href="https://github.com/elastic/beats">https://github.com/elastic/beats</a></p><p>elastic：<a href="https://www.elastic.co/guide/en/beats/filebeat/7.7/filebeat-overview.html">https://www.elastic.co/guide/en/beats/filebeat/7.7/filebeat-overview.html</a></p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">1.下载</span></span><br><span class="line">yum install -y wget</span><br><span class="line">wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.7.1-linux-x86_64.tar.gz</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">2.解压</span></span><br><span class="line">tar -zxvf filebeat-7.7.1-linux-x86_64.tar.gz</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">3.修改配置文件</span></span><br><span class="line">cd filebeat-7.7.1-linux-x86_64</span><br><span class="line">vim filebeat.yml</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">配置文件修改内容如下</span></span><br><span class="line">- type: log</span><br><span class="line">  enabled: true</span><br><span class="line">  paths:</span><br><span class="line">    - /root/hsa-cep-gms.log</span><br><span class="line"><span class="meta prompt_">   # </span><span class="language-bash">- /var/log/messages</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">multiline.pattern: ^\d&#123;4&#125;-\d&#123;1,2&#125;-\d&#123;1,2&#125;</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">multiline.negate: <span class="literal">true</span></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">multiline.match: after</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">-------------------------- Elasticsearch output ------------------------------</span></span><br><span class="line">output.elasticsearch:</span><br><span class="line"><span class="meta prompt_">  # </span><span class="language-bash">es服务地址</span></span><br><span class="line">  hosts: [&quot;10.0.0.76:9200&quot;]</span><br><span class="line"><span class="meta prompt_">  #</span><span class="language-bash">protocol: <span class="string">&quot;https&quot;</span></span></span><br><span class="line"><span class="meta prompt_">  # </span><span class="language-bash">设置es的用户名和密码</span></span><br><span class="line">  username: &quot;elastic&quot;</span><br><span class="line">  password: &quot;3cu8rt00@A&quot;</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">================================ Processors =====================================</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">去掉FileBeat自身不需要的字段</span></span><br><span class="line">processors:</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> - add_host_metadata: ~</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> - add_cloud_metadata: ~</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> - add_docker_metadata: ~</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> - add_kubernetes_metadata: ~</span></span><br><span class="line">  - drop_fields:</span><br><span class="line">      fields: [&quot;input&quot;,&quot;agent&quot;,&quot;ecs&quot;,&quot;host&quot;,&quot;log.flags&quot;,&quot;log.offset&quot;]</span><br><span class="line">      ignore_missing: false</span><br><span class="line">      </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">4.编写 start.sh 启动脚本</span></span><br><span class="line">vim start.sh</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">内容如下</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line">cd $1</span><br><span class="line">./filebeat -e -c filebeat.yml &gt; logs/filebeat.log 2&gt;&amp;1 &amp;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">添加可执行权限</span></span><br><span class="line">chmod +x start.sh</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建logs目录</span></span><br><span class="line">mkdir logs</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">5.添加到系统服务</span></span><br><span class="line">vim /etc/systemd/system/filebeat.service</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">内容如下</span></span><br><span class="line">[Unit]</span><br><span class="line">Description=filebeat</span><br><span class="line">After=network.target</span><br><span class="line">[Service]</span><br><span class="line">Type=forking</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">步骤4中 start.sh的全路径</span></span><br><span class="line">ExecStart=/root/filebeat-7.7.1-linux-x86_64/start.sh  /root/filebeat-7.7.1-linux-x86_64</span><br><span class="line">ExecStop=/usr/bin/kill -s HUP</span><br><span class="line">PrivateTmp=true</span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">6.启动并设置开机自启</span></span><br><span class="line">systemctl enable --now filebeat</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;需要集中的日志系统的原因&quot;&gt;&lt;a href=&quot;#需要集中的日志系统的原因&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="Linux" scheme="https://chensir.ink/categories/Linux/"/>
    
    
    <category term="Docker EFK" scheme="https://chensir.ink/tags/Docker-EFK/"/>
    
  </entry>
  
  <entry>
    <title>离线yum源</title>
    <link href="https://chensir.ink/2022/09/25/%E7%A6%BB%E7%BA%BFyum%E6%BA%90/"/>
    <id>https://chensir.ink/2022/09/25/%E7%A6%BB%E7%BA%BFyum%E6%BA%90/</id>
    <published>2022-09-24T20:20:35.000Z</published>
    <updated>2025-11-26T14:04:32.777Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>由于大部分的主要业务都在专网，内网环境下运行，无法使用yum安装升级和更新，服务器少的情况下可以使用离线安装，但随着服务器规模上升，还是需要使用统一的自建yum源更方便。</p></blockquote><h1 id="什么是yum源"><a href="#什么是yum源" class="headerlink" title="什么是yum源"></a>什么是yum源</h1><p>yum是在ReddHat中的一个包管理器。基于RPM包管理，能够从指定服务器自动下载RPM包并安装，可以自动处理依赖关系，能够一次安装所有依赖的软件包，无需一次一次的下载安装。yum源就是存放rpm包以及依赖关系的服务器，一般公共网络的yum源：163、souhu、阿里、中国科技大学、清华等。</p><h1 id="yum源标识-repo-id"><a href="#yum源标识-repo-id" class="headerlink" title="yum源标识(repo id)"></a>yum源标识(repo id)</h1><ul><li><p>base：之操作系统镜像源，包含了ISO镜像内的所有软件包</p></li><li><p>updates：包含了系统更新，升级的软件包</p></li><li><p>extras：扩充的软件包合集</p></li><li><p>epel：为“红帽系”的错做系统提供额外的软件包，适用于RHEL、CentOS和Scientific Linux</p></li><li><p>自定义repo id </p><p>以K8S yum源为例，[repo id]本地可以随意定义，主要是看baseurl连接的源，当多个repo id重复时，会以最后加载的为准</p></li></ul><h1 id="搭建离线yum源"><a href="#搭建离线yum源" class="headerlink" title="搭建离线yum源"></a>搭建离线yum源</h1><p>注意：需要准备一台可以连接互联网的服务器，安装所需依赖环境和软件包</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装所需软件</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">createrepo:用于生成yum源各软件之间的依赖索引</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">yum-utils:安装后可使用yumdownloader命令下载所需如软件包</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">reposync:Reposync用于将远程yum存储同步到本地，使用yum检索包的目录</span></span><br><span class="line">yum install -y wget yum-utils createrepo</span><br><span class="line">rm -rf /etc/yum.repos.d/*</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">配置yum源 以阿里Centos7的yum源为例</span></span><br><span class="line">wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo</span><br><span class="line">sed -i -e &#x27;/mirrors.cloud.aliyuncs.com/d&#x27; -e &#x27;/mirrors.aliyuncs.com/d&#x27; /etc/yum.repos.d/CentOS-Base.repo</span><br><span class="line">wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo</span><br><span class="line">wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</span><br><span class="line"></span><br><span class="line">cat &lt;&lt;EOF &gt; /etc/yum.repos.d/kubernetes.repo</span><br><span class="line">[kubernetes]</span><br><span class="line">name=Kubernetes</span><br><span class="line">baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/</span><br><span class="line">enabled=1</span><br><span class="line">gpgcheck=0</span><br><span class="line">repo_gpgcheck=0</span><br><span class="line">gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg</span><br><span class="line">EOF</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">全量离线yum源</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看已经配好的网络源<span class="built_in">id</span></span></span><br><span class="line">yum repolist</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">按照源<span class="built_in">id</span>将网络源拉取到本地</span></span><br><span class="line">reposync -r base -p /data/yum/</span><br><span class="line">reposync -r epel -p /data/yum/</span><br><span class="line">reposync -r extras -p /data/yum/</span><br><span class="line">reposync -r updates -p /data/yum/</span><br><span class="line">reposync -r kubernetes -p /data/yum/</span><br><span class="line">reposync -r docker-ce-stable -p /data/yum/</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成repodata索引依赖</span></span><br><span class="line">createrepo /data/yum/base</span><br><span class="line">createrepo /data/yum/epel</span><br><span class="line">createrepo /data/yum/extras</span><br><span class="line">createrepo /data/yum/updates</span><br><span class="line">createrepo /data/yum/kubernetes</span><br><span class="line">createrepo /data/yum/docker-ce-stable</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在Packages同级目录中可以看到生成的repodata目录</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">使用测试</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">备份/etc/yum.repo.d/中的其他文件，手动添加</span></span><br><span class="line">[Centos7-base]</span><br><span class="line">name=centos-base</span><br><span class="line">baseurl=file:///opt/base/base</span><br><span class="line">gpgcheck=0</span><br><span class="line">enabled=1</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">其他repo <span class="built_in">id</span>按照同样格式书写</span></span><br><span class="line">[kubernetes] </span><br><span class="line">name=k8s</span><br><span class="line">baseurl=http://192.168.12.12/yum/kubernetes</span><br><span class="line">......</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">注意：baseurl可以使用file、ftp或http，目录路径要写到Package和repodata目录</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">测试</span></span><br><span class="line">yum repolist</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">将本地的rpm包和依赖包压缩打包，放入内网环境，这样其他服务器也可以通过添加自定义repo文件连接yum源仓库了</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装nginx使其他机器也可以使用</span></span><br><span class="line">yum install -y nginx</span><br><span class="line">systemctl enable --now nginx</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">配置文件如下 /etc/nginx/default.d/yum.conf</span></span><br><span class="line">location / &#123;</span><br><span class="line">    root /data/yum;</span><br><span class="line">    index index.html;</span><br><span class="line">    autoindex on;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">使配置文件生效</span></span><br><span class="line">systemctl reload nginx</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">其他机器修改yum源地址</span></span><br><span class="line">mkdir /etc/yum.repos.d/bak</span><br><span class="line">mv /etc/yum.repos.d/* /etc/yum.repos.d/bak</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> 编辑内容如下 /etc/yum.repos.d/private-yum.repo</span></span><br><span class="line">[base]</span><br><span class="line">name=CentOS-Base</span><br><span class="line">baseurl=http://10.0.0.28/base/</span><br><span class="line">gpgcheck=0</span><br><span class="line">enabled=1</span><br><span class="line"></span><br><span class="line">[updates]</span><br><span class="line">name=CentOS-Updates</span><br><span class="line">baseurl=http://10.0.0.28/updates/</span><br><span class="line">gpgcheck=0</span><br><span class="line">enabled=1</span><br><span class="line"></span><br><span class="line">[extras]</span><br><span class="line">name=CentOS-Extras</span><br><span class="line">baseurl=http://10.0.0.28/extras</span><br><span class="line">gpgcheck=0</span><br><span class="line">enabled=1</span><br><span class="line"></span><br><span class="line">[epel]</span><br><span class="line">name=CentOS-Contrib</span><br><span class="line">baseurl=http://10.0.0.28/epel</span><br><span class="line">gpgcheck=0</span><br><span class="line">enabled=1</span><br><span class="line"></span><br><span class="line">[docker-ce-stable]</span><br><span class="line">name=CentOS-docker-ce-stable</span><br><span class="line">baseurl=http://10.0.0.28/docker-ce-stable</span><br><span class="line">gpgcheck=0</span><br><span class="line">enabled=1</span><br><span class="line"></span><br><span class="line">[kubernetes]</span><br><span class="line">name=CentOS-docker-ce-stable</span><br><span class="line">baseurl=http://10.0.0.28/kubernetes</span><br><span class="line">gpgcheck=0</span><br><span class="line">enabled=1</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">使yum源生效</span></span><br><span class="line">yum clean all</span><br><span class="line">yum makecache</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">拉取指定服务rpm包和依赖</span></span><br><span class="line">yumdownloader --resolve --destdir=./docker_rpms/ docker</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成repodata索引依赖</span></span><br><span class="line">createrepo ./docker_rpms</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">测试</span></span><br><span class="line">cat &lt;&lt;EOF&gt;&gt; /etc/yum.repos.d/test.repo</span><br><span class="line">[docker]</span><br><span class="line">name=dokcer-ce</span><br><span class="line">baseurl=file:///root/docker_rpms</span><br><span class="line">gpgcheck=0</span><br><span class="line">enabled=1</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">yum repolist</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;由于大部分的主要业务都在专网，内网环境下运行，无法使用yum安装升级和更新，服务器少的情况下可以使用离线安装，但随着服务器规模上升，还是需要使用统一的自建yum源更方便。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;什么是yum源&quot;&gt;&lt;a</summary>
        
      
    
    
    
    <category term="Linux" scheme="https://chensir.ink/categories/Linux/"/>
    
    
    <category term="Centos7 yum源" scheme="https://chensir.ink/tags/Centos7-yum%E6%BA%90/"/>
    
  </entry>
  
  <entry>
    <title>企业级容器技术 Docker</title>
    <link href="https://chensir.ink/2022/09/12/%E4%BC%81%E4%B8%9A%E7%BA%A7%E5%AE%B9%E5%99%A8%E6%8A%80%E6%9C%AF%20Docker/"/>
    <id>https://chensir.ink/2022/09/12/%E4%BC%81%E4%B8%9A%E7%BA%A7%E5%AE%B9%E5%99%A8%E6%8A%80%E6%9C%AF%20Docker/</id>
    <published>2022-09-12T07:51:13.000Z</published>
    <updated>2025-11-26T14:04:32.747Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Docker介绍和基础操作"><a href="#Docker介绍和基础操作" class="headerlink" title="Docker介绍和基础操作"></a>Docker介绍和基础操作</h1><h2 id="Docker介绍"><a href="#Docker介绍" class="headerlink" title="Docker介绍"></a>Docker介绍</h2><h3 id="容器历史"><a href="#容器历史" class="headerlink" title="容器历史"></a>容器历史</h3><p>1、Chroot Jail 就是常见的chroot命令的用法。它在1979年的时候就出现了，被认为是最早的容器化技术之一。它可以把一个进程的文件系统隔离起来。</p><p>2、The FreeBSD Jail （监狱）实现了操作系统级别的虚拟化，他是操作系统级别虚拟化技术的先驱之一。2000年，伴随FreeBSD4.0版的发布</p><p>3、Linux VServer  <a href="http://linux-vserver.org/">http://linux-vserver.org</a> 使用添加到Linux内核的系统级别的虚拟化功能实现的专用虚拟服务器。允许创建许多独立的虚拟专用服务器（VPS），这些虚拟专用服务器在单个物理服务器上全速同时运行，从而有效地共享硬件资源。VPS提供与传统Linux服务器几乎相同的操作系统环境。可以在这样的VPS上启动所有服务（例如ssh，邮件，Web和数据库服务器），而无需（或者在特殊情况下只需进行很少的修改），就像在任何真实服务器上一样。每个VPS都有自己的用户账户数据库和root密码，并且与其他虚拟机服务器隔离，但它们共享相同的硬件资源。 </p><p>4、Solaris Containers 也是操作系统级别的虚拟化技术，专为X866和SPARC系统设计。Solaris容器是系统资源控制和通过“区域”提供边界隔离的组合。</p><p>5、OpenVZ 是一种Linux中操作系统级别的虚拟化技术。它允许创建多个安全隔离的Linux容器，即VPS。</p><p>6、Process Containers 由Google的工程师开发，一般被称为cgroups。</p><p>7、LXC 为Linux Container的简写。可以提供轻量级的虚拟化，以便隔离进程和资源，而且不需要提供指令解释机制以及全虚拟化的其他复杂性。容器有效地将由单个操作系统管理的资源划分到孤立的组中，以更好地在孤立的组之间平衡有冲突的资源使用需求。Linux Container 提供了在单一可控主机节点上支持多个相互隔离的server Container同时执行的机制。Linux COntainer有点像chroot，提供了一个拥有自己进程和网络空间的虚拟环境，但又有别于虚拟机，因为lxc是一种操作系统层次上的资源虚拟化。</p><p>8、Warden 在最初阶段，Warden使用LXC作为容器运行时。如今已被CloudFoundy取代。</p><p>9、LMCTFY 是Google的容器技术栈的开源版本。Google的工程师一直在与docker的libertainer团队合作，并将libertainerde核心概念进行抽象并移植到此项目中，该项目的进展不明，估计会被libcontainer取代。</p><p>10、Docker 是一个可以将应用及其依赖打包到几乎可以在任何服务器上运行的容器工具。</p><p>11、RKT 是Rocket的缩写，他是一个专注安全和开放标准的应用程序引擎。</p><p><strong>总上所述，docker并不是第一个容器化技术，但它确实最知名的一个。</strong></p><h3 id="Docker是什么"><a href="#Docker是什么" class="headerlink" title="Docker是什么"></a>Docker是什么</h3><p>Docker（码头工人）是一个开源项目，诞生于2013年初，最初是dotCloud公司（后由于Docker开源后大受欢迎就将公司名改为Docker Inc，总部位于美国加州的旧金山）内部的一个开源的PAAS服务的业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会，遵从了Apache2.0协议，项目代码在GitHub上进行维护。</p><p>Docker是基于Linux内核实现，Docker是最早采用LXC技术，LXC是Linux原生支持的容器技术，可以提供轻量级的虚拟化，可以说docker就是基于LXC发展起来的，提供LXC的高级封装，标准的配置方法，在LXC的基础上，docekr提供了一系列更强大的功能。而虚拟化技术KVM基于模块实现，后来Docker改为自己研发并开源的runc技术运行容器，彻底抛弃了LXC。</p><p>Docker相比虚拟机的交付速度更快，资源消耗更低，Docker采用客户端&#x2F;服务端架构，使用远程API来管理和创建容器，其可以轻松的创建一个轻量级的、可移植的、自给自足的容器，docker的三大理念是build（构建）、ship（运输）、run（运行），Docker遵从Apache2.0协议，并通过（namespace及cgroup等）来提供容器的资源隔离与安全保障等，所以Docker容器在运行时不需要类似虚拟机（空运行的虚拟机占用物理机6%~8%性能）的额外资源开销，因此可以大幅提高资源利用率，总而言之Docker是一种用了新颖方式实现的轻量级虚拟机，类似于VM，但是在原理和应用上和VM的差别还是很大的，并且Docker的专业叫法是应用容器（Application Container）。</p><p><strong>Docker的主要目标</strong>：Build，Ship and Run Any App，Anywhere，即通过对应用组件的封装（Packaging）、分发（Distribution）、部署（Deployment）。运行（Runtime）等生命周期的管理，达到应用组件级别的“一次封装，到处运行”。这里的应用组件，既可以是一个Web应用，也可以是一套数据库服务，甚至是一个操作系统。将应用运行在Docker容器上，可以实现跨平台，跨服务器，只需一次配置准备好相关的应用环境，即可实现到处运行，保证研发和生产环境的一致性，解决了应用和运行环境的兼容性问题，从而极大提升了部署效率，减少故障的可能性。</p><p><strong>使用Docker容器化封装应用程序的意义</strong>：</p><img src="https://img.chensir.ink/chensir-pics/202208202108132.png" alt="image-20220820210814092" style="zoom:50%;" /><ul><li>统一基础设施环境-docker环境<ul><li>硬件的组成配置</li><li>操作系统的版本</li><li>运行时环境的异构</li></ul></li><li>统一程序打包（装箱）方式-docker镜像<ul><li>Java程序</li><li>python程序</li><li>nodejs程序</li></ul></li><li>统一程序部署（运行）方式-docker容器<ul><li>java -jar……—&gt;docker run ……</li><li>python manage.py……—&gt;docker run ……</li><li>npm run dev ……—&gt;docker run ……</li></ul></li></ul><h3 id="Docker和虚拟机，物理主机"><a href="#Docker和虚拟机，物理主机" class="headerlink" title="Docker和虚拟机，物理主机"></a>Docker和虚拟机，物理主机</h3><img src="https://img.chensir.ink/chensir-pics/202208202120895.png" alt="image-20220820212018858" style="zoom:80%;" /><p><strong>容器和虚拟机比较</strong></p><img src="https://img.chensir.ink/chensir-pics/202208202130788.png" alt="image-20220820213043769" style="zoom:80%;" /><ul><li>传统虚拟机是虚拟出一个主机硬件，并且运行一个完整的操作系统，然后在这个操作系统上安装和运行软件</li><li>容器内的应用直接运行在宿主机的内核之上，容器并没有自己的内核，也不需要虚拟硬件，相当轻量化</li><li>每个容器间是互相隔离，每个容器内都有一个属于自己的独立文件系统，独立的进程空间，网络空降，用户空间等，所以在同一个宿主机上的多个容器之间彼此不会互相影响</li></ul><p><strong>容器和虚拟机比较</strong></p><ul><li>资源利用率更高：开销更小，不需要启动单独的虚拟机OS内核占用硬件资源，可以将服务器性能压榨到极致，虚机一般会有5%~20%的损耗，容器运行基本无损耗，所以生产中一台物理机只能运行数十个虚拟机，但是一般可以运行数百个容器</li><li>启动速度更快：可以在数秒内完成启动</li><li>占用空间更小：容器一般占用的磁盘空间以MB为单位，而虚拟机以GB</li><li>集成性更好：和CI&#x2F;CD（持续集成&#x2F;持续部署）相关技术结合性更好，实现打报警箱发布测试可以一键运行，做到自动化并快速的部署管理，实现高效的开发生命周期</li></ul><p>使用虚拟机是为了更好的实现服务运行环境隔离，每个虚拟机都有独立的内核，虚拟化可以实现不同操作系统的虚拟机，但是通常一个虚拟机只运行一个服务，很明显资源利用率比较低且造成不必要的性能损耗，我们创建虚拟机的目的是为了运行应用程序，比如Nginx、PHP、Tomcat等web程序，使用虚拟机无疑带来了一些不必要的资源开销，但是容器技术则基于减少中间运行环节带来较大的性能提升。</p><p>根据实验，一个运行着Centos的KVM虚机启动后，在不做优化的情况下，虚机自己就占用100~200M内存。此外，用户应用运行在虚机里，它对宿主机操作系统的调用就不可避免地要经过虚拟化软件的拦截和处理，这本身又是一层性能损耗，尤其对计算资源、网络和磁盘I&#x2F;O的损耗非常大。</p><p>比如。一台96G内存的物理服务器，为了运行java程序的虚拟机一般需要分配4核8G的资源，只能运行13台左右的虚机，但是改为在docker容器上运行Java程序，每个容器只需要分配4G内存即可，同样的物理服务器就可以运行25个左右的容器，运行数量相当于提高一倍，可以大幅节省IT支出，通常情况下至少可以节约一半以上的物理设备</p><h3 id="Docker的组成"><a href="#Docker的组成" class="headerlink" title="Docker的组成"></a>Docker的组成</h3><ul><li>Docker主机（Host）：一个物理机或虚拟机，用于运行Docker服务进程和容器，也称为宿主机，node节点</li><li>Docker服务端（Server）：Docker守护进程，运行Docker容器</li><li>Docker客户端（Client）：客户端使用docker命令或其他工具调用docker API</li><li>Docker镜像（Images）：镜像可以理解为创建实例使用的模板，本质上就是一些程序文件的集合</li><li>Docker仓库（Registry）：保存镜像的仓库，可以搭建私有仓库harbor</li><li>Docker容器（Container）：容器是从镜像生成对外提供服务的一个或一组服务，其本质就是将镜像中的程序启动后生成进程</li></ul><img src="https://img.chensir.ink/chensir-pics/202208202156140.svg" alt="architecture" style="zoom:80%;" /><h3 id="Namespace"><a href="#Namespace" class="headerlink" title="Namespace"></a>Namespace</h3><p>一个宿主机运行了N个容器，多个容器共用一个OS，必然带来以下问题：</p><ul><li>怎样保证每个容器都有不同的文件系统并且互不影响？</li><li>一个docker主进程内的各个容器都是其子进程，那么如何实现同一个主进程下不同类型的子进程？各个容器子进程间能相互通信（内存数据）吗？</li><li>每个容器怎么解决IP及端口分配的问题？</li><li>多个容器的主机名能一样吗？</li><li>每个容器都要不要有root用户？怎么解决账户重名问题？</li></ul><p>namespace是Linux系统的底层概念，在内核层实现，即有一些不同类型的命名空间被部署在核内，各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核，各docker容器运行在宿主机的用户空间，每个容器都要有类似于虚拟机一样的相互隔离的运行空间，但是容器技术是在一个进程内实现运行指定服务的运行环境，并且还可以保护宿主机内核不受其他进程的干扰和影响，如文件系统，网络空间，进城空间，目前主要通过以下技术实现容器运行空间的相互隔离：</p><table><thead><tr><th>隔离类型</th><th>功能</th><th>系统调用参数</th><th>内核版本</th></tr></thead><tbody><tr><td>MNT Namespace（mount）</td><td>提供磁盘挂载点和文件系统的隔离能力</td><td>CLONE_NEWNS</td><td>2.4.19</td></tr><tr><td>IPC Namespace（Inter Process Communication）</td><td>提供进程间通信的隔离能力，包括信号量，消息队列和共享内存</td><td>CLONE_NEWIPC</td><td>2.6.19</td></tr><tr><td>UTS Namespace（UNIX Timesharing System）</td><td>提供内核，主机名和域名隔离能力</td><td>CLONE_NEWUTS</td><td>2.6.19</td></tr><tr><td>PID Namespace （Process Identification）</td><td>提供进程隔离能力</td><td>CLONE_NEWPID</td><td>2.6.24</td></tr><tr><td>Net Namespace（network）</td><td>提供网络隔离能力，包括网络设备，网络栈，端口等</td><td>CLONE_NEWNET</td><td>2.6.29</td></tr><tr><td>User Namespace（user）</td><td>提供用户隔离能力，包括用户和组</td><td>CLONE_NEWUSER</td><td>3.8</td></tr></tbody></table><h4 id="MNT-Namespace"><a href="#MNT-Namespace" class="headerlink" title="MNT Namespace"></a>MNT Namespace</h4><p>每个容器都要有独立的根文件系统有独立的用户空间，以实现在容器里面启动服务并且使用容器的运行环境，即一个宿主机是ubuntu的服务器，可以在里面启动一个centos运行环境的容器并且在容器里面启动一个nginx服务，此nginx运行时使用的运行环境就是centos系统目录的运行环境，但是在容器里面是不能访问宿主机的资源，宿主机是使用了chroot技术把容器锁定到一个指定的运行目录里面。</p><h4 id="IPC-Namespace"><a href="#IPC-Namespace" class="headerlink" title="IPC Namespace"></a>IPC Namespace</h4><p>一个容器内的进程通信，允许一个容器内的不同进程（内存、缓存等）数据访问，但是不能跨容器直接访问其他容器的数据。</p><h4 id="UTS-Namespace"><a href="#UTS-Namespace" class="headerlink" title="UTS Namespace"></a>UTS Namespace</h4><p>UTS namespace （UNIX Timesharing System 包含了运行内核的名称、版本、底层体系结构类型等信息）用于系统标识，其中包含了主机名hostname和域名domainname，它使得一个容器拥有属于自己主机名标识，这个主机名标识独立于宿主机系统和其他上的机器。</p><h4 id="PID-Namespace"><a href="#PID-Namespace" class="headerlink" title="PID Namespace"></a>PID Namespace</h4><p>Linux系统中，有一个PID为1的进程（init&#x2F;systemd）是其他所有进程的父进程，那么在每个容器内也要有一个父进程来管理下属的子进程，那么多个容器的进程通PID namespace进程隔离（比如PID编号重复、容器内的主进程生成与回收子进程等）</p><h4 id="NET-Namespace"><a href="#NET-Namespace" class="headerlink" title="NET Namespace"></a>NET Namespace</h4><p>每一个容器都类似于虚拟机一样有自己的网卡、监听端口、TCP&#x2F;IP协议栈等，Docker使用network namespace启动一个vethX接口，这样你的容器将拥有它自己的桥接IP地址，通常是docker0，而docker0实质就是Linux的虚拟网桥，网桥是在OSI七层模型的数据链路层的网络设备，通过mac地址对网络进行划分，并且在不同网络直接传递数据。</p><h4 id="User-Namespace"><a href="#User-Namespace" class="headerlink" title="User Namespace"></a>User Namespace</h4><p>各个容器内可能会出现重名的用户和用户组名称，或重复的用户UID或者GID，那么怎么隔离各个容器内的用户空间呢？</p><p>User Namespace允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的用户UID和GID，只是会把用户的作用范围限制在每个容器内，即A容器和B容器可以有相同的用户名称和ID账户，但是此用户的有效范围仅是当前容器内，不能访问另外一个容器内的文件系统，级相互隔离、互不影响、永不相见。</p><h3 id="Control-groups"><a href="#Control-groups" class="headerlink" title="Control groups"></a>Control groups</h3><p>Linux Cgroups的全称是Linux Control Groups，是Linux内核的一个功能，最早由Google的工程师（主要是Paul Menage和Rohit Seth）在2006年发起，最早的名称为<strong>进程容器</strong>（process containers）。在2007年时，因为在Linux内核中，容器（container）这个名词有许多不同的意义，为避免混乱，被重命名为cgroup，并且被合并到2.6.24版的内核中去。自那以后，又添加了很多功能。</p><p>如果不对一个容器做任何资源限制，则宿主机会允许其占用无限大的内存空间，有时候会因为代码bug程序会一直申请内存，直到把宿主机内存占完，为了避免此类的问题出现，宿主机有必要对容器进行资源分配限制，比如CPU、内存等。</p><p>Cgroups最主要的作用，就是限制一个进程组能够使用的资源上限，包括CPU、内存、磁盘、网络带宽等。此外，还能够对进程进行优先级设置，资源的计量以及资源的控制（比如：将进程挂起和恢复等操作）。</p><h4 id="验证系统-cgroups"><a href="#验证系统-cgroups" class="headerlink" title="验证系统 cgroups"></a>验证系统 cgroups</h4><p>Cgroups在内核层默认已经开启，从Centos和Ubuntu不同版本对比，显然内核较新的支持的功能更多。</p><p><strong>Centos7.4 cgroups：</strong></p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@jk-k8s ~]# cat /etc/redhat-release</span><br><span class="line">CentOS Linux release 7.4.1708 (Core)</span><br><span class="line">[root@jk-k8s ~]#</span><br><span class="line">[root@jk-k8s ~]# grep CGROUP /boot/config-3.10.0-693.el7.x86_64</span><br><span class="line">CONFIG_CGROUPS=y</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">CONFIG_CGROUP_DEBUG is not <span class="built_in">set</span></span></span><br><span class="line">CONFIG_CGROUP_FREEZER=y</span><br><span class="line">CONFIG_CGROUP_PIDS=y</span><br><span class="line">CONFIG_CGROUP_DEVICE=y</span><br><span class="line">CONFIG_CGROUP_CPUACCT=y</span><br><span class="line">CONFIG_CGROUP_HUGETLB=y</span><br><span class="line">CONFIG_CGROUP_PERF=y</span><br><span class="line">CONFIG_CGROUP_SCHED=y</span><br><span class="line">CONFIG_BLK_CGROUP=y</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">CONFIG_DEBUG_BLK_CGROUP is not <span class="built_in">set</span></span></span><br><span class="line">CONFIG_NETFILTER_XT_MATCH_CGROUP=m</span><br><span class="line">CONFIG_NET_CLS_CGROUP=y</span><br><span class="line">CONFIG_NETPRIO_CGROUP=y</span><br><span class="line">[root@jk-k8s ~]#</span><br></pre></td></tr></table></figure><p><strong>cgroups中内存模块</strong></p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@jk-k8s ~]# grep MEMCG /boot/config-3.10.0-693.el7.x86_64</span><br><span class="line">CONFIG_MEMCG=y</span><br><span class="line">CONFIG_MEMCG_SWAP=y</span><br><span class="line">CONFIG_MEMCG_SWAP_ENABLED=y</span><br><span class="line">CONFIG_MEMCG_KMEM=y</span><br></pre></td></tr></table></figure><h4 id="cgroups具体实现"><a href="#cgroups具体实现" class="headerlink" title="cgroups具体实现"></a>cgroups具体实现</h4><ul><li>blkio：块设备IO限制</li><li>cpu：使用调度程序为cgroup任务提供CPU访问</li><li>cpuacct：产生cgroup任务的CPU资源报告</li><li>cpuset：如果是多核心的cpu，这个子系统会为cgroup任务分配单独的cpu和内存</li><li>devices：允许或拒绝cgroup任务对设备访问</li><li>freezer：暂停和恢复cgroup任务</li><li>memory：设置每个cgroup的内存限制以及产生内存资源报告</li><li>net_cls：标记每个网络包以供cgroup方便使用</li><li>ns：命名空间子系统</li><li>perf_event：增加了对每group的检测跟踪的能力，可以检测属于某个特定的group的所有线程以及运行在特定CPU上的线程</li></ul><h4 id="查看系统cgroups"><a href="#查看系统cgroups" class="headerlink" title="查看系统cgroups"></a>查看系统cgroups</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@jk-k8s ~]# ll /sys/fs/cgroup/</span><br><span class="line">总用量 0</span><br><span class="line">drwxr-xr-x 5 root root  0 8月  19 09:46 blkio</span><br><span class="line">lrwxrwxrwx 1 root root 11 8月  19 09:46 cpu -&gt; cpu,cpuacct</span><br><span class="line">lrwxrwxrwx 1 root root 11 8月  19 09:46 cpuacct -&gt; cpu,cpuacct</span><br><span class="line">drwxr-xr-x 5 root root  0 8月  19 09:46 cpu,cpuacct</span><br><span class="line">drwxr-xr-x 3 root root  0 8月  19 09:46 cpuset</span><br><span class="line">drwxr-xr-x 5 root root  0 8月  19 09:46 devices</span><br><span class="line">drwxr-xr-x 3 root root  0 8月  19 09:46 freezer</span><br><span class="line">drwxr-xr-x 3 root root  0 8月  19 09:46 hugetlb</span><br><span class="line">drwxr-xr-x 5 root root  0 8月  19 09:46 memory</span><br><span class="line">lrwxrwxrwx 1 root root 16 8月  19 09:46 net_cls -&gt; net_cls,net_prio</span><br><span class="line">drwxr-xr-x 3 root root  0 8月  19 09:46 net_cls,net_prio</span><br><span class="line">lrwxrwxrwx 1 root root 16 8月  19 09:46 net_prio -&gt; net_cls,net_prio</span><br><span class="line">drwxr-xr-x 3 root root  0 8月  19 09:46 perf_event</span><br><span class="line">drwxr-xr-x 3 root root  0 8月  19 09:46 pids</span><br><span class="line">drwxr-xr-x 5 root root  0 8月  19 09:46 systemd</span><br><span class="line">[root@jk-k8s ~]#</span><br><span class="line">[root@jk-k8s ~]# cat /sys/fs/cgroup/cpu/docker/5a1b43275caa1f8c9fff9ea8ccd3813d4a25acf698f15a3ec5eacd77948833b5/cpuacct.usage</span><br><span class="line">109845268</span><br><span class="line">[root@jk-k8s ~]#</span><br><span class="line">[root@jk-k8s ~]# cat /sys/fs/cgroup/memory/docker/5a1b43275caa1f8c9fff9ea8ccd3813d4a25acf698f15a3ec5eacd77948833b5/memory.limit_in_bytes</span><br><span class="line">9223372036854771712</span><br><span class="line">[root@jk-k8s ~]# cat /sys/fs/cgroup/memory/docker/5a1b43275caa1f8c9fff9ea8ccd3813d4a25acf698f15a3ec5eacd77948833b5/memory.max_usage_in_bytes</span><br><span class="line">12566528</span><br><span class="line">[root@jk-k8s ~]#</span><br></pre></td></tr></table></figure><h3 id="容器管理工具"><a href="#容器管理工具" class="headerlink" title="容器管理工具"></a>容器管理工具</h3><h4 id="LXC"><a href="#LXC" class="headerlink" title="LXC"></a>LXC</h4><p>官网：<a href="https://linuxcontainers.org/">https://linuxcontainers.org</a></p><p>Linux Container 可以提供轻量级的虚拟化功能，以便隔离进程和资源，包括一系列容器的管理工具软件，如，lxc-create，lxc-start，lxc-attach等，但这技术功能不完善，目前较少使用。</p><h4 id="docker"><a href="#docker" class="headerlink" title="docker"></a>docker</h4><p>docker相当于增强版的LXC，功能更为强大和易用，也是当前最主流的容器前端管理工具</p><p>docker先启动一个容器也需要一个外部模板，也称为镜像，docker的镜像可以保存在一个公共的地方共享使用，只要把镜像下载下来就可以使用，最主要的是可以在镜像基础之上做自定义配置并且可以再把其提交为一个镜像，一个镜像可以被启动为多个容器。</p><p>docker的镜像是分层的，镜像底层为库文件且只读层即不能写入也不能删除数据，从镜像加载启动为一个容器后会生成一个可写层，其写入的数据会复制到宿主机上对应容器的目录，但是容器内的数据在删除容器后也会被随之删除。</p><h4 id="pouch"><a href="#pouch" class="headerlink" title="pouch"></a>pouch</h4><p><a href="https://github.com/alibaba/pouch">https://github.com/alibaba/pouch</a></p><p>Pouch（小袋子）起源于2011年，并于2017年11月19日上午，在中国开源年会现场，阿里巴巴正式开源了基于Apache2.0协议的容器技术Pouch。Pouch是一款轻量级的容器技术，拥有快速高效、可移植性高、资源占用少等特性，主要帮助阿里更快的做到内部业务的交付，同时提高超大规模下数据中心的物理资源利用率</p><p>目前的容器方案大多基于Linux内核提供的cgroup和namespace来实现隔离，然后这样轻量级方案存在弊端：</p><ul><li>容器间，容器与宿主机间，共享一个内核</li><li>内核实现的隔离资源，维度不足</li></ul><p>面对如此的内核现状，阿里巴巴采取了三个方面的工作，来解决容器的安全问题：</p><ul><li>增强容器的隔离维度，比如网络带宽、磁盘使用量</li><li>给内核提交patch，修复容器的资源可见性问题，cgroup方面的bug</li><li>实现基于Hypervisor的容器，通过创建新内核来实现容器隔离</li></ul><h4 id="Podman"><a href="#Podman" class="headerlink" title="Podman"></a>Podman</h4><p><a href="https://podman.io/">https://podman.io</a></p><p>虽然目前docker是管理Linux容器最好的耳工具，注意没有之一，但是podman的横空出现即将改变这一点</p><p>什么是Podman？</p><p>Podman即Pod Manager tool，从名称上可以看出和kubernets的pod的密切联系，不过就其功能来说，简言之：alias docker &#x3D; podman，是centos8新集成的功能，或许不就的未来会替代docker</p><p>Podman是一个为Kubernetes而生的开源的容器管理工具，原来是CRI-O（即容器运行时接口CRI和开放容器计划OCI）项目的一部分，后来被分离成一个单独的项目叫libpod。其可在大多数Linux平台上使用，它是一种无守护程序的容器引擎，用于在Linux系统上开发，管理和运行任何符合Open Container Initiative（OCI）标准的容器和容器镜像。</p><p>Podman提供了一个与docker兼容的命令前端，Podman里面87%的指令都和docker cli相同，因此可以简单地为docker cli别名，即“alias docker &#x3D; podman”，事实上，podman使用的一些库也是docker的一部分。</p><h4 id="Podman和docker不同之处"><a href="#Podman和docker不同之处" class="headerlink" title="Podman和docker不同之处"></a>Podman和docker不同之处</h4><ul><li><p>docker需要在系统上运行一个守护进程（docker daemon），这会产生一定的开销，而podman不需要</p></li><li><p>启动容器的方式不同：</p><p>​    docker cli 命令通过 API 跟 docker engine（引擎）交互告诉它我想创建一个 container，然后 docker engine  才会调用 OCI containner runtime（runc） 来启动一个container。这代表container的process（进程）不会是docker cli 的chlid process（子进程）而是Docker Engine 的 child process。</p><p>Podman是直接给OCI container runtime（runc）进行交互来创建container的，所以container process 直接是podman的child process。</p></li><li><p>因为docker有docker daemon，所以docker启动的容器支持 –restart策略，但是podman不支持</p></li><li><p>docker需要使用root用户来创建容器，这可能会产生安全风向，尤其是当用户知道docker run命令的 –privileged选项时。podman既可以由root用户运行，也可以由非特权用户运行</p></li><li><p>docker在Linux上作为守护进程运行扼杀了容器社区的创新。如果要更改容器的工作方式，则需要更改docker守护程序并将这些更改推送到上游。没有守护进程，容器基础结构更加模块化，更容易进行更改。podman的无守护进程架构更加灵活和安全。</p></li></ul><h3 id="Docker的优势"><a href="#Docker的优势" class="headerlink" title="Docker的优势"></a>Docker的优势</h3><ul><li>快速部署：短时间内可以部署成百上千个应用，更快速交付到线上</li><li>高效虚拟化：不需要额外hypervisor支持，基于Linux内核实现应用虚拟化，相比虚拟机大幅提高性能和效率</li><li>节省开支：提高服务器利用率，降低IT支持</li><li>简化配置：将运行环境打包保存至容器，使用时直接启动即可</li><li>环境统一：将开发，测试，生产的应用运行环境进行标准化统一，减少环境不一样带来的各种问题</li><li>快速迁移和扩展：可实现跨平台运行物理机、虚拟机、公有云等环境，良好的兼容性可以方便将应用从A宿主机迁移到B宿主机，甚至是A平台迁移到B平台</li><li>更好的实现面向服务的架构，推荐一个容器只运行一个应用，实现分布的应用模型，可以方便的进行横向扩展，符合开发中高内聚，低耦合的要求，减少不同服务器之间的相互影响</li></ul><h3 id="Docker的缺点"><a href="#Docker的缺点" class="headerlink" title="Docker的缺点"></a>Docker的缺点</h3><ul><li>多个容器共用宿主机的内核，各应用之间的隔离不如虚拟机彻底</li><li>由于和宿主机之间的进程也是隔离的，需要进入容器查看和调试容器内进程等资源，变得比较困难和繁琐</li><li>如果容器内进程需要查看和调试，需要在每个容器内都需要安装相应的工具，这也造成存储空间的重复浪费</li></ul><h3 id="容器的核心技术"><a href="#容器的核心技术" class="headerlink" title="容器的核心技术"></a>容器的核心技术</h3><h4 id="容器规范"><a href="#容器规范" class="headerlink" title="容器规范"></a>容器规范</h4><p>OCI官网：<a href="https://opencontainers.org/">https://opencontainers.org</a></p><p>容器技术除了docker之外，还有coreOS的rkt，还有阿里的Pouch，为了保证容器生态的标准性和健康可持续发展，包括Linux基金会、Docker、微软、红帽、谷歌和IBM等公司在2015年6月共同成立了一个叫Open Container Initiative（OCI）的组织，其目的就是制定开放的标准的容器规范，目前OCI一共发布了两个规范，分别是runtime spec和image format spec，有了这两个规范，不同的容器公司开发的容器只要兼容这两个规范，就可以保证容器的可移植性和相互可操作性性。</p><h4 id="容器runtime"><a href="#容器runtime" class="headerlink" title="容器runtime"></a>容器runtime</h4><p>runtime是真正运行容器的地方，因此为了运行不同的容器runtime需要和操作系统内核紧密合作相互在支持，以便为容器提供相应的运行环境</p><p>runtime类型：</p><ul><li>LXC：Linux上早期的runtime，在2013年docker刚发布的时候，就是采用lxc作为runtime，docker把lxc复杂的容器创建与使用方式简化为docker自己的一套命令体系。随着docker的发展，原有的lxc不能满足docker的需求，比如跨平台功能</li><li>Libcontainer：随着docker的不断发展，重新定义容器的实现标准，将底层实现都抽象化到Libcontainer的接口。这就意味着，底层容器的实现方式变成了一种可变的方案，无论是使用namespace、cgroups技术抑或是使用systemd等其他方案，只要实现了Lincontainer定义的一组接口，docker都可以运行。这也为docker实现全面的跨平台带来了可能。</li><li>runc：早期libcontainer是docker公司控制的一个开源项目，OCI的成立后，docker把libcontainer项目移交给了OCI组织，runc就是在libcontainer的基础上进化而来，是目前docker默认的runtime，runc遵守OCI规范</li><li>rkt：是CoreOS开发的容器runtime，也符合OCI规范，所以使用rktruntime也可以运行docker容器</li></ul><h4 id="容器管理工具-1"><a href="#容器管理工具-1" class="headerlink" title="容器管理工具"></a>容器管理工具</h4><p>管理工具连接runtime与用户，对用户提供图形或命令方式操作，然后管理工具将用户操作传递给runtime执行。</p><ul><li>lxc是lxd的管理工具</li><li>Runc的管理工具是docker engine，docker engine包含后台deamon和cli两部分，大家经常提到的docker就是指的docker engine</li><li>rkt的管理工具是 rkt cli</li></ul><h4 id="容器定义工具"><a href="#容器定义工具" class="headerlink" title="容器定义工具"></a>容器定义工具</h4><p>容器定义工具允许用户定义容器的属性和内容，以方便容器能够被保存、共享和重建。</p><p>Docker image：是docker容器的模板，runtime依据docker image创建容器</p><p>Dockerfile：包含N个命令的文本文件，通过dockerfile创建出docker image</p><p>ACI（App container image）：与docker image类似，是CoreOS开发的rkt容器的镜像格式</p><h4 id="镜像仓库"><a href="#镜像仓库" class="headerlink" title="镜像仓库"></a>镜像仓库</h4><p>统一保存镜像而且是多个不同镜像版本的地方，叫做镜像仓库</p><ul><li>Docker hub：docker官方的公共仓库，已经保存了大量的常用镜像，可以方便大家直接使用</li><li>阿里云，网易等第三方镜像的公共仓库</li><li>Image registry：docker官方提供的私有仓库部署工具，无web管理界面，目前使用较少</li><li>Harbor：vmware提供自带web界面自带认证功能的镜像私有仓库，目前有很多公司使用</li></ul><h4 id="容器编排工具"><a href="#容器编排工具" class="headerlink" title="容器编排工具"></a>容器编排工具</h4><p>当多个容器在多个主机运行的时候，单独管理容器是相当复杂而且很容易出错，而且也无法实现某一台主机宕机后容器自动迁移到其他主机从而实现高可用的目的，也无法实现动态伸缩功能，因此需要有一种工具可以实现统一管理、动态伸缩、故障自愈、批量执行等功能，这就是容器编排引擎</p><p>容器编排通常包括容器管理、调度、集群定义和服务发现等功能</p><ul><li>Docker compose：docker官方实现单机容器的编排工具</li><li>Docker swarm：docker官方开发的容器编排引擎，支持overlay network</li><li>Mesos+Marathon：Mesos是Apache下的开源分布式资源管理框架，它被称为是分布式系统的内核。Mesos最初是由加州大学伯克利分校的AMPLab开发的，后在Twitter得到广泛使用。通用的集群组员调度平台，Mesos（资源分配）与marathon（容器编排平台）一起提供容器编排引擎功能</li><li>Kubernetes：Google领导开发的容器编排引擎，内部项目为Borg，且其同时支持docker和CoreOS，当前已成为容器编排工具的标准</li></ul><h4 id="docker依赖的技术"><a href="#docker依赖的技术" class="headerlink" title="docker依赖的技术"></a>docker依赖的技术</h4><h5 id="容器网络"><a href="#容器网络" class="headerlink" title="容器网络"></a>容器网络</h5><p>docker自带的网络docker network仅支持管理单机的容器网络，当多主机运行的时候需要使用第三方开源网络，例如：calico、flannel等</p><h5 id="服务发现"><a href="#服务发现" class="headerlink" title="服务发现"></a>服务发现</h5><p>容器的动态扩容特性决定了容器IP也会随之变化，因此需要有一种机制开源自动识别并将用户请求动态转发到新创建的容器上，Kubernetes自带服务发现功能，需要结合kube-dns服务解析内部域名</p><h5 id="容器监控"><a href="#容器监控" class="headerlink" title="容器监控"></a>容器监控</h5><p>可以通过原生命令docker ps&#x2F;top&#x2F;stats查看容器运行状态，另外可以使用prometheus、heapster等第三方监控工具监控容器的运行状态</p><h5 id="数据管理"><a href="#数据管理" class="headerlink" title="数据管理"></a>数据管理</h5><p>容器的动态迁移会导致其在不同的host之前迁移，因此如何保证与容器相关的数据也能随之迁移或随时访问，可以使用逻辑卷&#x2F;存储挂载等方式解决</p><h5 id="日志收集"><a href="#日志收集" class="headerlink" title="日志收集"></a>日志收集</h5><p>docker原生的日志查看工具docker logs，但是容器内部的日志需要通过ELK等专门的日志收集分析和展示工具进行处理</p><h2 id="Docker安装及基础命令介绍"><a href="#Docker安装及基础命令介绍" class="headerlink" title="Docker安装及基础命令介绍"></a>Docker安装及基础命令介绍</h2><h3 id="Docker安装准备"><a href="#Docker安装准备" class="headerlink" title="Docker安装准备"></a>Docker安装准备</h3><p><a href="https://www.docker.com/">https://www.docker.com</a></p><p><strong>OS版本的选择：</strong></p><p>docker目前支持多种操作系统的安装运行，如Centos，Ubuntu，Redhat，Debian，Fedora，Mac，Windows，在Linux系统上需要内核版本在3.10或以上</p><p><strong>docker版本选择：</strong></p><p>docker版本号之前一直是0.x版本或1.x版本，从2017年3月1号开始改为每个季度发布一次稳定版，其版本号规则也统一变更为YY.MM，例如20.10表示2020年10月发布的</p><p>docker之前没有区分版本，但是2017年推出（将docker更名为）新的项目Moby，github地址：<a href="https://github.com/moby/moby">https://github.com/moby/moby</a> ，Moby项目属于Docker项目全新上游，docker将是一个隶属于Moby的子产品，而且之后的版本开始区分CE（Docker Community Edition，社区版本）和EE（Docker Enterprise Edition，企业收费版）,CE社区版和EE企业版都是每个季度发布一个新版本，但是EE版提供后期安全维护1年，而CE版是4个月。</p><h3 id="安装和删除方法"><a href="#安装和删除方法" class="headerlink" title="安装和删除方法"></a>安装和删除方法</h3><p>官方文档：<a href="https://docs.docker.com/engine/install/">https://docs.docker.com/engine/install/</a></p><p>阿里云文档：<a href="https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b11guHCWE">https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b11guHCWE</a></p><h4 id="Centos安装和删除docker"><a href="#Centos安装和删除docker" class="headerlink" title="Centos安装和删除docker"></a>Centos安装和删除docker</h4><p>官方文档：<a href="https://docs.docker.com/engine/install/centos/">https://docs.docker.com/engine/install/centos/</a></p><p>CentOS 6 因内核太旧，即使支持安装docker，但会有各种问题，不建议安装</p><p>CentOS 7的extras源虽然可以安装docker，但包比较旧，建议从官方源或镜像源站点下载安装docker</p><p>CentOS 8 有新技术podman代替docker</p><p>因此建议在CentOS 7 上安装 docker</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">extras 源中包名为docker</span></span><br><span class="line">[root@centos7 ~]# yum list docker</span><br><span class="line">已加载插件：fastestmirror</span><br><span class="line">Loading mirror speeds from cached hostfile</span><br><span class="line"> * base: mirrors.bupt.edu.cn</span><br><span class="line"> * extras: mirrors.neusoft.edu.cn</span><br><span class="line"> * updates: mirrors.nju.edu.cn</span><br><span class="line">可安装的软件包</span><br><span class="line">docker.x86_64                                 2:1.13.1-209.git7d71120.el7.centos                                  extras</span><br></pre></td></tr></table></figure><h5 id="下载rpm包安装"><a href="#下载rpm包安装" class="headerlink" title="下载rpm包安装"></a>下载rpm包安装</h5><p>官方rpm包下载地址：<a href="https://download.docker.com/linux/centos/7/x86_64/stable/Packages/">https://download.docker.com/linux/centos/7/x86_64/stable/Packages/</a></p><p>阿里镜像下载地址：<a href="https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/">https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/</a></p><h5 id="通过yum源安装："><a href="#通过yum源安装：" class="headerlink" title="通过yum源安装："></a>通过yum源安装：</h5><p>由于官网yum源太慢，下面使用阿里云的yum源进行安装</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">rm -rf /etc/yum.repos.d/*</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">centos 7 安装docker依赖三个yum源：Base，Extras，docker-ce</span></span><br><span class="line">wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo</span><br><span class="line">wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo</span><br><span class="line">wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</span><br><span class="line"></span><br><span class="line">yum clean all</span><br><span class="line">yum install docker-ce -y</span><br><span class="line">systemctl enable --now docker</span><br></pre></td></tr></table></figure><h5 id="删除docker"><a href="#删除docker" class="headerlink" title="删除docker"></a>删除docker</h5><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">yum remove docker-ce</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">删除docker资源存放的相关文件</span></span><br><span class="line">rm -ef /var/lib/docker</span><br></pre></td></tr></table></figure><h4 id="Docker-程序环境"><a href="#Docker-程序环境" class="headerlink" title="Docker 程序环境"></a>Docker 程序环境</h4><p>Centos7 查看docker相关文件</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos ~]# rpm -ql docker-ce</span><br><span class="line">/usr/bin/docker-init</span><br><span class="line">/usr/bin/docker-proxy</span><br><span class="line">/usr/bin/dockerd</span><br><span class="line">/usr/lib/systemd/system/docker.service</span><br><span class="line">/usr/lib/systemd/system/docker.socket</span><br><span class="line">[root@centos ~]#</span><br><span class="line">[root@centos ~]# rpm -ql docker-ce</span><br><span class="line">/usr/bin/docker-init</span><br><span class="line">/usr/bin/docker-proxy</span><br><span class="line">/usr/bin/dockerd</span><br><span class="line">/usr/lib/systemd/system/docker.service</span><br><span class="line">/usr/lib/systemd/system/docker.socket</span><br><span class="line">[root@centos ~]#</span><br><span class="line">[root@centos ~]# rpm -ql docker-ce-cli</span><br><span class="line">/usr/bin/docker</span><br><span class="line">/usr/libexec/docker/cli-plugins/docker-app</span><br><span class="line">/usr/libexec/docker/cli-plugins/docker-buildx</span><br><span class="line">/usr/share/bash-completion/completions/docker</span><br><span class="line">/usr/share/doc/docker-ce-cli-20.10.17</span><br><span class="line">/usr/share/doc/docker-ce-cli-20.10.17/LICENSE</span><br><span class="line">/usr/share/doc/docker-ce-cli-20.10.17/MAINTAINERS</span><br><span class="line">/usr/share/doc/docker-ce-cli-20.10.17/NOTICE</span><br><span class="line">/usr/share/doc/docker-ce-cli-20.10.17/README.md</span><br><span class="line">/usr/share/fish/vendor_completions.d/docker.fish</span><br><span class="line">/usr/share/man/man1/docker-attach.1.gz</span><br><span class="line">/usr/share/man/man1/docker-build.1.gz</span><br><span class="line">/usr/share/man/man1/docker-builder-build.1.gz</span><br><span class="line">/usr/share/man/man1/docker-builder-prune.1.gz</span><br><span class="line">/usr/share/man/man1/docker-builder.1.gz</span><br><span class="line">/usr/share/man/man1/docker-checkpoint-create.1.gz</span><br><span class="line">/usr/share/man/man1/docker-checkpoint-ls.1.gz</span><br><span class="line">/usr/share/man/man1/docker-checkpoint-rm.1.gz</span><br><span class="line">/usr/share/man/man1/docker-checkpoint.1.gz</span><br><span class="line">/usr/share/man/man1/docker-commit.1.gz</span><br><span class="line">/usr/share/man/man1/docker-config-create.1.gz</span><br><span class="line">/usr/share/man/man1/docker-config-inspect.1.gz</span><br><span class="line">/usr/share/man/man1/docker-config-ls.1.gz</span><br><span class="line">/usr/share/man/man1/docker-config-rm.1.gz</span><br><span class="line">/usr/share/man/man1/docker-config.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-attach.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-commit.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-cp.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-create.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-diff.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-exec.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-export.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-inspect.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-kill.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-logs.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-ls.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-pause.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-port.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-prune.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-rename.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-restart.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-rm.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-run.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-start.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-stats.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-stop.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-top.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-unpause.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-update.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container-wait.1.gz</span><br><span class="line">/usr/share/man/man1/docker-container.1.gz</span><br><span class="line">/usr/share/man/man1/docker-context-create.1.gz</span><br><span class="line">/usr/share/man/man1/docker-context-export.1.gz</span><br><span class="line">/usr/share/man/man1/docker-context-import.1.gz</span><br><span class="line">/usr/share/man/man1/docker-context-inspect.1.gz</span><br><span class="line">/usr/share/man/man1/docker-context-ls.1.gz</span><br><span class="line">/usr/share/man/man1/docker-context-rm.1.gz</span><br><span class="line">/usr/share/man/man1/docker-context-update.1.gz</span><br><span class="line">/usr/share/man/man1/docker-context-use.1.gz</span><br><span class="line">/usr/share/man/man1/docker-context.1.gz</span><br><span class="line">/usr/share/man/man1/docker-cp.1.gz</span><br><span class="line">/usr/share/man/man1/docker-create.1.gz</span><br><span class="line">/usr/share/man/man1/docker-diff.1.gz</span><br><span class="line">/usr/share/man/man1/docker-events.1.gz</span><br><span class="line">/usr/share/man/man1/docker-exec.1.gz</span><br><span class="line">/usr/share/man/man1/docker-export.1.gz</span><br><span class="line">/usr/share/man/man1/docker-history.1.gz</span><br><span class="line">/usr/share/man/man1/docker-image-build.1.gz</span><br><span class="line">/usr/share/man/man1/docker-image-history.1.gz</span><br><span class="line">/usr/share/man/man1/docker-image-import.1.gz</span><br><span class="line">/usr/share/man/man1/docker-image-inspect.1.gz</span><br><span class="line">/usr/share/man/man1/docker-image-load.1.gz</span><br><span class="line">/usr/share/man/man1/docker-image-ls.1.gz</span><br><span class="line">/usr/share/man/man1/docker-image-prune.1.gz</span><br><span class="line">/usr/share/man/man1/docker-image-pull.1.gz</span><br><span class="line">/usr/share/man/man1/docker-image-push.1.gz</span><br><span class="line">/usr/share/man/man1/docker-image-rm.1.gz</span><br><span class="line">/usr/share/man/man1/docker-image-save.1.gz</span><br><span class="line">/usr/share/man/man1/docker-image-tag.1.gz</span><br><span class="line">/usr/share/man/man1/docker-image.1.gz</span><br><span class="line">/usr/share/man/man1/docker-images.1.gz</span><br><span class="line">/usr/share/man/man1/docker-import.1.gz</span><br><span class="line">/usr/share/man/man1/docker-info.1.gz</span><br><span class="line">/usr/share/man/man1/docker-inspect.1.gz</span><br><span class="line">/usr/share/man/man1/docker-kill.1.gz</span><br><span class="line">/usr/share/man/man1/docker-load.1.gz</span><br><span class="line">/usr/share/man/man1/docker-login.1.gz</span><br><span class="line">/usr/share/man/man1/docker-logout.1.gz</span><br><span class="line">/usr/share/man/man1/docker-logs.1.gz</span><br><span class="line">/usr/share/man/man1/docker-manifest-annotate.1.gz</span><br><span class="line">/usr/share/man/man1/docker-manifest-create.1.gz</span><br><span class="line">/usr/share/man/man1/docker-manifest-inspect.1.gz</span><br><span class="line">/usr/share/man/man1/docker-manifest-push.1.gz</span><br><span class="line">/usr/share/man/man1/docker-manifest-rm.1.gz</span><br><span class="line">/usr/share/man/man1/docker-manifest.1.gz</span><br><span class="line">/usr/share/man/man1/docker-network-connect.1.gz</span><br><span class="line">/usr/share/man/man1/docker-network-create.1.gz</span><br><span class="line">/usr/share/man/man1/docker-network-disconnect.1.gz</span><br><span class="line">/usr/share/man/man1/docker-network-inspect.1.gz</span><br><span class="line">/usr/share/man/man1/docker-network-ls.1.gz</span><br><span class="line">/usr/share/man/man1/docker-network-prune.1.gz</span><br><span class="line">/usr/share/man/man1/docker-network-rm.1.gz</span><br><span class="line">/usr/share/man/man1/docker-network.1.gz</span><br><span class="line">/usr/share/man/man1/docker-node-demote.1.gz</span><br><span class="line">/usr/share/man/man1/docker-node-inspect.1.gz</span><br><span class="line">/usr/share/man/man1/docker-node-ls.1.gz</span><br><span class="line">/usr/share/man/man1/docker-node-promote.1.gz</span><br><span class="line">/usr/share/man/man1/docker-node-ps.1.gz</span><br><span class="line">/usr/share/man/man1/docker-node-rm.1.gz</span><br><span class="line">/usr/share/man/man1/docker-node-update.1.gz</span><br><span class="line">/usr/share/man/man1/docker-node.1.gz</span><br><span class="line">/usr/share/man/man1/docker-pause.1.gz</span><br><span class="line">/usr/share/man/man1/docker-plugin-create.1.gz</span><br><span class="line">/usr/share/man/man1/docker-plugin-disable.1.gz</span><br><span class="line">/usr/share/man/man1/docker-plugin-enable.1.gz</span><br><span class="line">/usr/share/man/man1/docker-plugin-inspect.1.gz</span><br><span class="line">/usr/share/man/man1/docker-plugin-install.1.gz</span><br><span class="line">/usr/share/man/man1/docker-plugin-ls.1.gz</span><br><span class="line">/usr/share/man/man1/docker-plugin-push.1.gz</span><br><span class="line">/usr/share/man/man1/docker-plugin-rm.1.gz</span><br><span class="line">/usr/share/man/man1/docker-plugin-set.1.gz</span><br><span class="line">/usr/share/man/man1/docker-plugin-upgrade.1.gz</span><br><span class="line">/usr/share/man/man1/docker-plugin.1.gz</span><br><span class="line">/usr/share/man/man1/docker-port.1.gz</span><br><span class="line">/usr/share/man/man1/docker-ps.1.gz</span><br><span class="line">/usr/share/man/man1/docker-pull.1.gz</span><br><span class="line">/usr/share/man/man1/docker-push.1.gz</span><br><span class="line">/usr/share/man/man1/docker-rename.1.gz</span><br><span class="line">/usr/share/man/man1/docker-restart.1.gz</span><br><span class="line">/usr/share/man/man1/docker-rm.1.gz</span><br><span class="line">/usr/share/man/man1/docker-rmi.1.gz</span><br><span class="line">/usr/share/man/man1/docker-run.1.gz</span><br><span class="line">/usr/share/man/man1/docker-save.1.gz</span><br><span class="line">/usr/share/man/man1/docker-search.1.gz</span><br><span class="line">/usr/share/man/man1/docker-secret-create.1.gz</span><br><span class="line">/usr/share/man/man1/docker-secret-inspect.1.gz</span><br><span class="line">/usr/share/man/man1/docker-secret-ls.1.gz</span><br><span class="line">/usr/share/man/man1/docker-secret-rm.1.gz</span><br><span class="line">/usr/share/man/man1/docker-secret.1.gz</span><br><span class="line">/usr/share/man/man1/docker-service-create.1.gz</span><br><span class="line">/usr/share/man/man1/docker-service-inspect.1.gz</span><br><span class="line">/usr/share/man/man1/docker-service-logs.1.gz</span><br><span class="line">/usr/share/man/man1/docker-service-ls.1.gz</span><br><span class="line">/usr/share/man/man1/docker-service-ps.1.gz</span><br><span class="line">/usr/share/man/man1/docker-service-rm.1.gz</span><br><span class="line">/usr/share/man/man1/docker-service-rollback.1.gz</span><br><span class="line">/usr/share/man/man1/docker-service-scale.1.gz</span><br><span class="line">/usr/share/man/man1/docker-service-update.1.gz</span><br><span class="line">/usr/share/man/man1/docker-service.1.gz</span><br><span class="line">/usr/share/man/man1/docker-stack-deploy.1.gz</span><br><span class="line">/usr/share/man/man1/docker-stack-ls.1.gz</span><br><span class="line">/usr/share/man/man1/docker-stack-ps.1.gz</span><br><span class="line">/usr/share/man/man1/docker-stack-rm.1.gz</span><br><span class="line">/usr/share/man/man1/docker-stack-services.1.gz</span><br><span class="line">/usr/share/man/man1/docker-stack.1.gz</span><br><span class="line">/usr/share/man/man1/docker-start.1.gz</span><br><span class="line">/usr/share/man/man1/docker-stats.1.gz</span><br><span class="line">/usr/share/man/man1/docker-stop.1.gz</span><br><span class="line">/usr/share/man/man1/docker-swarm-ca.1.gz</span><br><span class="line">/usr/share/man/man1/docker-swarm-init.1.gz</span><br><span class="line">/usr/share/man/man1/docker-swarm-join-token.1.gz</span><br><span class="line">/usr/share/man/man1/docker-swarm-join.1.gz</span><br><span class="line">/usr/share/man/man1/docker-swarm-leave.1.gz</span><br><span class="line">/usr/share/man/man1/docker-swarm-unlock-key.1.gz</span><br><span class="line">/usr/share/man/man1/docker-swarm-unlock.1.gz</span><br><span class="line">/usr/share/man/man1/docker-swarm-update.1.gz</span><br><span class="line">/usr/share/man/man1/docker-swarm.1.gz</span><br><span class="line">/usr/share/man/man1/docker-system-df.1.gz</span><br><span class="line">/usr/share/man/man1/docker-system-events.1.gz</span><br><span class="line">/usr/share/man/man1/docker-system-info.1.gz</span><br><span class="line">/usr/share/man/man1/docker-system-prune.1.gz</span><br><span class="line">/usr/share/man/man1/docker-system.1.gz</span><br><span class="line">/usr/share/man/man1/docker-tag.1.gz</span><br><span class="line">/usr/share/man/man1/docker-top.1.gz</span><br><span class="line">/usr/share/man/man1/docker-trust-inspect.1.gz</span><br><span class="line">/usr/share/man/man1/docker-trust-key-generate.1.gz</span><br><span class="line">/usr/share/man/man1/docker-trust-key-load.1.gz</span><br><span class="line">/usr/share/man/man1/docker-trust-key.1.gz</span><br><span class="line">/usr/share/man/man1/docker-trust-revoke.1.gz</span><br><span class="line">/usr/share/man/man1/docker-trust-sign.1.gz</span><br><span class="line">/usr/share/man/man1/docker-trust-signer-add.1.gz</span><br><span class="line">/usr/share/man/man1/docker-trust-signer-remove.1.gz</span><br><span class="line">/usr/share/man/man1/docker-trust-signer.1.gz</span><br><span class="line">/usr/share/man/man1/docker-trust.1.gz</span><br><span class="line">/usr/share/man/man1/docker-unpause.1.gz</span><br><span class="line">/usr/share/man/man1/docker-update.1.gz</span><br><span class="line">/usr/share/man/man1/docker-version.1.gz</span><br><span class="line">/usr/share/man/man1/docker-volume-create.1.gz</span><br><span class="line">/usr/share/man/man1/docker-volume-inspect.1.gz</span><br><span class="line">/usr/share/man/man1/docker-volume-ls.1.gz</span><br><span class="line">/usr/share/man/man1/docker-volume-prune.1.gz</span><br><span class="line">/usr/share/man/man1/docker-volume-rm.1.gz</span><br><span class="line">/usr/share/man/man1/docker-volume.1.gz</span><br><span class="line">/usr/share/man/man1/docker-wait.1.gz</span><br><span class="line">/usr/share/man/man1/docker.1.gz</span><br><span class="line">/usr/share/man/man5/Dockerfile.5.gz</span><br><span class="line">/usr/share/man/man5/docker-config-json.5.gz</span><br><span class="line">/usr/share/man/man8/dockerd.8.gz</span><br><span class="line">/usr/share/zsh/vendor-completions/_docker</span><br></pre></td></tr></table></figure><h4 id="Docker-命令帮助"><a href="#Docker-命令帮助" class="headerlink" title="Docker 命令帮助"></a>Docker 命令帮助</h4><p>官方文档：<a href="https://docs.docker.com/reference/">https://docs.docker.com/reference/</a></p><p>docker命令是最常使用的docker客户端命令，其后面可以加不同的参数以实现不同的功能</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker 命令格式</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">COMMAND 分为</span> </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Management Commands 指定管理员的资源对象类型，较新的命令用法，将命令按资源类型进行分类，方便使用</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Commands 对不同资源操作的命令不分类，使用容易产生混乱</span></span><br><span class="line">docker [OPTIONS] COMMAND</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker 命令有很多子命令，可以用下面方法查看帮助</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker 命令帮助</span></span><br><span class="line">man docker</span><br><span class="line">docker</span><br><span class="line">docker --help</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker 子命令帮助</span></span><br><span class="line">man docker -COMMAND</span><br><span class="line">docker COMMAND --help</span><br></pre></td></tr></table></figure><h4 id="查看docker相关信息"><a href="#查看docker相关信息" class="headerlink" title="查看docker相关信息"></a>查看docker相关信息</h4><h5 id="查看docker版本"><a href="#查看docker版本" class="headerlink" title="查看docker版本"></a>查看docker版本</h5><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos ~]# docker version</span><br><span class="line">Client: Docker Engine - Community</span><br><span class="line"> Version:           20.10.17</span><br><span class="line"> API version:       1.41</span><br><span class="line"> Go version:        go1.17.11</span><br><span class="line"> Git commit:        100c701</span><br><span class="line"> Built:             Mon Jun  6 23:05:12 2022</span><br><span class="line"> OS/Arch:           linux/amd64</span><br><span class="line"> Context:           default</span><br><span class="line"> Experimental:      true</span><br><span class="line"></span><br><span class="line">Server: Docker Engine - Community</span><br><span class="line"> Engine:</span><br><span class="line">  Version:          20.10.17</span><br><span class="line">  API version:      1.41 (minimum version 1.12)</span><br><span class="line">  Go version:       go1.17.11</span><br><span class="line">  Git commit:       a89b842</span><br><span class="line">  Built:            Mon Jun  6 23:03:33 2022</span><br><span class="line">  OS/Arch:          linux/amd64</span><br><span class="line">  Experimental:     false</span><br><span class="line"> containerd:</span><br><span class="line">  Version:          1.6.7</span><br><span class="line">  GitCommit:        0197261a30bf81f1ee8e6a4dd2dea0ef95d67ccb</span><br><span class="line"> runc:</span><br><span class="line">  Version:          1.1.3</span><br><span class="line">  GitCommit:        v1.1.3-0-g6724737</span><br><span class="line"> docker-init:</span><br><span class="line">  Version:          0.19.0</span><br><span class="line">  GitCommit:        de40ad0</span><br></pre></td></tr></table></figure><h5 id="查看docker详细信息"><a href="#查看docker详细信息" class="headerlink" title="查看docker详细信息"></a>查看docker详细信息</h5><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos ~]# docker info</span><br><span class="line">Client:</span><br><span class="line"> Context:    default</span><br><span class="line"> Debug Mode: false # client端是否开启debug</span><br><span class="line"> Plugins:</span><br><span class="line">  app: Docker App (Docker Inc., v0.9.1-beta3)</span><br><span class="line">  buildx: Docker Buildx (Docker Inc., v0.8.2-docker)</span><br><span class="line">  scan: Docker Scan (Docker Inc., v0.17.0)</span><br><span class="line"></span><br><span class="line">Server:</span><br><span class="line"> Containers: 0 # 当前主机运行的容器总数</span><br><span class="line">  Running: 0 # 正在运行的容器个数</span><br><span class="line">  Paused: 0   # 暂停的容器个数</span><br><span class="line">  Stopped: 0   # 停止的容器个数</span><br><span class="line"> Images: 0     # 当前服务器的镜像个数</span><br><span class="line"> Server Version: 20.10.17    # 服务端版本</span><br><span class="line"> Storage Driver: overlay2    # 正在使用的存储引擎</span><br><span class="line">  Backing Filesystem: xfs    # 后端文件系统，即服务器的磁盘文件系统</span><br><span class="line">  Supports d_type: true      # 是否支持 d_type</span><br><span class="line">  Native Overlay Diff: true  # 是否支持差异数据存储</span><br><span class="line">  userxattr: false</span><br><span class="line"> Logging Driver: json-file   # 日志类型</span><br><span class="line"> Cgroup Driver: cgroupfs # Cgroups类型</span><br><span class="line"> Cgroup Version: 1</span><br><span class="line"> Plugins: # 插件</span><br><span class="line">  Volume: local # 卷</span><br><span class="line">  Network: bridge host ipvlan macvlan null overlay    # overlay 跨主机通信</span><br><span class="line">  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog # 日志类型</span><br><span class="line"> Swarm: inactive # 是否支持 swarm</span><br><span class="line"> Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc</span><br><span class="line"> Default Runtime: runc       # 默认使用的容器运行时</span><br><span class="line"> Init Binary: docker-init    # 初始化容器的守护进程，即pid为1的进程</span><br><span class="line"> containerd version: 0197261a30bf81f1ee8e6a4dd2dea0ef95d67ccb # 版本</span><br><span class="line"> runc version: v1.1.3-0-g6724737# runc版本</span><br><span class="line"> init version: de40ad0 # init 版本</span><br><span class="line"> Security Options:           # 安全选项</span><br><span class="line">  seccomp                    # 安全计算模块，即制容器操作</span><br><span class="line">   Profile: default # 默认的配置文件</span><br><span class="line"> Kernel Version: 3.10.0-693.el7.x86_64    # 宿主机内核版本</span><br><span class="line"> Operating System: CentOS Linux 7 (Core)  # 宿主机操作系统</span><br><span class="line"> OSType: linux# 宿主机操作系统类型</span><br><span class="line"> Architecture: x86_64# 宿主机架构</span><br><span class="line"> CPUs: 2# 宿主机CPU数量</span><br><span class="line"> Total Memory: 1.792GiB# 宿主机总内存</span><br><span class="line"> Name: centos# 宿主机 hostname</span><br><span class="line"> ID: E66M:LPI3:YB2Z:LJKN:LNB2:P7Z3:6HYX:DSFF:KISM:SSJX:PVIF:B2ZM  # 宿主机 ID</span><br><span class="line"> Docker Root Dir: /var/lib/docker# 宿主机关于docker数据的保存目录</span><br><span class="line"> Debug Mode: false# server 端是否开启debug</span><br><span class="line"> Registry: https://index.docker.io/v1/# 仓库路径</span><br><span class="line"> Labels:</span><br><span class="line"> Experimental: false# 是否是测试版</span><br><span class="line"> Insecure Registries:</span><br><span class="line">  127.0.0.0/8# 非安全的镜像库</span><br><span class="line"> Live Restore Enabled: false            # 是否开启活动重启 （重启docker-daemon 不关闭容器）</span><br></pre></td></tr></table></figure><h5 id="查看docker0网卡"><a href="#查看docker0网卡" class="headerlink" title="查看docker0网卡"></a>查看docker0网卡</h5><p>在docker安装启动后，默认会生成一个名称为docker0的网卡且默认IP地址为172.17.0.1</p><h5 id="Docker存储引擎"><a href="#Docker存储引擎" class="headerlink" title="Docker存储引擎"></a>Docker存储引擎</h5><ul><li><p>AUFS是一种UnionFs，是文件级的存储驱动。Aufs是之前的UnionFS的重新实现，2006年由JunjiroOkajima开发，所谓UnionFS就是把不同物理位置的目录合并mount到同一个目录中。简单来说就是支持将不同目录挂载到一个虚拟文件系统下。这种可以层层地叠加修改文件。无论底下有多少都是只读的，最上系统可写的。当需要修改一个文件时，AUFS常见该文件的一个副本，使用CoW将文件从只读层复制到可写进行修改，结果也保存在Docker中，底下的只读层就是image，可写层就是Container。</p><p>aufs被拒绝合并到主线Linux。其代码被批评为“dense，unreadable，uncommented 密集、不可读、未注释”。相反，OverlayFS被合并到Linux内核中。在多次尝试将aufs合并到主线内核失败后，作者放弃了</p><p>AUFS是docker18.06及更早版本的首选存储驱动程序，在内核3.13上运行ubuntu14.04时不支持overlay2</p></li><li><p>Overlay：一种UnionFS文件系统，Linux内核3.18后支持</p></li><li><p>Overlay2：Overlay的升级版，到目前为止，所有Linux发行版推荐使用的存储类型，也是docker默认使用的存储引擎为overlay2，需要磁盘分区支持d-type功能，因此需要系统磁盘的额外支持，相对AUFS来说Overlay2有以下优势：更简单的设计；从3.18开始就进入了Linux内核主线；资源消耗更少</p></li><li><p>devicemapper：因为Centos7.2和RHEL7.2的之前版本内核版本不支持overlay2，默认使用的存储驱动程序，最大数据容量只支持100G且性能不佳，当前较新版本的CentOS已经支持overlay2，因此推荐使用overlay2，另外此存储引擎已在Docker Engine 18.09中弃用</p></li><li><p>ZFS（Sun-2005）&#x2F;btrfs（Oracle-2007）：目前没有广泛使用</p></li><li><p>VFS：用于测试环境，适用于无法使用copy-on-write时的情况。此存储驱动程序的性能很差，通常不建议用于生产</p></li></ul><p>Docker官方推荐首选存储引擎为overlay2，其次为devicemapper，但是devicemapper存在使用空间方面的一些限制，虽然可以通过后期配置解决，但是官方依然推荐使用overlay2，以下是生产故障示例：<a href="https://www.cnblogs.com/youruncloud/p/5736718.html">https://www.cnblogs.com/youruncloud/p/5736718.html</a></p><h4 id="docker服务进程"><a href="#docker服务进程" class="headerlink" title="docker服务进程"></a>docker服务进程</h4><p>通过查看docker进程，了解docker的运行及工作方式</p><h5 id="docker的进程关系"><a href="#docker的进程关系" class="headerlink" title="docker的进程关系"></a>docker的进程关系</h5><p>docker相关的四个进程：</p><ul><li>dockerd：服务器程序，被client直接访问，其父进程为宿主机的systemd守护进程</li><li>docker-proxy：每个进程docker-proxy实现对应一个需要网络通信的容器，管理宿主机和容器之间端口映射，其父进程为dockerd，如果容器不需要网络则无需启动</li><li>containerd：被dockerd进程调用以实现与runc交互</li><li>containerd-shim：真正运行容器的载体，每个容器对应一个containerd-shim进程，其父进程为containerd</li></ul><h5 id="容器的创建与管理过程"><a href="#容器的创建与管理过程" class="headerlink" title="容器的创建与管理过程"></a>容器的创建与管理过程</h5><p>通信流程：</p><img src="https://img.chensir.ink/chensir-pics/202208221752652.png" alt="image-20220822175215606" style="zoom:80%;" /><p>1.dockerd通过grpc和containerd模块通信，dockerd由libcontainerd负责和containerd进行交换，docker和containerd通信socket文件：&#x2F;run&#x2F;containerd&#x2F;containerd.sock</p><p>2.containerd在docker启动时被启动，然后containerd启动grpc请求监听，containerd处理grpc请求，根据请求做相应动作</p><p>3.若是run，start或是exec容器，containerd拉起一个container-shim，并进行相应的操作</p><p>4.container-shim被拉起后，start&#x2F;exec&#x2F;create拉起runc进程，通过exit、control文件和containerd通信，通过父子进程关系和SIGCHLD监控容器中进程状态</p><p>5.在整个容器生命周期中，container通过epoll监控容器文件，监控容器事件</p><h5 id="gRPC简介"><a href="#gRPC简介" class="headerlink" title="gRPC简介"></a>gRPC简介</h5><p>官网：<a href="https://www.grpc.io/">https://www.grpc.io</a></p><img src="https://img.chensir.ink/chensir-pics/202208221754939.svg" alt="Concept Diagram" style="zoom:120%;" /><p>gRPC是Google开发的一款高性能、开源和通用的RPC框架，支持众多语言客户端</p><h4 id="Docker-服务管理"><a href="#Docker-服务管理" class="headerlink" title="Docker 服务管理"></a>Docker 服务管理</h4><p>docker服务基于C&#x2F;S结构，可以实现基于本地和远程方式进行管理</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Dockerd守护进程启动选项</span></span><br><span class="line">-H tcp://host:port</span><br><span class="line"> unix:///path/to/socket,</span><br><span class="line"> fd://* or fd://socketfd</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">守护进程默认配置</span></span><br><span class="line">-H unix:///var/run/docker.sock</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">使用Docker客户端命令选项</span></span><br><span class="line">-H tcp://host:port</span><br><span class="line">   unix:///path/to/socket,</span><br><span class="line">   fd://* or fd://socketfd</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">客户端默认配置：</span></span><br><span class="line">-H unix:///var/run/docker.sock</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker客户端也可以使用环境变量DOCKER_HOST,代替 -H选项</span></span><br><span class="line">export DOCKER_HOST=&quot;tcp://docker-server:2375&quot;</span><br></pre></td></tr></table></figure><h2 id="镜像管理"><a href="#镜像管理" class="headerlink" title="镜像管理"></a>镜像管理</h2><h3 id="镜像结构和原理"><a href="#镜像结构和原理" class="headerlink" title="镜像结构和原理"></a>镜像结构和原理</h3><p>镜像即创建容器的模板，含有启动容器所需要的文件系统及所需要的内容，因此镜像主要用于方便和快速的创建启动容器。</p><p>镜像里面是一层层的文件系统，叫做Union FS（联合文件系统），联合文件系统，可以将几层目录挂载到一起（就想千层饼，洋葱头，俄罗斯套娃一样），形成一个虚拟文件系统，虚拟文件系统的目录结构就像普通Linux的目录结构一样，镜像通过这些文件再加上宿主机的内核共同提供了一个Linux的虚拟环境，每一层文件系统叫做一层layer，联合文件系统可以对每一层文件系统设置三种权限，只读（readonly）、读写（readwrite）、和写出（whiteout-able），但是镜像中每一层文件系统都是只读的，构建镜像的时候，从一个最基本的操作系统开始，每个构建提交的操作都相当于做一层的修改，增加了一层文件系统，一层层往上叠加，上层的修改会覆盖底层该位置的可见性，这也很容易理解，就像上层把底层遮住了一样，当使用镜像的时候，我们只会看到一个完全的整体，不知道里面有几层。</p><p>一个典型的Linux文件系统由bootfs和rootfs两部分组成</p><p>bootfs（boot file system）主要包含bootloader和kernel，bootloader主要用于引导加载kernel，Linux刚启动时会加载bootfs文件系统，当boot加载完后，kernel被加载到内存中后接管系统的控制权，bootfs会被umount掉</p><p>rootfs（root file system）包含的就是典型Linux系统中的 &#x2F;dev，&#x2F;proc，&#x2F;bin，&#x2F;etc等标准目录和文件，不同的Linux发行版（如ubuntu 和 CentOS）主要在rootfs这一层会有所区别。</p><p>一般的镜像通常都比较小，官方提供的Ubuntu镜像只有60M多点，而CentOS基础镜像也只有200M左右，一些其他版本的镜像甚至只有几M，比如：busybox 才1.22M，Alpine镜像也只有5M左右。镜像直接调用宿主机的内核，镜像中提供rootfs，也就是只需要包括最基本的命令，配置文件和程序库等相关文件就可以了。</p><h3 id="容器、镜像和父镜像关系"><a href="#容器、镜像和父镜像关系" class="headerlink" title="容器、镜像和父镜像关系"></a>容器、镜像和父镜像关系</h3><p>查看镜像的分层结构</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker pull nginx</span><br><span class="line">Using default tag: latest</span><br><span class="line">latest: Pulling from library/nginx</span><br><span class="line">1efc276f4ff9: Pull complete</span><br><span class="line">baf2da91597d: Pull complete</span><br><span class="line">05396a986fd3: Pull complete</span><br><span class="line">6a17c8e7063d: Pull complete</span><br><span class="line">27e0d286aeab: Pull complete</span><br><span class="line">b1349eea8fc5: Pull complete</span><br><span class="line">Digest: sha256:790711e34858c9b0741edffef6ed3d8199d8faa33f2870dea5db70f16384df79</span><br><span class="line">Status: Downloaded newer image for nginx:latest</span><br><span class="line">docker.io/library/nginx:latest</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看镜像分层历史</span></span><br><span class="line">[root@centos7 ~]# docker image history nginx</span><br><span class="line">IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT</span><br><span class="line">b692a91e4e15   2 weeks ago   /bin/sh -c #(nop)  CMD [&quot;nginx&quot; &quot;-g&quot; &quot;daemon…   0B</span><br><span class="line">&lt;missing&gt;      2 weeks ago   /bin/sh -c #(nop)  STOPSIGNAL SIGQUIT           0B</span><br><span class="line">&lt;missing&gt;      2 weeks ago   /bin/sh -c #(nop)  EXPOSE 80                    0B</span><br><span class="line">&lt;missing&gt;      2 weeks ago   /bin/sh -c #(nop)  ENTRYPOINT [&quot;/docker-entr…   0B</span><br><span class="line">&lt;missing&gt;      2 weeks ago   /bin/sh -c #(nop) COPY file:09a214a3e07c919a…   4.61kB</span><br><span class="line">&lt;missing&gt;      2 weeks ago   /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7…   1.04kB</span><br><span class="line">&lt;missing&gt;      2 weeks ago   /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0…   1.96kB</span><br><span class="line">&lt;missing&gt;      2 weeks ago   /bin/sh -c #(nop) COPY file:65504f71f5855ca0…   1.2kB</span><br><span class="line">&lt;missing&gt;      2 weeks ago   /bin/sh -c set -x     &amp;&amp; addgroup --system -…   61.1MB</span><br><span class="line">&lt;missing&gt;      2 weeks ago   /bin/sh -c #(nop)  ENV PKG_RELEASE=1~bullseye   0B</span><br><span class="line">&lt;missing&gt;      2 weeks ago   /bin/sh -c #(nop)  ENV NJS_VERSION=0.7.6        0B</span><br><span class="line">&lt;missing&gt;      2 weeks ago   /bin/sh -c #(nop)  ENV NGINX_VERSION=1.23.1     0B</span><br><span class="line">&lt;missing&gt;      2 weeks ago   /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B</span><br><span class="line">&lt;missing&gt;      2 weeks ago   /bin/sh -c #(nop)  CMD [&quot;bash&quot;]                 0B</span><br><span class="line">&lt;missing&gt;      2 weeks ago   /bin/sh -c #(nop) ADD file:0eae0dca665c7044b…   80.4MB</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# docker inspect nginx</span><br><span class="line">[</span><br><span class="line">    &#123;</span><br><span class="line">        &quot;Id&quot;: &quot;sha256:b692a91e4e1582db97076184dae0b2f4a7a86b68c4fe6f91affa50ae06369bf5&quot;,</span><br><span class="line">        &quot;RepoTags&quot;: [</span><br><span class="line">            &quot;nginx:latest&quot;</span><br><span class="line">        ],</span><br><span class="line">        &quot;RepoDigests&quot;: [</span><br><span class="line">            &quot;nginx@sha256:790711e34858c9b0741edffef6ed3d8199d8faa33f2870dea5db70f16384df79&quot;</span><br><span class="line">        ],</span><br><span class="line">        &quot;Parent&quot;: &quot;&quot;,</span><br><span class="line">        &quot;Comment&quot;: &quot;&quot;,</span><br><span class="line">        &quot;Created&quot;: &quot;2022-08-02T05:17:19.274343015Z&quot;,</span><br><span class="line">        &quot;Container&quot;: &quot;5f19bc2cd794cd60ec845cbed7a60c85003dc56f26ee807f9eea2480bc465b76&quot;,</span><br><span class="line">        &quot;ContainerConfig&quot;: &#123;</span><br><span class="line">            &quot;Hostname&quot;: &quot;5f19bc2cd794&quot;,</span><br><span class="line">            &quot;Domainname&quot;: &quot;&quot;,</span><br><span class="line">            &quot;User&quot;: &quot;&quot;,</span><br><span class="line">            &quot;AttachStdin&quot;: false,</span><br><span class="line">            &quot;AttachStdout&quot;: false,</span><br><span class="line">            &quot;AttachStderr&quot;: false,</span><br><span class="line">            &quot;ExposedPorts&quot;: &#123;</span><br><span class="line">                &quot;80/tcp&quot;: &#123;&#125;</span><br><span class="line">            &#125;,</span><br><span class="line">            &quot;Tty&quot;: false,</span><br><span class="line">            &quot;OpenStdin&quot;: false,</span><br><span class="line">            &quot;StdinOnce&quot;: false,</span><br><span class="line">            &quot;Env&quot;: [</span><br><span class="line">                &quot;PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&quot;,</span><br><span class="line">                &quot;NGINX_VERSION=1.23.1&quot;,</span><br><span class="line">                &quot;NJS_VERSION=0.7.6&quot;,</span><br><span class="line">                &quot;PKG_RELEASE=1~bullseye&quot;</span><br><span class="line">            ],</span><br><span class="line">            &quot;Cmd&quot;: [</span><br><span class="line">                &quot;/bin/sh&quot;,</span><br><span class="line">                &quot;-c&quot;,</span><br><span class="line">                &quot;#(nop) &quot;,</span><br><span class="line">                &quot;CMD [\&quot;nginx\&quot; \&quot;-g\&quot; \&quot;daemon off;\&quot;]&quot;</span><br><span class="line">            ],</span><br><span class="line">            &quot;Image&quot;: &quot;sha256:0417134432daa8913f92f7bf71641a8fa7ab3405c91b717dde22c855e71eef4d&quot;,</span><br><span class="line">            &quot;Volumes&quot;: null,</span><br><span class="line">            &quot;WorkingDir&quot;: &quot;&quot;,</span><br><span class="line">            &quot;Entrypoint&quot;: [</span><br><span class="line">                &quot;/docker-entrypoint.sh&quot;</span><br><span class="line">            ],</span><br><span class="line">            &quot;OnBuild&quot;: null,</span><br><span class="line">            &quot;Labels&quot;: &#123;</span><br><span class="line">                &quot;maintainer&quot;: &quot;NGINX Docker Maintainers &lt;docker-maint@nginx.com&gt;&quot;</span><br><span class="line">            &#125;,</span><br><span class="line">            &quot;StopSignal&quot;: &quot;SIGQUIT&quot;</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;DockerVersion&quot;: &quot;20.10.12&quot;,</span><br><span class="line">        &quot;Author&quot;: &quot;&quot;,</span><br><span class="line">        &quot;Config&quot;: &#123;</span><br><span class="line">            &quot;Hostname&quot;: &quot;&quot;,</span><br><span class="line">            &quot;Domainname&quot;: &quot;&quot;,</span><br><span class="line">            &quot;User&quot;: &quot;&quot;,</span><br><span class="line">            &quot;AttachStdin&quot;: false,</span><br><span class="line">            &quot;AttachStdout&quot;: false,</span><br><span class="line">            &quot;AttachStderr&quot;: false,</span><br><span class="line">            &quot;ExposedPorts&quot;: &#123;</span><br><span class="line">                &quot;80/tcp&quot;: &#123;&#125;</span><br><span class="line">            &#125;,</span><br><span class="line">            &quot;Tty&quot;: false,</span><br><span class="line">            &quot;OpenStdin&quot;: false,</span><br><span class="line">            &quot;StdinOnce&quot;: false,</span><br><span class="line">            &quot;Env&quot;: [</span><br><span class="line">                &quot;PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&quot;,</span><br><span class="line">                &quot;NGINX_VERSION=1.23.1&quot;,</span><br><span class="line">                &quot;NJS_VERSION=0.7.6&quot;,</span><br><span class="line">                &quot;PKG_RELEASE=1~bullseye&quot;</span><br><span class="line">            ],</span><br><span class="line">            &quot;Cmd&quot;: [</span><br><span class="line">                &quot;nginx&quot;,</span><br><span class="line">                &quot;-g&quot;,</span><br><span class="line">                &quot;daemon off;&quot;</span><br><span class="line">            ],</span><br><span class="line">            &quot;Image&quot;: &quot;sha256:0417134432daa8913f92f7bf71641a8fa7ab3405c91b717dde22c855e71eef4d&quot;,</span><br><span class="line">            &quot;Volumes&quot;: null,</span><br><span class="line">            &quot;WorkingDir&quot;: &quot;&quot;,</span><br><span class="line">            &quot;Entrypoint&quot;: [</span><br><span class="line">                &quot;/docker-entrypoint.sh&quot;</span><br><span class="line">            ],</span><br><span class="line">            &quot;OnBuild&quot;: null,</span><br><span class="line">            &quot;Labels&quot;: &#123;</span><br><span class="line">                &quot;maintainer&quot;: &quot;NGINX Docker Maintainers &lt;docker-maint@nginx.com&gt;&quot;</span><br><span class="line">            &#125;,</span><br><span class="line">            &quot;StopSignal&quot;: &quot;SIGQUIT&quot;</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;Architecture&quot;: &quot;amd64&quot;,</span><br><span class="line">        &quot;Os&quot;: &quot;linux&quot;,</span><br><span class="line">        &quot;Size&quot;: 141538863,</span><br><span class="line">        &quot;VirtualSize&quot;: 141538863,</span><br><span class="line">        &quot;GraphDriver&quot;: &#123;</span><br><span class="line">            &quot;Data&quot;: &#123;</span><br><span class="line">                &quot;LowerDir&quot;: &quot;/var/lib/docker/overlay2/65721405d33c804de8b1ce344e01ea1cb20a15b526846ddd0914236141d12a74/diff:/var/lib/docker/overlay2/769ff70d994c30f2c3aca1a752b6320d7908f4a7aebd56ef58557b9d39cb3170/diff:/var/lib/docker/overlay2/ecbbdc176f03365bcf157e7409d045d16173793abb43d908328c28aa5235af85/diff:/var/lib/docker/overlay2/14a39e34b10a24fab8c7dccff4a3fcd34bdede808fda2921fcb2c033b1871e92/diff:/var/lib/docker/overlay2/3826983a7f0fa4365113c866622eb0af797919100279ba1db6bdd352330e4699/diff&quot;,</span><br><span class="line">                &quot;MergedDir&quot;: &quot;/var/lib/docker/overlay2/7194cc85a5c2bf12f4d2fb0e2c57ff356c47981bda94be0e9bcf503391080797/merged&quot;,</span><br><span class="line">                &quot;UpperDir&quot;: &quot;/var/lib/docker/overlay2/7194cc85a5c2bf12f4d2fb0e2c57ff356c47981bda94be0e9bcf503391080797/diff&quot;,</span><br><span class="line">                &quot;WorkDir&quot;: &quot;/var/lib/docker/overlay2/7194cc85a5c2bf12f4d2fb0e2c57ff356c47981bda94be0e9bcf503391080797/work&quot;</span><br><span class="line">            &#125;,</span><br><span class="line">            &quot;Name&quot;: &quot;overlay2&quot;</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;RootFS&quot;: &#123;</span><br><span class="line">            &quot;Type&quot;: &quot;layers&quot;,</span><br><span class="line">            &quot;Layers&quot;: [</span><br><span class="line">                &quot;sha256:92a4e8a3140f7a04a0e5a15793adef2d0e8889ed306a8f95a6cfb67cecb5f212&quot;,</span><br><span class="line">                &quot;sha256:e3257a399753c995f54856b0cea3c2b6aa1a95d9a7b542668a46fa4eacf62d53&quot;,</span><br><span class="line">                &quot;sha256:3a89c8160a43d70433241934b1d418f641e6d207a10b558b67f8aafdb15416b0&quot;,</span><br><span class="line">                &quot;sha256:f91d0987b144553456431bcb8cc8ddf5d03362701bc2ffc128ce2bd57182defb&quot;,</span><br><span class="line">                &quot;sha256:bdc7a32279ccdf5aba13d3e50b7b16103e03ff8ef27424ac1a33df24e5a9f602&quot;,</span><br><span class="line">                &quot;sha256:b539cf60d7bb42871a005e949b550800b99fada0b1c1bca01654e8a506ba2138&quot;</span><br><span class="line">            ]</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;Metadata&quot;: &#123;</span><br><span class="line">            &quot;LastTagTime&quot;: &quot;0001-01-01T00:00:00Z&quot;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">]</span><br><span class="line">[root@centos7 ~]# docker save nginx -o nginx.tar</span><br><span class="line">[root@centos7 ~]# docker images</span><br><span class="line">REPOSITORY   TAG       IMAGE ID       CREATED       SIZE</span><br><span class="line">nginx        latest    b692a91e4e15   2 weeks ago   142MB</span><br><span class="line">[root@centos7 ~]# ll -h nginx.tar</span><br><span class="line">-rw------- 1 root root 140M 8月  22 23:00 nginx.tar</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# mkdir data</span><br><span class="line">[root@centos7 ~]# tar -xf nginx.tar -C data/</span><br><span class="line">[root@centos7 ~]# ll data/</span><br><span class="line">总用量 16</span><br><span class="line">drwxr-xr-x 2 root root   50 8月   2 13:17 0b71b9002c2056073a621264c914f1778296599761548ff1e34d39dc883ed029</span><br><span class="line">drwxr-xr-x 2 root root   50 8月   2 13:17 19dee729285a1f8f34b15874db48c7b4b60f6041914f2cad9b1de169795de836</span><br><span class="line">drwxr-xr-x 2 root root   50 8月   2 13:17 1c65531519b901e0508c411808f7dc2497a6549926bda748896f59aaddc4eed4</span><br><span class="line">drwxr-xr-x 2 root root   50 8月   2 13:17 6387aff546d7c159c6e082ea910391bc9c331ff19f75c73d45780def09a8c989</span><br><span class="line">drwxr-xr-x 2 root root   50 8月   2 13:17 75e6a412e4bda1a8b9e5690c6f8c218c0649ca965207ff15f4f2e114e859ec86</span><br><span class="line">-rw-r--r-- 1 root root 7653 8月   2 13:17 b692a91e4e1582db97076184dae0b2f4a7a86b68c4fe6f91affa50ae06369bf5.json</span><br><span class="line">drwxr-xr-x 2 root root   50 8月   2 13:17 e9bee565b6a50b23d35427abf3f6756a842c5d75d3c8e3d63f412cb3dae90409</span><br><span class="line">-rw-r--r-- 1 root root  586 1月   1 1970 manifest.json</span><br><span class="line">-rw-r--r-- 1 root root   88 1月   1 1970 repositories</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# cat data/manifest.json</span><br><span class="line">[&#123;&quot;Config&quot;:&quot;b692a91e4e1582db97076184dae0b2f4a7a86b68c4fe6f91affa50ae06369bf5.json&quot;,&quot;RepoTags&quot;:[&quot;nginx:latest&quot;],&quot;Layers&quot;:[&quot;1c65531519b901e0508c411808f7dc2497a6549926bda748896f59aaddc4eed4/layer.tar&quot;,&quot;e9bee565b6a50b23d35427abf3f6756a842c5d75d3c8e3d63f412cb3dae90409/layer.tar&quot;,&quot;6387aff546d7c159c6e082ea910391bc9c331ff19f75c73d45780def09a8c989/layer.tar&quot;,&quot;75e6a412e4bda1a8b9e5690c6f8c218c0649ca965207ff15f4f2e114e859ec86/layer.tar&quot;,&quot;0b71b9002c2056073a621264c914f1778296599761548ff1e34d39dc883ed029/layer.tar&quot;,&quot;19dee729285a1f8f34b15874db48c7b4b60f6041914f2cad9b1de169795de836/layer.tar&quot;]&#125;]</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# du -sh data/*</span><br><span class="line">12Kdata/0b71b9002c2056073a621264c914f1778296599761548ff1e34d39dc883ed029</span><br><span class="line">16Kdata/19dee729285a1f8f34b15874db48c7b4b60f6041914f2cad9b1de169795de836</span><br><span class="line">80Mdata/1c65531519b901e0508c411808f7dc2497a6549926bda748896f59aaddc4eed4</span><br><span class="line">12Kdata/6387aff546d7c159c6e082ea910391bc9c331ff19f75c73d45780def09a8c989</span><br><span class="line">12Kdata/75e6a412e4bda1a8b9e5690c6f8c218c0649ca965207ff15f4f2e114e859ec86</span><br><span class="line">8.0Kdata/b692a91e4e1582db97076184dae0b2f4a7a86b68c4fe6f91affa50ae06369bf5.json</span><br><span class="line">60Mdata/e9bee565b6a50b23d35427abf3f6756a842c5d75d3c8e3d63f412cb3dae90409</span><br><span class="line">4.0Kdata/manifest.json</span><br><span class="line">4.0Kdata/repositories</span><br></pre></td></tr></table></figure><h3 id="搜索镜像"><a href="#搜索镜像" class="headerlink" title="搜索镜像"></a>搜索镜像</h3><p>官网：<a href="https://hub.docker.com/">https://hub.docker.com</a></p><h4 id="执行docker-search命令进行搜索"><a href="#执行docker-search命令进行搜索" class="headerlink" title="执行docker search命令进行搜索"></a>执行docker search命令进行搜索</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">Usage:docker search [OPTIONS] TERM</span><br><span class="line"></span><br><span class="line">Options:</span><br><span class="line">-f, --filter filterFilter output based on conditions provided</span><br><span class="line">--format stringPretty-print search using a Go template</span><br><span class="line">--limit intMax number of search results(default 25)</span><br><span class="line"></span><br><span class="line">说明：</span><br><span class="line">OFFICIAL：官方</span><br><span class="line">AUTOMATED：使用第三方docker服务来帮助编译镜像，可以在互联网上面直接拉取到镜像，减少了繁琐的编译过程</span><br></pre></td></tr></table></figure><p>例：查找centos镜像</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker search centos</span><br><span class="line">NAME                                         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED</span><br><span class="line">centos                                       The official build of CentOS.                   7288      [OK]</span><br><span class="line">kasmweb/centos-7-desktop                     CentOS 7 desktop for Kasm Workspaces            24</span><br><span class="line">couchbase/centos7-systemd                    centos7-systemd images with additional debug…   4                    [OK]</span><br><span class="line">dokken/centos-7                              CentOS 7 image for kitchen-dokken               3</span><br><span class="line">continuumio/centos5_gcc5_base                                                                3</span><br><span class="line">dokken/centos-stream-9                                                                       2</span><br><span class="line">dokken/centos-stream-8                                                                       2</span><br><span class="line">spack/centos7                                CentOS 7 with Spack preinstalled                1</span><br><span class="line">spack/centos6                                CentOS 6 with Spack preinstalled                1</span><br><span class="line">datadog/centos-i386                                                                          0</span><br><span class="line">dokken/centos-6                              CentOS 6 image for kitchen-dokken               0</span><br><span class="line">ustclug/centos                               Official CentOS Image with USTC Mirror          0</span><br><span class="line">dokken/centos-8                              CentOS 8 image for kitchen-dokken               0</span><br><span class="line">corpusops/centos-bare                        https://github.com/corpusops/docker-images/     0</span><br><span class="line">bitnami/centos-extras-base                                                                   0</span><br><span class="line">corpusops/centos                             centos corpusops baseimage                      0</span><br><span class="line">couchbase/centos-72-java-sdk                                                                 0</span><br><span class="line">couchbase/centos-72-jenkins-core                                                             0</span><br><span class="line">couchbase/centos-70-sdk-build                                                                0</span><br><span class="line">bitnami/centos-base-buildpack                Centos base compilation image                   0                    [OK]</span><br><span class="line">couchbase/centos-69-sdk-nodevtoolset-build                                                   0</span><br><span class="line">fnndsc/centos-python3                        Source for a slim Centos-based Python3 image…   0                    [OK]</span><br><span class="line">couchbase/centos-69-sdk-build                                                                0</span><br><span class="line">dokken/centos-5                              EOL DISTRO: For use with kitchen-dokken, Bas…   0</span><br><span class="line">spack/centos-stream                                                                          0</span><br></pre></td></tr></table></figure><p>搜索点赞100个以上的镜像</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker search --filter=stars=100 centos</span><br><span class="line">NAME      DESCRIPTION                     STARS     OFFICIAL   AUTOMATED</span><br><span class="line">centos    The official build of CentOS.   7288      [OK]</span><br></pre></td></tr></table></figure><h3 id="alpine介绍"><a href="#alpine介绍" class="headerlink" title="alpine介绍"></a>alpine介绍</h3><p>Alpine操作系统是一个面向安全的轻型Linux发行版。它不同于通常Linux发行版Alpine采用了musl libc 和 busybox以减小系统的体积和运行时资源消耗，但功能上比busybox又完善的多，因此得到开源社区越来也多的青睐。在保持瘦身的同时，Alpine还提供了自己的包管理工具apk，可以通过<a href="https://pkgs.alpinelinux.org/packages">https://pkgs.alpinelinux.org/packages</a> 查询包信息，也可以直接通过apk命令直接查询和安装各种软件。</p><p>Alpine由非商业组织维护的，支持广泛场景的Linux发行版，它特别为资深&#x2F;重度Linux用户而优化，关注安全，性能和资源效能。Alpine镜像可以适用于更多常用场景，并且是一个优秀的可以适用于生产的基础系统&#x2F;环境。</p><p>Alpine Docker镜像也继承了Alpine Linux发行版的这些优势。相比于其他Docker镜像，它的容量非常小，仅仅只有5M左右，且拥有非常友好的包管理机制。官方镜像来自docker-alpine项目。</p><p>目前Docker官方已开始推荐使用Alpine替代之前的Ubuntu作为基础镜像环境。这样会带来多个好处。包括镜像下载速度加快，镜像安全性提高，主机之间的切换更方便，占用更少磁盘空间等。</p><p>下表是官方镜像的大小比较</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">REPOSITORY   TAG       IMAGE ID       CREATED                  SIZE</span><br><span class="line">debian       latest    dd8bae8d259f   Less than a second ago   124MB</span><br><span class="line">alpine       latest    9c6f07244728   12 days ago              5.54MB</span><br><span class="line">ubuntu       latest    df5de72bdb3b   2 weeks ago              77.8MB</span><br><span class="line">centos       latest    5d0da3dc9764   11 months ago            231MB</span><br></pre></td></tr></table></figure><ul><li>Alpine官网：<a href="https://www.alpinelinux.org/">https://www.alpinelinux.org</a></li><li>Alpine官方仓库：<a href="https://github.com/alpinelinux">https://github.com/alpinelinux</a></li><li>Alpine官方镜像：<a href="https://hub.docker.com/_/alpine/">https://hub.docker.com/_/alpine/</a></li><li>Alpine官方镜像仓库：<a href="https://github.com/gliderlabs/docker-alpine">https://github.com/gliderlabs/docker-alpine</a></li><li>Alpine阿里云镜像仓库：<a href="https://mirrors.aliyun.com/alpine/">https://mirrors.aliyun.com/alpine/</a></li></ul><h4 id="alpine管理软件"><a href="#alpine管理软件" class="headerlink" title="alpine管理软件"></a>alpine管理软件</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">修改源替换成阿里源，将里面 dl-cdn.alpinelinux.org 改成 mirrors.aliyun.com</span></span><br><span class="line">vi /etc/apk/repositories</span><br><span class="line">https://mirrors.aliyun.com/alpine/v3.16/main</span><br><span class="line">https://mirrors.aliyun.com/alpine/v3.16/community</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">更新源</span></span><br><span class="line">apk update</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装软件</span></span><br><span class="line">apk add vim </span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">删除软件</span></span><br><span class="line">apk del openssh openntp vim</span><br></pre></td></tr></table></figure><p>例：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">/ # apk --help</span><br><span class="line">apk-tools 2.12.9, compiled for x86_64.</span><br><span class="line"></span><br><span class="line">usage: apk [&lt;OPTIONS&gt;...] COMMAND [&lt;ARGUMENTS&gt;...]</span><br><span class="line"></span><br><span class="line">Package installation and removal:</span><br><span class="line">  add        Add packages to WORLD and commit changes</span><br><span class="line">  del        Remove packages from WORLD and commit changes</span><br><span class="line"></span><br><span class="line">System maintenance:</span><br><span class="line">  fix        Fix, reinstall or upgrade packages without modifying WORLD</span><br><span class="line">  update     Update repository indexes</span><br><span class="line">  upgrade    Install upgrades available from repositories</span><br><span class="line">  cache      Manage the local package cache</span><br><span class="line"></span><br><span class="line">Querying package information:</span><br><span class="line">  info       Give detailed information about packages or repositories</span><br><span class="line">  list       List packages matching a pattern or other criteria</span><br><span class="line">  dot        Render dependencies as graphviz graphs</span><br><span class="line">  policy     Show repository policy for packages</span><br><span class="line">  search     Search for packages by name or description</span><br><span class="line"></span><br><span class="line">Repository maintenance:</span><br><span class="line">  index      Create repository index file from packages</span><br><span class="line">  fetch      Download packages from global repositories to a local directory</span><br><span class="line">  manifest   Show checksums of package contents</span><br><span class="line">  verify     Verify package integrity and signature</span><br><span class="line"></span><br><span class="line">Miscellaneous:</span><br><span class="line">  audit      Audit system for changes</span><br><span class="line">  stats      Show statistics about repositories and installations</span><br><span class="line">  version    Compare package versions or perform tests on version strings</span><br><span class="line"></span><br><span class="line">This apk has coffee making abilities.</span><br><span class="line">For more information: man 8 apk</span><br><span class="line"></span><br><span class="line">/ # apk add nginx</span><br><span class="line">(1/2) Installing pcre (8.45-r2)</span><br><span class="line">(2/2) Installing nginx (1.22.0-r1)</span><br><span class="line">Executing nginx-1.22.0-r1.pre-install</span><br><span class="line">Executing nginx-1.22.0-r1.post-install</span><br><span class="line">Executing busybox-1.35.0-r17.trigger</span><br><span class="line">OK: 7 MiB in 16 packages</span><br><span class="line"></span><br><span class="line">/ # apk info nginx</span><br><span class="line">nginx-1.22.0-r1 description:</span><br><span class="line">HTTP and reverse proxy server (stable version)</span><br><span class="line"></span><br><span class="line">nginx-1.22.0-r1 webpage:</span><br><span class="line">https://www.nginx.org/</span><br><span class="line"></span><br><span class="line">nginx-1.22.0-r1 installed size:</span><br><span class="line">1124 KiB</span><br><span class="line"></span><br><span class="line">/ # apk manifest nginx</span><br><span class="line">sha1:d21a96358a10b731f8847e6d32799efdc2a7f421  etc/logrotate.d/nginx</span><br><span class="line">sha1:cbf596ddb3433a8e0d325f3c188bec9c1bb746b3  etc/nginx/fastcgi.conf</span><br><span class="line">sha1:da38e2a0dded838afbe0eade6cb837ac30fd8046  etc/nginx/fastcgi_params</span><br><span class="line">sha1:9b85e5091018455091d7f135c4a160ad9487516a  etc/nginx/mime.types</span><br><span class="line">sha1:44195d2ab691d6251a0ac0190aebf7a1c2eea05d  etc/nginx/nginx.conf</span><br><span class="line">sha1:379c1e2a2a5ffb8c91a07328d4c9be2bc58799fd  etc/nginx/scgi_params</span><br><span class="line">sha1:cc2fcdb4605dcac23d59f667889ccbdfdc6e3668  etc/nginx/uwsgi_params</span><br><span class="line">sha1:b56312b641dffaa622d197625f4b867817824475  usr/sbin/nginx</span><br><span class="line">sha1:7b2a4da1a14166442c10cbf9e357fa9fb53542ca  usr/share/nginx/http-default_server.conf</span><br><span class="line">sha1:35db17c18ce0b9f84a3cc113c8a9e94e19f632b1  var/lib/nginx/logs</span><br><span class="line">sha1:c3f02ca81f7f2c6bde3f878b3176f225c7781c7d  var/lib/nginx/modules</span><br><span class="line">sha1:0510312d465b86769136983657df98c1854f0b60  var/lib/nginx/run</span><br><span class="line">sha1:835b9dec419c01420e78602527a9fba8c463521c  var/lib/nginx/html/50x.html</span><br><span class="line">sha1:c51a3f0e6de4eb802d5630941c3fd9e1d0efae4b  var/lib/nginx/html/index.html</span><br></pre></td></tr></table></figure><h4 id="Debian-Ubuntu-建议安装的基础包"><a href="#Debian-Ubuntu-建议安装的基础包" class="headerlink" title="Debian(Ubuntu)建议安装的基础包"></a>Debian(Ubuntu)建议安装的基础包</h4><p>在很多软件官方提供的镜像都使用的是Debian（Ubuntu）的系统，比如：nginx，tomcat，mysql，httpd等，但镜像内缺少很多常用的调试工具，当需要进入容器内进行调试管理时，可以安装以下常用工具包</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">apt update# 安装软件钱需要先更新索引</span><br><span class="line">apt install procps# 提供top，ps,free等命令</span><br><span class="line">apt install psmic# 提供pstree,killall等命令</span><br><span class="line">apt install iputils-ping# 提供ping命令</span><br><span class="line">apt install net-tools# 提供netstat网络工具等</span><br></pre></td></tr></table></figure><h3 id="下载镜像"><a href="#下载镜像" class="headerlink" title="下载镜像"></a>下载镜像</h3><p>从docker仓库下载镜像到本地，命令格式如下</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker pull [OPTION] NAME[:TAG|@GIGEST]</span><br><span class="line">OPTIONS:</span><br><span class="line">-a,--all-tagsDownload all tagged images in the repository</span><br><span class="line"> --disable-content-trustSkip image verification (default true)</span><br><span class="line"> --platform stringSet platform if server is multi-platform capable</span><br><span class="line"> -q,--quitSuppress verbose output</span><br><span class="line"> </span><br><span class="line">NAME:是镜像名，一般的形式  仓库服务器：端口/项目名称/镜像名称</span><br><span class="line">:TAG:即版本号，如果不指定:TAG，则下载最新版镜像</span><br></pre></td></tr></table></figure><h4 id="镜像下载说明"><a href="#镜像下载说明" class="headerlink" title="镜像下载说明"></a>镜像下载说明</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker pull hello-world</span><br><span class="line">Using default tag: latest# 默认下载最新版本</span><br><span class="line">latest: Pulling from library/hello-world</span><br><span class="line">2db29710123e: Pull complete# 分层下载</span><br><span class="line">Digest: sha256:7d246653d0511db2a6b2e0436cfd0e52ac8c066000264b3ce63331ac66dca625 # 摘要</span><br><span class="line">Status: Downloaded newer image for hello-world:latest</span><br><span class="line">docker.io/library/hello-world:latest# 下载的完整地址</span><br></pre></td></tr></table></figure><p>镜像下载保存的路径：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">/var/lib/docker/overlay2/镜像ID</span><br></pre></td></tr></table></figure><p>注意：镜像下载完成后，会自动解压缩，比官网显示的可能会大很多，如：centos8.1.1911下载时只有70M，下载完后显示237M</p><p>例：从docker官网下载镜像</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker pull hello-world</span><br><span class="line">docker pull alpine</span><br><span class="line">docker pull busybox</span><br><span class="line">docker pull nginx</span><br><span class="line">docker pull centos</span><br><span class="line">docker pull centos:centos7.7.1908</span><br><span class="line">docekr pull docker.io/library/mysql:5.7.29</span><br><span class="line">docker pull mysql:5.6.47</span><br></pre></td></tr></table></figure><h3 id="docker镜像加速配置"><a href="#docker镜像加速配置" class="headerlink" title="docker镜像加速配置"></a>docker镜像加速配置</h3><p>docker镜像官方的下载站点是：<a href="https://hub.docker.com/">https://hub.docker.com/</a></p><p>从国内下载官方的镜像站点有时候会很慢，因此可以更改docker配置文件添加一个加速器，可以通过加速器达到加速下载镜像的目的。国内有许多公司都提供了docker加速镜像，比如：阿里云，腾讯云，网易云等。</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">1.安装/升级Docker客户端</span><br><span class="line">推荐安装1.10.0以上版本的Docker客户端，参考文档 docker-ce</span><br><span class="line"></span><br><span class="line">2.配置镜像加速器</span><br><span class="line">修改daemon配置文件 /etc/docker/daemon.json</span><br><span class="line">mkdir -p /etc/docker</span><br><span class="line">cat &lt;&lt;EOF | sudo tee /etc/docker/daemon.json</span><br><span class="line">&#123;</span><br><span class="line">&quot;registry-mirrors&quot;:[&quot;https://docker.mirrors.ustc.edu.cn&quot;]</span><br><span class="line">&#125;</span><br><span class="line">EOF</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">网易云：https://hub-mirror.c.163.com/</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">腾讯云：https://mirror.ccs.tencentyun.com</span></span><br><span class="line"></span><br><span class="line">systemctl daemon-reload</span><br><span class="line">systemctl restart docker</span><br></pre></td></tr></table></figure><h3 id="查看本地镜像"><a href="#查看本地镜像" class="headerlink" title="查看本地镜像"></a>查看本地镜像</h3><p>docker images可以查看下载至本地的镜像</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker images [OPTIONS] [REPOSITORY[:TAG]]</span><br><span class="line">docker image ls [OPTIONS] [REPOSITORY[:TAG]]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">常用选项</span></span><br><span class="line">-q,--quietOnly show numberic IDs</span><br><span class="line">-a,--allShow all images (default hides intermediate images)</span><br><span class="line"> --digestsShow digests</span><br><span class="line"> --no-truncDon&#x27;t truncate output</span><br><span class="line">-f,--filter filterFilter output based on conditions provided</span><br><span class="line"> --format string  Pretty-print images using a Go template</span><br></pre></td></tr></table></figure><p>执行结果的显示信息说明</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">REPOSITORY# 镜像所属的仓库名称</span><br><span class="line">TAG# 镜像版本号（标识符），默认为latest</span><br><span class="line">IMAGE ID# 镜像唯一ID标识，如果ID相同，说明是同一个镜像有多个名称</span><br><span class="line">VREATED# 镜像在仓库中被创建时间</span><br><span class="line">SIZE# 镜像的大小</span><br></pre></td></tr></table></figure><p>Repository仓库</p><ul><li>由某特定的docker镜像的所有迭代版本组成的镜像仓库</li><li>一个Registry中可以存在多个Repository</li><li>Repository可分为“顶层仓库”和“用户仓库”</li><li>Repository用户仓库名称一般格式为“用户名&#x2F;仓库名”</li><li>每个Repository仓库可以包含多个Tag，每个标签对应一个镜像</li></ul><h3 id="镜像导出"><a href="#镜像导出" class="headerlink" title="镜像导出"></a>镜像导出</h3><p>利用docker save命令可以将本地镜像导出为一个tar文件，然后复制到其他服务器进行导入使用</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker save [OPTIONS] IMAGE [IMAGE...]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">选项：</span></span><br><span class="line">-o,--output string  write to a file,instead of STDOUT</span><br></pre></td></tr></table></figure><p>常见用法：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker save -o /path/file.tar IMAGE1 IMAGE2 ...</span><br><span class="line">docker save IMAGE1 IMAGE2... &gt; /path/file.tar</span><br></pre></td></tr></table></figure><h3 id="镜像导入"><a href="#镜像导入" class="headerlink" title="镜像导入"></a>镜像导入</h3><p>利用docker load 命令可以将镜像导出的压缩文件再导入</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker load [OPTIONS]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">选项</span></span><br><span class="line">-i,--input stringRead from tar archive,instead of STDIN</span><br><span class="line">-q,--quietSuppress the load output</span><br></pre></td></tr></table></figure><p>常见用法：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker load -i /path/file.tar</span><br><span class="line">docker load &lt; /path/file.tar</span><br></pre></td></tr></table></figure><h3 id="删除镜像"><a href="#删除镜像" class="headerlink" title="删除镜像"></a>删除镜像</h3><p>docker rmi 命令可以删除镜像</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker rmi [OPTIONS] IMAGE [IMAGE...]</span><br><span class="line">docker image rm [OPTIONS] IMAGE [IMAGE...]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">选项</span></span><br><span class="line">-f,--forceForce removal of the image</span><br><span class="line"> --no-pruneDo not delete untagged parents</span><br></pre></td></tr></table></figure><p>常见用法：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker images</span><br><span class="line">REPOSITORY    TAG              IMAGE ID       CREATED                  SIZE</span><br><span class="line">debian        latest           dd8bae8d259f   Less than a second ago   124MB</span><br><span class="line">alpine        latest           9c6f07244728   13 days ago              5.54MB</span><br><span class="line">ubuntu        latest           df5de72bdb3b   2 weeks ago              77.8MB</span><br><span class="line">hello-world   latest           feb5d9fea6a5   11 months ago            13.3kB</span><br><span class="line">centos        latest           5d0da3dc9764   11 months ago            231MB</span><br><span class="line">centos        centos7.7.1908   08d05d1d5859   2 years ago              204MB</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">根据IMAGE ID删除镜像</span></span><br><span class="line">[root@centos7 ~]# docker rmi 08d</span><br><span class="line">Untagged: centos:centos7.7.1908</span><br><span class="line">Untagged: centos@sha256:50752af5182c6cd5518e3e91d48f7ff0cba93d5d760a67ac140e2d63c4dd9efc</span><br><span class="line">Deleted: sha256:08d05d1d5859ebcfb3312d246e2082e46cb307f0e896c9ac097185f0b0b19e56</span><br><span class="line">Deleted: sha256:034f282942cd6c3abf9384601a57f080f8f75cc7f58527db8e07573d9d14ab46</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">根据REPOSITORY名称删除镜像</span></span><br><span class="line">[root@centos7 ~]# docker rmi centos</span><br><span class="line">Untagged: centos:latest</span><br><span class="line">Untagged: centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177</span><br><span class="line">Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6</span><br><span class="line">Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">删除多个镜像</span></span><br><span class="line">[root@centos7 ~]# docker rmi debian ubuntu</span><br><span class="line">Untagged: debian:latest</span><br><span class="line">Untagged: debian@sha256:875e4e2bae4d7ff53fe7f3672b15630439479fd10da081477a14208122fe8f31</span><br><span class="line">Deleted: sha256:dd8bae8d259fed93eb54b3bca0adeb647fc07f6ef16745c8ed4144ada4d51a95</span><br><span class="line">Deleted: sha256:655ed1b7a4286ce965b8942644f665a3aeafac315f023b3d75fabdbd4be12dd0</span><br><span class="line">Untagged: ubuntu:latest</span><br><span class="line">Untagged: ubuntu@sha256:34fea4f31bf187bc915536831fd0afc9d214755bf700b5cdb1336c82516d154e</span><br><span class="line">Deleted: sha256:df5de72bdb3b711aba4eca685b1f42c722cc8a1837ed3fbd548a9282af2d836d</span><br><span class="line">Deleted: sha256:629d9dbab5edeac7fa51f205839d7f9bb629a5e83548da3a183fb66c22fe7af7</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">删除所有镜像</span></span><br><span class="line">[root@centos7 ~]# docker images</span><br><span class="line">REPOSITORY    TAG       IMAGE ID       CREATED         SIZE</span><br><span class="line">alpine        latest    9c6f07244728   13 days ago     5.54MB</span><br><span class="line">hello-world   latest    feb5d9fea6a5   11 months ago   13.3kB</span><br><span class="line">[root@centos7 ~]# docker rmi -f `docker images -q`</span><br><span class="line">Untagged: alpine:latest</span><br><span class="line">Untagged: alpine@sha256:bc41182d7ef5ffc53a40b044e725193bc10142a1243f395ee852a8d9730fc2ad</span><br><span class="line">Deleted: sha256:9c6f0724472873bb50a2ae67a9e7adcb57673a183cea8b06eb778dca859181b5</span><br><span class="line">Deleted: sha256:994393dc58e7931862558d06e46aa2bb17487044f670f310dffe1d24e4d1eec7</span><br><span class="line">Untagged: hello-world:latest</span><br><span class="line">Untagged: hello-world@sha256:7d246653d0511db2a6b2e0436cfd0e52ac8c066000264b3ce63331ac66dca625</span><br><span class="line">Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412</span><br><span class="line">Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359</span><br><span class="line">[root@centos7 ~]# docker images</span><br><span class="line">REPOSITORY   TAG       IMAGE ID   CREATED   SIZE</span><br></pre></td></tr></table></figure><h3 id="镜像打标签"><a href="#镜像打标签" class="headerlink" title="镜像打标签"></a>镜像打标签</h3><p>docker tag可以给镜像打标签，类似起别名，但通常要遵守一定的命名规范，才可以上传到指定的仓库</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">格式</span></span><br><span class="line">docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">TARGET_IMAGE[:TAG]格式一般形式</span></span><br><span class="line">仓库主机FQDN或IP[:端口]/项目名（或用户名）/image名字:版本</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">TAG 默认为latest</span></span><br></pre></td></tr></table></figure><p>**总结：**企业使用镜像及常见操作：搜索、下载、导出、导入、删除</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker search centos</span><br><span class="line">docker pull alpine</span><br><span class="line">docker images</span><br><span class="line">docker save &gt; /opt/centos.tar centos</span><br><span class="line">docker load &lt; /opt/centos.tar</span><br><span class="line">docker rmi 镜像ID/镜像名称</span><br></pre></td></tr></table></figure><h2 id="容器操作基础命令"><a href="#容器操作基础命令" class="headerlink" title="容器操作基础命令"></a>容器操作基础命令</h2><p>容器相关命令</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker container</span><br><span class="line"></span><br><span class="line">Usage:  docker container COMMAND</span><br><span class="line"></span><br><span class="line">Manage containers</span><br><span class="line"></span><br><span class="line">Commands:</span><br><span class="line">  attach      Attach local standard input, output, and error streams to a running container</span><br><span class="line">  commit      Create a new image from a container&#x27;s changes</span><br><span class="line">  cp          Copy files/folders between a container and the local filesystem</span><br><span class="line">  create      Create a new container</span><br><span class="line">  diff        Inspect changes to files or directories on a container&#x27;s filesystem</span><br><span class="line">  exec        Run a command in a running container</span><br><span class="line">  export      Export a container&#x27;s filesystem as a tar archive</span><br><span class="line">  inspect     Display detailed information on one or more containers</span><br><span class="line">  kill        Kill one or more running containers</span><br><span class="line">  logs        Fetch the logs of a container</span><br><span class="line">  ls          List containers</span><br><span class="line">  pause       Pause all processes within one or more containers</span><br><span class="line">  port        List port mappings or a specific mapping for the container</span><br><span class="line">  prune       Remove all stopped containers</span><br><span class="line">  rename      Rename a container</span><br><span class="line">  restart     Restart one or more containers</span><br><span class="line">  rm          Remove one or more containers</span><br><span class="line">  run         Run a command in a new container</span><br><span class="line">  start       Start one or more stopped containers</span><br><span class="line">  stats       Display a live stream of container(s) resource usage statistics</span><br><span class="line">  stop        Stop one or more running containers</span><br><span class="line">  top         Display the running processes of a container</span><br><span class="line">  unpause     Unpause all processes within one or more containers</span><br><span class="line">  update      Update configuration of one or more containers</span><br><span class="line">  wait        Block until one or more containers stop, then print their exit codes</span><br><span class="line"></span><br><span class="line">Run &#x27;docker container COMMAND --help&#x27; for more information on a command.</span><br></pre></td></tr></table></figure><h3 id="启动容器"><a href="#启动容器" class="headerlink" title="启动容器"></a>启动容器</h3><p>docker run 可以启动容器，进入到容器，并随机生成容器ID和名称 </p><h4 id="启动第一个容器"><a href="#启动第一个容器" class="headerlink" title="启动第一个容器"></a>启动第一个容器</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker run hello-world</span><br><span class="line"></span><br><span class="line">Hello from Docker!</span><br><span class="line">This message shows that your installation appears to be working correctly.</span><br><span class="line"></span><br><span class="line">To generate this message, Docker took the following steps:</span><br><span class="line"> 1. The Docker client contacted the Docker daemon.</span><br><span class="line"> 2. The Docker daemon pulled the &quot;hello-world&quot; image from the Docker Hub.</span><br><span class="line">    (amd64)</span><br><span class="line"> 3. The Docker daemon created a new container from that image which runs the</span><br><span class="line">    executable that produces the output you are currently reading.</span><br><span class="line"> 4. The Docker daemon streamed that output to the Docker client, which sent it</span><br><span class="line">    to your terminal.</span><br><span class="line"></span><br><span class="line">To try something more ambitious, you can run an Ubuntu container with:</span><br><span class="line"><span class="meta prompt_"> $ </span><span class="language-bash">docker run -it ubuntu bash</span></span><br><span class="line"></span><br><span class="line">Share images, automate workflows, and more with a free Docker ID:</span><br><span class="line"> https://hub.docker.com/</span><br><span class="line"></span><br><span class="line">For more examples and ideas, visit:</span><br><span class="line"> https://docs.docker.com/get-started/</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# docker ps -a</span><br><span class="line">CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                      PORTS     NAMES</span><br><span class="line">46f601445bd8   hello-world   &quot;/hello&quot;   30 seconds ago   Exited (0) 29 seconds ago             festive_sammet</span><br><span class="line">[root@centos7 ~]#</span><br></pre></td></tr></table></figure><h4 id="启动容器的流程"><a href="#启动容器的流程" class="headerlink" title="启动容器的流程"></a>启动容器的流程</h4><img src="https://img.chensir.ink/chensir-pics/202208231234568.png" alt="image-20220823123441440" style="zoom:80%;" /><h4 id="启动容器的用法"><a href="#启动容器的用法" class="headerlink" title="启动容器的用法"></a>启动容器的用法</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker run [选项] [镜像名] [shell命令] [参数]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">选项</span></span><br><span class="line">-iKeep STDIN open even if not attached,通常和-t一起用</span><br><span class="line">-t分配 pseudo-TTY，通常和-i一起使用，注意对应容器必须运行shell才支持进入</span><br><span class="line">-d后台运行，默认前台运行</span><br><span class="line">--name string容器名称</span><br><span class="line">--h,--hostname string容器 hostname</span><br><span class="line">--rm容器关闭后自动删除容器</span><br><span class="line">-p list指定要映射的端口到内部容器开放的端口</span><br><span class="line">-P随机映射端口到内部容器开放的端口（49000~49900）</span><br><span class="line">--dns list设置DNS</span><br><span class="line">--entrypoint string运行指令</span><br><span class="line">--restart policy</span><br><span class="line">-e,--env=[]设置环境变量</span><br><span class="line">--env-file=[]</span><br></pre></td></tr></table></figure><p>-–restart （容器的重启策略）可以指定四种不同的policy</p><ul><li><p>no，默认策略，在容器退出时不重启容器</p></li><li><p>no-failure，在容器非正常退出时（退出状态非0），才会重启容器</p></li><li><p>on-failure&#x3D;3，在容器非正常退出时重启容器，最多重启3次</p></li><li><p>always，在容器退出时总是重启容器</p><p>unless-stopped，在容器退出时总是重启容器，但是不考虑在Docker守护进程启动时就已经停止的容器</p></li></ul><p>**注意：**容器启动后，如果容器内没有前台运行的进程，将自动退出停止</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">运行容器 启动容器时会自动随机字符作为容器名</span></span><br><span class="line">[root@centos7 ~]# docker pull alpine</span><br><span class="line">Using default tag: latest</span><br><span class="line">latest: Pulling from library/alpine</span><br><span class="line">59bf1c3509f3: Pull complete</span><br><span class="line">Digest: sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300</span><br><span class="line">Status: Downloaded newer image for alpine:latest</span><br><span class="line">docker.io/library/alpine:latest</span><br><span class="line">[root@centos7 ~]# docker run alpine</span><br><span class="line">[root@centos7 ~]# docker ps -a</span><br><span class="line">CONTAINER ID   IMAGE     COMMAND     CREATED         STATUS                     PORTS     NAMES</span><br><span class="line">bc5efb3b7f37   alpine    &quot;/bin/sh&quot;   3 seconds ago   Exited (0) 2 seconds ago             elated_villani</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">一次性运行容器中的命令</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">启动容器在执行完shell命令就退出，用于测试</span></span><br><span class="line">[root@centos7 ~]# docker pull busybox</span><br><span class="line">Using default tag: latest</span><br><span class="line">latest: Pulling from library/busybox</span><br><span class="line">5cc84ad355aa: Pull complete</span><br><span class="line">Digest: sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678</span><br><span class="line">Status: Downloaded newer image for busybox:latest</span><br><span class="line">docker.io/library/busybox:latest</span><br><span class="line">[root@centos7 ~]# docker run busybox echo &quot;Hello chensir&quot;</span><br><span class="line">Hello chensir</span><br><span class="line">[root@centos7 ~]# docker ps</span><br><span class="line">CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES</span><br><span class="line">[root@centos7 ~]# docker ps -a</span><br><span class="line">CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES</span><br><span class="line">4ce437d13ae3   busybox   &quot;echo &#x27;Hello chensir&#x27;&quot;   17 seconds ago   Exited (0) 17 seconds ago             optimistic_goldberg</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">指定容器名称</span></span><br><span class="line">[root@centos7 ~]# docker run --name pine alpine</span><br><span class="line">[root@centos7 ~]# docker ps</span><br><span class="line">CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES</span><br><span class="line">[root@centos7 ~]# docker ps -a</span><br><span class="line">CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS                     PORTS     NAMES</span><br><span class="line">9c34dd8204d0   alpine    &quot;/bin/sh&quot;                7 seconds ago   Exited (0) 6 seconds ago             pine</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">运行交互式容器并退出</span></span><br><span class="line">[root@centos7 ~]# docker run -it busybox sh</span><br><span class="line">/ # exit</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">使用<span class="built_in">exit</span>退出容器后 容器也停止了</span></span><br><span class="line">[root@centos7 ~]# docker ps -l</span><br><span class="line">CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                     PORTS     NAMES</span><br><span class="line">4b3203a20472   busybox   &quot;sh&quot;      10 seconds ago   Exited (0) 3 seconds ago             brave_pascal</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# docker run -it busybox sh</span><br><span class="line">/ # </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在容器中 同时按三个键 ctrl+p+q 退出后 容器不会停止</span></span><br><span class="line">[root@centos7 ~]# docker ps</span><br><span class="line">CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES</span><br><span class="line">6ad4551530b5   busybox   &quot;sh&quot;      9 seconds ago   Up 8 seconds             jolly_mestorf</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">设置容器内的主机名</span></span><br><span class="line">[root@centos7 ~]# docker run -it --name a1 -h chensir.ink alpine</span><br><span class="line">/ # hostname</span><br><span class="line">chensir.ink</span><br><span class="line">/ # cat /etc/hosts</span><br><span class="line">127.0.0.1localhost</span><br><span class="line">::1localhost ip6-localhost ip6-loopback</span><br><span class="line">fe00::0ip6-localnet</span><br><span class="line">ff00::0ip6-mcastprefix</span><br><span class="line">ff02::1ip6-allnodes</span><br><span class="line">ff02::2ip6-allrouters</span><br><span class="line">172.17.0.3chensir.ink chensir</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">一次性运行容器，退出后立即删除，用于测试</span></span><br><span class="line">[root@centos7 ~]# docker run --rm alpine cat /etc/issue</span><br><span class="line">Welcome to Alpine Linux 3.15</span><br><span class="line">Kernel \r on an \m (\l)</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# docker ps -a</span><br><span class="line">CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES</span><br></pre></td></tr></table></figure><h5 id="什么是守护式容器"><a href="#什么是守护式容器" class="headerlink" title="什么是守护式容器"></a>什么是守护式容器</h5><ul><li>能够长期运行</li><li>无需交互式会话</li><li>适合运行应用程序和服务</li></ul><h5 id="privileged-选项"><a href="#privileged-选项" class="headerlink" title="privileged 选项"></a>privileged 选项</h5><p>大约在0.6版，—–privileged选项被引入docker。使用该参数，container内的root拥有真正的root权限。否则，container内的root只是外部的一个普通用户权限。privileged启动的容器，可以看到很多host上的设备，并且可以执行mount。甚至允许你在docker容器中启动docker容器。</p><h3 id="查看容器信息"><a href="#查看容器信息" class="headerlink" title="查看容器信息"></a>查看容器信息</h3><h4 id="显示当前存在容器"><a href="#显示当前存在容器" class="headerlink" title="显示当前存在容器"></a>显示当前存在容器</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker ps [OPTIONS]</span><br><span class="line">docker container ls [OPTIONS]</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">选项</span></span><br><span class="line">-aShow all containers (default shows just running)</span><br><span class="line">-qOnly display numeric IDs</span><br><span class="line">-sDisplay total file sizes</span><br><span class="line">-fFilter output based on conditions provided</span><br><span class="line">-lShow the latest created container (includes all states)</span><br><span class="line">-nShow n last created containers (includes all states)</span><br><span class="line">(default -1)</span><br></pre></td></tr></table></figure><p>示例：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">显示运行的容器</span></span><br><span class="line">docker ps</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">显示全部容器，包括退出状态的容器</span></span><br><span class="line">docker ps -a</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">显示全部容器，包括退出状态的容器的 容器ID</span></span><br><span class="line">docker ps -aq</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">显示全部容器，包括退出状态的容器的大小</span></span><br><span class="line">docker ps -as</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">显示最新创建的容器（停止的容器也能显示）</span></span><br><span class="line">docker ps -l</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">显示指定状态的容器</span></span><br><span class="line">docker ps -f &#x27;status=exited&#x27;</span><br><span class="line">docker ps -f &#x27;status=running&#x27;</span><br></pre></td></tr></table></figure><h4 id="查看容器内的进程"><a href="#查看容器内的进程" class="headerlink" title="查看容器内的进程"></a>查看容器内的进程</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker top CONTAINER [PS OPTIONS]</span><br></pre></td></tr></table></figure><p>示例：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker run -d httpd</span><br><span class="line">Unable to find image &#x27;httpd:latest&#x27; locally</span><br><span class="line">latest: Pulling from library/httpd</span><br><span class="line">a2abf6c4d29d: Already exists</span><br><span class="line">dcc4698797c8: Pull complete</span><br><span class="line">41c22baa66ec: Pull complete</span><br><span class="line">67283bbdd4a0: Pull complete</span><br><span class="line">d982c879c57e: Pull complete</span><br><span class="line">Digest: sha256:0954cc1af252d824860b2c5dc0a10720af2b7a3d3435581ca788dff8480c7b32</span><br><span class="line">Status: Downloaded newer image for httpd:latest</span><br><span class="line">ec9e58e706932e56509ce001191e7b52cd5f16b6b1ec25852a2947872aff3cff</span><br><span class="line">[root@centos7 ~]# docker top ec9</span><br><span class="line">UID            PID            PPID           C              STIME          TTY            TIME           CMD</span><br><span class="line">root           15067          15047          0              04:33          ?              00:00:00       httpd -DFOREGROUND</span><br><span class="line">33             15094          15067          0              04:33          ?              00:00:00       httpd -DFOREGROUND</span><br><span class="line">33             15095          15067          0              04:33          ?              00:00:00       httpd -DFOREGROUND</span><br><span class="line">33             15096          15067          0              04:33          ?              00:00:00       httpd -DFOREGROUND</span><br></pre></td></tr></table></figure><h4 id="查看容器资源使用情况"><a href="#查看容器资源使用情况" class="headerlink" title="查看容器资源使用情况"></a>查看容器资源使用情况</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker stats [OPTIONS] [CONTAINER...]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">选项</span></span><br><span class="line">-a,--allShow all containers (default shows just running)</span><br><span class="line"> --format stringPretty-print images using a Go template</span><br><span class="line"> --no-streamDisable streaming stats and only pull the first result</span><br><span class="line"> --no-truncDo not truncate output</span><br></pre></td></tr></table></figure><h4 id="查看容器的详细信息"><a href="#查看容器的详细信息" class="headerlink" title="查看容器的详细信息"></a>查看容器的详细信息</h4><p>docker inspect 可以查看docker各种对象的详细信息，包括：镜像，容器，网络等</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker inspect [OPTIONS] NAME|ID [NAME|ID...]</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">选项</span></span><br><span class="line">-f string  Format the output using the given Go trmplate</span><br><span class="line">-s         Display total file sizes if the type is container</span><br></pre></td></tr></table></figure><h3 id="删除容器"><a href="#删除容器" class="headerlink" title="删除容器"></a>删除容器</h3><p>docker rm 可以删除容器</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker rm [OPTIONS] CONTAINER [CONTAINER...]</span><br><span class="line">docker container rm [OPTIONS] CONTAINER [CONTAINER...]</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">选项</span></span><br><span class="line">-f      Force the removal of a running container (uses SIGKILL)</span><br><span class="line">-vRemove</span><br></pre></td></tr></table></figure><p>示例：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">删除所有的容器</span></span><br><span class="line">docker rm -f `docker ps -aq`</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">删除指定状态的容器</span></span><br><span class="line">docker rm -f `docker ps -qf status=exited`</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">删除所有停止的容器</span></span><br><span class="line">docker container prune -f</span><br></pre></td></tr></table></figure><h3 id="容器的启动和停止"><a href="#容器的启动和停止" class="headerlink" title="容器的启动和停止"></a>容器的启动和停止</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker start|stop|restart|pause|unpause 容器ID</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">批量正常启动或关闭所有容器</span></span><br><span class="line">docker start `docker ps -qa`</span><br><span class="line">docker stop `docker ps -qa`</span><br></pre></td></tr></table></figure><h3 id="给正在运行的容器发信号"><a href="#给正在运行的容器发信号" class="headerlink" title="给正在运行的容器发信号"></a>给正在运行的容器发信号</h3><p>docekr kill 可以给容器发信号，默认SIGKILL，即9</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker kill [OPTIONS] CONTAINER [CONTAINER...]</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">选项</span></span><br><span class="line">-s string Signal to send to the container (default &quot;KILL&quot;)</span><br></pre></td></tr></table></figure><p>示例：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">关闭容器</span></span><br><span class="line">docker kill nginx</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">强制关闭所有容器</span></span><br><span class="line">docker kill `docker ps -qa`</span><br></pre></td></tr></table></figure><h3 id="进入正在运行的容器"><a href="#进入正在运行的容器" class="headerlink" title="进入正在运行的容器"></a>进入正在运行的容器</h3><h4 id="使用attach命令"><a href="#使用attach命令" class="headerlink" title="使用attach命令"></a>使用attach命令</h4><p>docker attach 容器名，attach类似于vnc，操作会在同一个容器的多个会话界面同步显示，所有使用此方式进入容器的操作都是同步显示的，且使用exit退出后容器自动关闭，<strong>不推荐使用</strong>，需要进入到有shell环境的容器</p><h4 id="使用exec命令"><a href="#使用exec命令" class="headerlink" title="使用exec命令"></a>使用exec命令</h4><p>在运行中的容器启动新进程可以执行单次命令及进入容器，测试环境使用此方式，使用exit退出，容器还在运行，<strong>推荐此方式</strong></p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker exec [OPTIONS] CONTAINER COMMAND [ARG...]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">常用选项</span></span><br><span class="line">-dDetached mode:run command in the background</span><br><span class="line">-eSet environment variables</span><br><span class="line">-iKeep STDIN open even if not attached</span><br><span class="line">-tAllocate a psedu-TTY</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">常见用法</span></span><br><span class="line">docker exec -it 容器ID sh|bash</span><br></pre></td></tr></table></figure><h4 id="使用nsenter命令"><a href="#使用nsenter命令" class="headerlink" title="使用nsenter命令"></a>使用nsenter命令</h4><p>nsenter命令需要通过PID进入到容器内部，且退出后仍能正常运行，不过需要事先使用docker inspect 获取到容器的PID，目前凡是使用较少，此工具来自于until-linux包</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装nsenter命令</span></span><br><span class="line">yum install -y util-linux</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">获取容器的IP</span></span><br><span class="line">docker inspect -f &quot;&#123;&#123;.NetworkSettings.IPAddress&#125;&#125;&quot; 容器ID</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">获取容器的PID，通过PID进入到容器内</span></span><br><span class="line">docker inspect -f &quot;&#123;&#123;.State.Pid&#125;&#125;&quot; 容器ID</span><br><span class="line">nsenter -t Pid -m -u -i -n -p</span><br></pre></td></tr></table></figure><h4 id="脚本方式"><a href="#脚本方式" class="headerlink" title="脚本方式"></a>脚本方式</h4><p>将nsenter命令写入到脚本进行调用，方便进入容器看日志或排错</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">cat docker-in.sh</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line">docker_in()&#123;</span><br><span class="line">NAME_ID=$1</span><br><span class="line">PID=$(docker inspect -f &quot;&#123;&#123;.State.Pid&#125;&#125;&quot; $&#123;NAME_ID&#125;)</span><br><span class="line">nsenter -t $&#123;PID&#125; -m -u -i -n -p</span><br><span class="line">&#125;</span><br><span class="line">docker_in $1</span><br></pre></td></tr></table></figure><p>示例</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# vim docker-in.sh</span><br><span class="line">[root@centos7 ~]# cat docker-in.sh</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line">docker_in()&#123;</span><br><span class="line">NAME_ID=$1</span><br><span class="line">PID=$(docker inspect -f &quot;&#123;&#123;.State.Pid&#125;&#125;&quot; $&#123;NAME_ID&#125;)</span><br><span class="line">nsenter -t $&#123;PID&#125; -m -u -i -n -p</span><br><span class="line">&#125;</span><br><span class="line">docker_in $1</span><br><span class="line">[root@centos7 ~]# chmod +x docker-in.sh</span><br><span class="line">[root@centos7 ~]# docker ps</span><br><span class="line">CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES</span><br><span class="line">fd056baa9925   nginx     &quot;/docker-entrypoint.…&quot;   39 minutes ago   Up 38 minutes   80/tcp    nginx03</span><br><span class="line">4fb4c31a6342   nginx     &quot;/docker-entrypoint.…&quot;   39 minutes ago   Up 38 minutes   80/tcp    nginx01</span><br><span class="line">[root@centos7 ~]# ./docker-in.sh fd05</span><br><span class="line">root@fd056baa9925:/# exit</span><br><span class="line">logout</span><br><span class="line">[root@centos7 ~]# docker ps</span><br><span class="line">CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES</span><br><span class="line">fd056baa9925   nginx     &quot;/docker-entrypoint.…&quot;   40 minutes ago   Up 39 minutes   80/tcp    nginx03</span><br><span class="line">4fb4c31a6342   nginx     &quot;/docker-entrypoint.…&quot;   40 minutes ago   Up 39 minutes   80/tcp    nginx01</span><br></pre></td></tr></table></figure><h3 id="暴露所有容器端口"><a href="#暴露所有容器端口" class="headerlink" title="暴露所有容器端口"></a>暴露所有容器端口</h3><p>容器启动后，默认处于预定义的NAT网络中，所以外部网络的主机无法直接访问容器中网络服务</p><p>docker run -P 可以将事先容器预定义的所有端口映射宿主机的网卡的随机端口</p><p>使用随机端口时，当停止容器后在启动可能会导致端口发生变化</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例 映射容器所有暴露端口至随机本地端口</span></span><br><span class="line">docker run -d -P nginx</span><br></pre></td></tr></table></figure><p>docker port 可以查看容器的端口映射关系</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker port CONTAINER [PRIVATE_PORT[/PROTO]]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例</span></span><br><span class="line">docker port nginx01</span><br><span class="line">docker port nginx01 53/udp</span><br></pre></td></tr></table></figure><h3 id="指定端口映射"><a href="#指定端口映射" class="headerlink" title="指定端口映射"></a>指定端口映射</h3><p>docker run -p 可以将容器的预定义的指定端口映射到宿主机的相应端口</p><p>注意：多个容器映射到宿主机端口不能冲突，但容器内使用的端口可以相同</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">方式1：容器80端口映射到宿主机本地随机端口</span></span><br><span class="line">docker run -p 80 --name nginx-test-port1 nginx</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">方式2：容器80端口映射到宿主机本地端口81</span></span><br><span class="line">docker run -p 81:80 --name nginx-test-port2 nginx</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">方式3：宿主机本地IP：宿主机本地端口：容器端口</span></span><br><span class="line">docker run -p 10.0.0.100:82:80 --name nginx-test-port3 nginx</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">方式4：宿主机本地IP：苏知机本地随机端口：容器端口</span></span><br><span class="line">docker run -p 10.0.0.100::80 --name nginx-test-port4 nginx</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">方式5：宿主机本机IP：宿主机本地端口：容器端口/协议，默认为tcp协议</span></span><br><span class="line">docker run -p 10.0.0.100:83:80/udp --name nginx-test-port5 nginx</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">方式6：一次映射多个端口+协议</span></span><br><span class="line">docker run -p 8080:80/tcp -p 8443:443/tcp -p 53:53/udp --name-test-port6 nginx </span><br></pre></td></tr></table></figure><p>修改已经创建的容器的端口映射关系</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker run -d -p 80:80 --name nginx01 nginx</span><br><span class="line">cd1db7f176806254fdf3089f32fcbd0094ec376ea3d8d4e481093cad353d9d48</span><br><span class="line">[root@centos7 ~]# docker ps</span><br><span class="line">CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                               NAMES</span><br><span class="line">cd1db7f17680   nginx     &quot;/docker-entrypoint.…&quot;   2 minutes ago   Up 2 minutes   0.0.0.0:80-&gt;80/tcp, :::80-&gt;80/tcp   nginx01</span><br><span class="line">[root@centos7 ~]# ll /var/lib/docker/containers/cd1db7f176806254fdf3089f32fcbd0094ec376ea3d8d4e481093cad353d9d48/</span><br><span class="line">总用量 28</span><br><span class="line">-rw-r----- 1 root root 2302 8月  23 08:29 cd1db7f176806254fdf3089f32fcbd0094ec376ea3d8d4e481093cad353d9d48-json.log</span><br><span class="line">drwx------ 2 root root    6 8月  23 08:29 checkpoints</span><br><span class="line">-rw------- 1 root root 2904 8月  23 08:29 config.v2.json</span><br><span class="line">-rw-r--r-- 1 root root 1512 8月  23 08:29 hostconfig.json</span><br><span class="line">-rw-r--r-- 1 root root   13 8月  23 08:29 hostname</span><br><span class="line">-rw-r--r-- 1 root root  174 8月  23 08:29 hosts</span><br><span class="line">drwx--x--- 2 root root    6 8月  23 08:29 mounts</span><br><span class="line">-rw-r--r-- 1 root root   69 8月  23 08:29 resolv.conf</span><br><span class="line">-rw-r--r-- 1 root root   71 8月  23 08:29 resolv.conf.hash</span><br><span class="line">[root@centos7 ~]# systemctl stop docker</span><br><span class="line">[root@centos7 ~]# vim /var/lib/docker/containers/cd1db7f176806254fdf3089f32fcbd0094ec376ea3d8d4e481093cad353d9d48/hostconfig.json</span><br><span class="line">&quot;PortBindings&quot;:&#123;&quot;80/tcp&quot;:[&#123;&quot;HostIp&quot;:&quot;&quot;,&quot;HostPort&quot;:&quot;80&quot;&#125;]&#125;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">PortBindings 后面的 80/tcp 对应的是容器内部的80端口，HostPort对应的是映射到宿主机的端口80，修改此处为8000</span></span><br><span class="line">&quot;PortBindings&quot;:&#123;&quot;80/tcp&quot;:[&#123;&quot;HostIp&quot;:&quot;&quot;,&quot;HostPort&quot;:&quot;8000&quot;&#125;]&#125;</span><br><span class="line">[root@centos7 ~]# systemctl start docker</span><br><span class="line">[root@centos7 ~]# docker port nginx01</span><br><span class="line">80/tcp -&gt; 0.0.0.0:8000</span><br><span class="line">80/tcp -&gt; :::8000</span><br></pre></td></tr></table></figure><h3 id="查看容器的日志"><a href="#查看容器的日志" class="headerlink" title="查看容器的日志"></a>查看容器的日志</h3><p>docker logs 可以查看容器中运行的进程在控制台输出的日志信息</p><p>格式</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker logs [OPTIONS] CONTAINER</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">选项：</span></span><br><span class="line">--detailsShow extra details provided to logs</span><br><span class="line">-f,--followFollow log output</span><br><span class="line">--since stringShow logs since timestamp</span><br><span class="line">--tail stringNumber of lines to show from the end of the logs (default &quot;all&quot;)</span><br><span class="line">-t,--timestampsShow timestamps</span><br><span class="line">--until stringShow logs before a timestamp</span><br></pre></td></tr></table></figure><p>示例</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看所有日志</span></span><br><span class="line">docker logs 容器ID</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看倒数几行的日志</span></span><br><span class="line">docker logs --tail 行数 容器ID</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">显示日志时间</span></span><br><span class="line">docker logs --tail 行数 -t  容器ID</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">持续跟踪日志</span></span><br><span class="line">docker logs -f 容器ID</span><br></pre></td></tr></table></figure><h3 id="传递运行命令"><a href="#传递运行命令" class="headerlink" title="传递运行命令"></a>传递运行命令</h3><p>容器需要有一个前台运行的进程才能保持容器的运行，通过传递运行参数是一种方式，另外也可以在构建镜像的时候指定容器启动时运行的前台命令</p><p>容器里的PID为1的守护进程的实现方式</p><ul><li>服务类：如：Nginx，Tomcat，Apache，但服务不能停</li><li>命令类：如：tail -f &#x2F;etc&#x2F;hosts，主要用于测试环境，注意 tail -f &lt;服务访问日志&gt;会产生不必要的磁盘IO</li></ul><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker run -d alpine</span><br><span class="line">fc8dc5bee8367725a759f15417316a619b098af88f1ad7f7113fa314dd6e3f34</span><br><span class="line">[root@centos7 ~]# docker ps -a</span><br><span class="line">CONTAINER ID   IMAGE     COMMAND     CREATED         STATUS                     PORTS     NAMES</span><br><span class="line">fc8dc5bee836   alpine    &quot;/bin/sh&quot;   6 seconds ago   Exited (0) 5 seconds ago             exciting_chebyshev</span><br><span class="line">[root@centos7 ~]# docker run -d alpine tail -f /etc/hosts</span><br><span class="line">05a4c6863bcc9d7c4b9f0abeec2316a9cce0f0e3f2aeb37bfa57fcd2bcdf8d52</span><br><span class="line">[root@centos7 ~]# docker ps</span><br><span class="line">CONTAINER ID   IMAGE     COMMAND                CREATED         STATUS        PORTS     NAMES</span><br><span class="line">05a4c6863bcc   alpine    &quot;tail -f /etc/hosts&quot;   2 seconds ago   Up 1 second             vigilant_lumiere</span><br><span class="line">[root@centos7 ~]# docker exec -it 05a sh</span><br><span class="line">/ # ps aux</span><br><span class="line">PID   USER     TIME  COMMAND</span><br><span class="line">    1 root      0:00 tail -f /etc/hosts</span><br><span class="line">    7 root      0:00 sh</span><br><span class="line">   13 root      0:00 ps aux</span><br><span class="line">[root@centos7 ~]# docker ps -a</span><br><span class="line">CONTAINER ID   IMAGE     COMMAND                CREATED              STATUS                          PORTS     NAMES</span><br><span class="line">05a4c6863bcc   alpine    &quot;tail -f /etc/hosts&quot;   About a minute ago   Up About a minute                         vigilant_lumiere</span><br></pre></td></tr></table></figure><h3 id="容器内部的hosts文件"><a href="#容器内部的hosts文件" class="headerlink" title="容器内部的hosts文件"></a>容器内部的hosts文件</h3><p>容器会自动将容器的ID加入自己的&#x2F;etc&#x2F;hosts文件中，并解析成容器的IP</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker run -it centos /bin/bash</span><br><span class="line">[root@8f4c940da642 /]# cat /etc/hosts</span><br><span class="line">127.0.0.1localhost</span><br><span class="line">::1localhost ip6-localhost ip6-loopback</span><br><span class="line">fe00::0ip6-localnet</span><br><span class="line">ff00::0ip6-mcastprefix</span><br><span class="line">ff02::1ip6-allnodes</span><br><span class="line">ff02::2ip6-allrouters</span><br><span class="line">172.17.0.38f4c940da642  # 默认会将实例的ID 添加到自己的hosts文件</span><br><span class="line">[root@8f4c940da642 /]# hostname</span><br><span class="line">8f4c940da642</span><br><span class="line">[root@8f4c940da642 /]# ping 8f4c940da642</span><br><span class="line">PING 8f4c940da642 (172.17.0.3) 56(84) bytes of data.</span><br><span class="line">64 bytes from 8f4c940da642 (172.17.0.3): icmp_seq=1 ttl=64 time=0.071 ms</span><br><span class="line">64 bytes from 8f4c940da642 (172.17.0.3): icmp_seq=2 ttl=64 time=0.059 ms</span><br><span class="line">64 bytes from 8f4c940da642 (172.17.0.3): icmp_seq=3 ttl=64 time=0.058 ms</span><br><span class="line">^C</span><br><span class="line">--- 8f4c940da642 ping statistics ---</span><br><span class="line">3 packets transmitted, 3 received, 0% packet loss, time 2005ms</span><br><span class="line">rtt min/avg/max/mdev = 0.058/0.062/0.071/0.010 ms</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">修改容器的hosts文件</span></span><br><span class="line">[root@centos7 ~]# docker run -it --rm --add-host chensir.ink:8.8.8.8 --add-host chensir.com:6.6.6.6 busybox</span><br><span class="line">/ # cat /etc/hosts</span><br><span class="line">127.0.0.1localhost</span><br><span class="line">::1localhost ip6-localhost ip6-loopback</span><br><span class="line">fe00::0ip6-localnet</span><br><span class="line">ff00::0ip6-mcastprefix</span><br><span class="line">ff02::1ip6-allnodes</span><br><span class="line">ff02::2ip6-allrouters</span><br><span class="line">8.8.8.8chensir.ink</span><br><span class="line">6.6.6.6chensir.com</span><br><span class="line">172.17.0.44397ad2a1497</span><br><span class="line">/ # ping chensir.ink</span><br><span class="line">PING chensir.ink (8.8.8.8): 56 data bytes</span><br><span class="line">64 bytes from 8.8.8.8: seq=0 ttl=127 time=70.911 ms</span><br><span class="line">64 bytes from 8.8.8.8: seq=1 ttl=127 time=69.407 ms</span><br><span class="line">64 bytes from 8.8.8.8: seq=2 ttl=127 time=64.564 ms</span><br><span class="line">64 bytes from 8.8.8.8: seq=3 ttl=127 time=69.504 ms</span><br><span class="line">^C</span><br><span class="line">--- chensir.ink ping statistics ---</span><br><span class="line">4 packets transmitted, 4 packets received, 0% packet loss</span><br><span class="line">round-trip min/avg/max = 64.564/68.596/70.911 ms</span><br><span class="line">/ # ping chensir.com</span><br><span class="line">PING chensir.com (6.6.6.6): 56 data bytes</span><br><span class="line">^C</span><br><span class="line">--- chensir.com ping statistics ---</span><br><span class="line">2 packets transmitted, 0 packets received, 100% packet loss</span><br></pre></td></tr></table></figure><h3 id="指定容器DNS"><a href="#指定容器DNS" class="headerlink" title="指定容器DNS"></a>指定容器DNS</h3><p>容器的dns服务器，采用宿主机的dns地址，可以用下面方式指定其他的DNS地址</p><ul><li>将dns地址配置在宿主机</li><li>在容器启动时加选项 <code>--dns=x.x.x.x</code></li><li>在&#x2F;etc&#x2F;docker&#x2F;daemon.json 文件中指定</li></ul><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">容器的DNS默认从宿主机的DNS获取</span></span><br><span class="line">[root@centos7 ~]# cat /etc/resolv.conf</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Generated by NetworkManager</span></span><br><span class="line">search localdomain</span><br><span class="line">nameserver 10.0.0.1</span><br><span class="line">[root@centos7 ~]#</span><br><span class="line">[root@centos7 ~]# docker run -it --rm centos sh</span><br><span class="line">sh-4.4# cat /etc/resolv.conf</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Generated by NetworkManager</span></span><br><span class="line">search localdomain</span><br><span class="line">nameserver 10.0.0.1</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">指定DNS地址</span></span><br><span class="line">[root@centos7 ~]# docker run -it --rm --dns 1.1.1.1 --dns 8.8.8.8 centos bash</span><br><span class="line">[root@3e9468f64df2 /]# cat /etc/resolv.conf</span><br><span class="line">search localdomain</span><br><span class="line">nameserver 1.1.1.1</span><br><span class="line">nameserver 8.8.8.8</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">指定domain名</span></span><br><span class="line">[root@centos7 ~]# docker run -it --rm --dns 1.1.1.1 --dns 8.8.8.8 --dns-search a.com --dns-search b.com busybox</span><br><span class="line">/ # cat /etc/resolv.conf</span><br><span class="line">search a.com b.com</span><br><span class="line">nameserver 1.1.1.1</span><br><span class="line">nameserver 8.8.8.8</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">配置文件指定DNS和搜索domain名</span></span><br><span class="line">[root@centos7 ~]# vim /etc/docker/daemon.json</span><br><span class="line">&#123;</span><br><span class="line">  &quot;storage-driver&quot;: &quot;overlay2&quot;,</span><br><span class="line">  &quot;registry-mirrors&quot;: [</span><br><span class="line">    &quot;https://docker.mirrors.ustc.edu.cn&quot;</span><br><span class="line">  ],</span><br><span class="line">  &quot;dns&quot;: [</span><br><span class="line">    &quot;114.114.114.114&quot;,</span><br><span class="line">    &quot;8.8.8.8&quot;</span><br><span class="line">  ],</span><br><span class="line">  &quot;dns-search&quot;: [</span><br><span class="line">    &quot;chensir.ink&quot;,</span><br><span class="line">    &quot;chensir.xyz&quot;</span><br><span class="line">  ]</span><br><span class="line">&#125;</span><br><span class="line">[root@centos7 ~]# systemctl restart docker</span><br><span class="line">[root@centos7 ~]# cat /etc/resolv.conf</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Generated by NetworkManager</span></span><br><span class="line">search localdomain</span><br><span class="line">nameserver 10.0.0.1</span><br><span class="line">[root@centos7 ~]# docker run -it centos bash</span><br><span class="line">[root@8d3436934bb1 /]# cat /etc/resolv.conf</span><br><span class="line">search chensir.ink chensir.xyz</span><br><span class="line">nameserver 114.114.114.114</span><br><span class="line">nameserver 8.8.8.8</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">用--dns指定优先级高</span></span><br><span class="line">[root@centos7 ~]# docker run -it --rm --dns 8.8.4.4 centos bash</span><br><span class="line">c[root@61c97fb7deb7 /]# cat /etc/resolv.conf</span><br><span class="line">search chensir.ink chensir.xyz</span><br><span class="line">nameserver 8.8.4.4</span><br></pre></td></tr></table></figure><h3 id="容器内和宿主机之间复制文件"><a href="#容器内和宿主机之间复制文件" class="headerlink" title="容器内和宿主机之间复制文件"></a>容器内和宿主机之间复制文件</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker cp [OPTION] CONTAINER:SRC_PATH DEST_PATH|-</span><br><span class="line">dpcker cp [OPTION] SRC_PATH|- CONTAINER:DEST_PATH</span><br><span class="line">Options:</span><br><span class="line">-a,--archiveArchive mode (copy all uid/gid information)</span><br><span class="line">-L,--follow-linkAlways follow symbol link in SRC_PATH</span><br></pre></td></tr></table></figure><h3 id="使用systemd控制容器运行"><a href="#使用systemd控制容器运行" class="headerlink" title="使用systemd控制容器运行"></a>使用systemd控制容器运行</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# vim /etc/systemd/system/hello.service</span><br><span class="line">[Unit]</span><br><span class="line">Description=Hello world</span><br><span class="line">Description=Hello world</span><br><span class="line">After=docker.service</span><br><span class="line">Requires=docker.service</span><br><span class="line">[Service]</span><br><span class="line">TimeoutStartSec=0</span><br><span class="line">ExecStartPre=-/usr/bin/docker kill busybox-hello</span><br><span class="line">ExecStartPre=-/usr/bin/docker rm busybox-hello</span><br><span class="line">ExecStartPre=-/usr/bin/docker pull busybox</span><br><span class="line">ExecStart=/usr/bin/docker run --name busybox-hello busybox /bin/sh -c &quot;while true;do echo Hello world; sleep 1; done&quot;</span><br><span class="line">ExecStop=/usr/bin/docker kill busybox-hello</span><br><span class="line">[Install]</span><br><span class="line">wantedBy=multi-user.target</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# systemctl daemon-reload</span><br><span class="line">[root@centos7 ~]# systemctl enable --now hello.service</span><br></pre></td></tr></table></figure><h3 id="传递环境变量"><a href="#传递环境变量" class="headerlink" title="传递环境变量"></a>传递环境变量</h3><p>有些容器运行时，需要传递变量，可以使用 -e &lt;参数&gt; 或 - - env-file &lt;参数文件&gt; 实现</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker run --name mysql01 mysql:5.7.31</span><br><span class="line">WARNING: IPv4 forwarding is disabled. Networking will not work.</span><br><span class="line">2022-08-23 02:08:23+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.31-1debian10 started.</span><br><span class="line">2022-08-23 02:08:23+00:00 [Note] [Entrypoint]: Switching to dedicated user &#x27;mysql&#x27;</span><br><span class="line">2022-08-23 02:08:23+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.31-1debian10 started.</span><br><span class="line">2022-08-23 02:08:23+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified</span><br><span class="line">You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# docker run --name mysql-test1 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wpuser -e MYSQL_PASSWORD=123456 -d -p 3306:3306 mysql:5.7.31</span><br><span class="line">WARNING: IPv4 forwarding is disabled. Networking will not work.</span><br><span class="line">ba743ba4068b36c7b2ff804decbb0c5f22aaa8ab0b20ce8bc4c4380ccc990674</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# docker run --name mysql-test2 -v /root/mysql/:/etc/conf.d -v /data/mysql2:/var/lib/mysql --env-file=env.list -d -p 3307:33077 mysql:5.7.31</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# cat /root/mysql/mysql-test.cnf</span><br><span class="line">[mysqld]</span><br><span class="line">server-id=100</span><br><span class="line">log-bin=mysql-bin</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# cat env.list</span><br><span class="line">MYSQL_ROOT_PASSWORD=123456</span><br><span class="line">MYSQL_DATABASE=wordpress</span><br><span class="line">MYSQL_USER=wpuser</span><br><span class="line">MYSQL_PASSWORD=wppass</span><br></pre></td></tr></table></figure><h1 id="Docker镜像制作和管理"><a href="#Docker镜像制作和管理" class="headerlink" title="Docker镜像制作和管理"></a>Docker镜像制作和管理</h1><h2 id="Docker镜像说明"><a href="#Docker镜像说明" class="headerlink" title="Docker镜像说明"></a>Docker镜像说明</h2><h3 id="Docker镜像中有没有内核"><a href="#Docker镜像中有没有内核" class="headerlink" title="Docker镜像中有没有内核"></a>Docker镜像中有没有内核</h3><p>从镜像大小上来说，一个比较小的镜像只有1M多点或者几M，而内核文件需要几十M，因此镜像里面是没有内核的，镜像在被启动为容器后将直接使用宿主机的内核，而镜像本身则只提供相应的rootfs，即系统正常运行所必须的用户空间的文件系统，比如：&#x2F;dev&#x2F;，&#x2F;proc，&#x2F;bin，&#x2F;etc等目录，容器当中&#x2F;boot目录时空的，而&#x2F;boot当中保存的就是与内核相关的文件和目录。</p><h3 id="为什么没有内核"><a href="#为什么没有内核" class="headerlink" title="为什么没有内核"></a>为什么没有内核</h3><p>由于容器启动和运行过程中是直接使用了宿主机的内核，不会直接调用物理硬件，所以不会涉及到硬件驱动，因此也无需容器内拥有自己的内核和驱动。而如果使用虚拟机技术，对应每个虚拟机都有自己独立的内核。</p><h3 id="容器中的程序后台运行会导致此容器启动后立即退出"><a href="#容器中的程序后台运行会导致此容器启动后立即退出" class="headerlink" title="容器中的程序后台运行会导致此容器启动后立即退出"></a>容器中的程序后台运行会导致此容器启动后立即退出</h3><p>Docker容器如果希望启动后能持续运行，就必须有一个能前台持续运行的进程，如果在容器中启动系统的服务，如：httpd，php-fpm等均为后台进程模式运行，就导致docker在前台没有运行的应用，这样的容器启动后会立即退出。所以一般会将服务程序以前台方式运行，对于有一些可能不知道怎么实现前台运行的程序，只需要在你启动的该程序之后添加类似于tail，top这种可以前台运行的程序即可。比较常用的方法，如 tail -f &#x2F;etc&#x2F;hosts 。</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">httpd</span></span><br><span class="line">ENTRYPOINT [&quot;/usr/sbin/apache2&quot;]</span><br><span class="line">CMD [&quot;-D&quot;,&quot;FOREGROUND&quot;]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">nginx</span></span><br><span class="line">ENTRYPOINT [&quot;/usr/sbin/nginx&quot;,&quot;-g&quot;,&quot;daemon off;&quot;]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">用脚本运行容器</span></span><br><span class="line">cat run_haproxy.sh</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line">haproxy -f /etc/haproxy/haproxy.cfg</span><br><span class="line">tail -f /etc/hosts</span><br><span class="line"></span><br><span class="line">tail -n1 Dockerfile</span><br><span class="line">CMD [&quot;run_haproxy.sh&quot;]</span><br></pre></td></tr></table></figure><h3 id="docker镜像生命周期"><a href="#docker镜像生命周期" class="headerlink" title="docker镜像生命周期"></a>docker镜像生命周期</h3><p><img src="https://img.chensir.ink/chensir-pics/202208241144373.png" alt="image-20220824114409305"></p><h3 id="制作镜像方式"><a href="#制作镜像方式" class="headerlink" title="制作镜像方式"></a>制作镜像方式</h3><p>Docker镜像制作类似于虚拟机的镜像（模板）制作，即按照公司的实际业务需求将需要安装的软件、相关配置等基础环境配置完成，然后将其做成镜像，最后再从镜像批量生成容器实例，这样可以极大的简化相同环境的部署工作</p><p>Docker的镜像制作分为手动制作（基于容器）和自动制作（基于Dockerfile），企业通常都是基于Dockerfile制作镜像</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">通过修改现有容器，将之手动构建为镜像</span></span><br><span class="line">docker commit</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">通过Dockerfile文件，批量构建为镜像</span></span><br><span class="line">docker build</span><br></pre></td></tr></table></figure><h2 id="将现有容器通过docker-commit手动构建镜像"><a href="#将现有容器通过docker-commit手动构建镜像" class="headerlink" title="将现有容器通过docker commit手动构建镜像"></a>将现有容器通过docker commit手动构建镜像</h2><h3 id="基于容器手动制作镜像步骤"><a href="#基于容器手动制作镜像步骤" class="headerlink" title="基于容器手动制作镜像步骤"></a>基于容器手动制作镜像步骤</h3><p>docker commit</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker commit [OPTION] CONTAINER [REPOSITORY[:TAG]]</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">选项</span></span><br><span class="line">-a,--author stringAuthor</span><br><span class="line">-c,--change listApply Dockerfile instruction to the created image</span><br><span class="line">-m,--message stringCommit message</span><br><span class="line">-p,--pausePause container during commit (default true)</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">说明</span></span><br><span class="line">制作镜像和CONTAINER状态无关，停止状态也可以制作镜像</span><br><span class="line">如果没有指定[REPOSITORY[:TAG]]，REPOSITORY和TAG都为&lt;none&gt;</span><br><span class="line">提交的时候标记TAG号：生产中常用，后期可以根据TAG标记创建不同版本的镜像以及创建不同版本的容器</span><br></pre></td></tr></table></figure><p>基于容器手动制作镜像步骤具体如下：</p><p>1.下载一个系统的官方基础镜像，如：CentOS 或 Ubuntu</p><p>2.基于基础镜像启动一个容器，并进入到容器</p><p>3.在容器里面做配置操作</p><ul><li>安装基础命令</li><li>配置运行环境</li><li>安装服务和配置服务</li><li>放业务程序和代码</li></ul><p>4.提交为一个新镜像 docker commit</p><p>5.基于自己的镜像创建容器并测试访问</p><h3 id="基于busybox制作httpd镜像"><a href="#基于busybox制作httpd镜像" class="headerlink" title="基于busybox制作httpd镜像"></a>基于busybox制作httpd镜像</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker run -it --name b1 busybox</span><br><span class="line">WARNING: IPv4 forwarding is disabled. Networking will not work.</span><br><span class="line">/ # ls</span><br><span class="line">bin   dev   etc   home  proc  root  sys   tmp   usr   var</span><br><span class="line">/ # mkdir /data/html -p</span><br><span class="line">/ # echo httpd website in busybox &gt; /data/html/index.html</span><br><span class="line">/ # httpd --help</span><br><span class="line">BusyBox v1.34.1 (2021-12-29 21:12:15 UTC) multi-call binary.</span><br><span class="line"></span><br><span class="line">Usage: httpd [-ifv[v]] [-c CONFFILE] [-p [IP:]PORT] [-u USER[:GRP]] [-r REALM] [-h HOME]</span><br><span class="line">or httpd -d/-e/-m STRING</span><br><span class="line"></span><br><span class="line">Listen for incoming HTTP requests</span><br><span class="line"></span><br><span class="line">-iInetd mode</span><br><span class="line">-fDon&#x27;t daemonize</span><br><span class="line">-v[v]Verbose</span><br><span class="line">-p [IP:]PORTBind to IP:PORT (default *:80)</span><br><span class="line">-u USER[:GRP]Set uid/gid after binding to port</span><br><span class="line">-r REALMAuthentication Realm for Basic Authentication</span><br><span class="line">-h HOMEHome directory (default .)</span><br><span class="line">-c FILEConfiguration file (default &#123;/etc,HOME&#125;/httpd.conf)</span><br><span class="line">-m STRINGMD5 crypt STRING</span><br><span class="line">-e STRINGHTML encode STRING</span><br><span class="line">-d STRINGURL decode STRING</span><br><span class="line">/ # exit</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">格式1：</span></span><br><span class="line">[root@centos7 ~]# docker commit -a &quot;chensir&lt;root@chensir.ink&gt;&quot; -c &#x27;CMD /bin/httpd -fv -h /data/html&#x27; -c &quot;EXPOSE 80&quot; b1 httpd-busybox:v1.0</span><br><span class="line">sha256:0b59f1b5b2b1dca5f0386098a558b09593f652761c8a40e8723abdba2a0b43ce</span><br><span class="line">[root@centos7 ~]# docker images</span><br><span class="line">REPOSITORY      TAG       IMAGE ID       CREATED         SIZE</span><br><span class="line">httpd-busybox   v1.0      0b59f1b5b2b1   4 seconds ago   1.24MB</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">格式2：</span></span><br><span class="line">[root@centos7 ~]# docker commit -a &quot;chensir&lt;root@chenisr.ink&gt;&quot; -c &#x27;CMD [&quot;/bin/httpd&quot;,&quot;-f&quot;,&quot;-v&quot;,&quot;-h&quot;,&quot;/data/html&quot;]&#x27; -c &quot;EXPOSE 80&quot; b1 httpd-busybox:v1.0</span><br><span class="line">sha256:4100f91eb2e4949651fa401949791c746e34ae65e35fdbf456aa3bd55d703c72</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# docker run -d -P --name httpd01 httpd-busybox:v1.0</span><br><span class="line">WARNING: IPv4 forwarding is disabled. Networking will not work.</span><br><span class="line">5a68de75aa05b374faeef9e08de92ffa3679cfaa240700f6ff1614576e24f3c4</span><br><span class="line">[root@centos7 ~]# docker port httpd01</span><br><span class="line">80/tcp -&gt; 0.0.0.0:49157</span><br><span class="line">80/tcp -&gt; :::49157</span><br><span class="line">[root@centos7 ~]# docker inspect -f &quot;&#123;&#123;.NetworkSettings.Networks.bridge.IPAddress&#125;&#125;&quot; httpd01</span><br><span class="line">172.17.0.2</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">对应格式1</span></span><br><span class="line">[root@centos7 ~]# docker inspect -f &quot;&#123;&#123;.Config.Cmd&#125;&#125;&quot; httpd01</span><br><span class="line">[/bin/sh -c /bin/httpd -fv -h /data/html]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">对应格式2</span></span><br><span class="line">[root@centos7 ~]# docker inspect -f &quot;&#123;&#123;.Config.Cmd&#125;&#125;&quot; httpd01</span><br><span class="line">[/bin/httpd -f -v -h /data/html]</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# docker exec -it httpd01 sh</span><br><span class="line">/ # pstree -p</span><br><span class="line">httpd(1)</span><br><span class="line">/ # ps aux</span><br><span class="line">PID   USER     TIME  COMMAND</span><br><span class="line">    1 root      0:00 /bin/httpd -f -v -h /data/html</span><br><span class="line">    8 root      0:00 sh</span><br><span class="line">   14 root      0:00 ps aux</span><br><span class="line">/ # read escape sequence</span><br><span class="line">[root@centos7 ~]# curl 172.17.0.2</span><br><span class="line">httpd website in busybox</span><br><span class="line">[root@centos7 ~]# curl 127.0.0.1:49157</span><br><span class="line">httpd website in busybox</span><br><span class="line">[root@centos7 ~]# docker commit -a &quot;chensir&lt;chensir@chensir.ink&gt;&quot; b1 httpd-busybox:v2.0</span><br><span class="line">sha256:b83d0a45c90bbfc368b57629af1985ec3f6d4bf05b870650fd7b73eb72c9771a</span><br><span class="line">[root@centos7 ~]# docker images</span><br><span class="line">REPOSITORY      TAG       IMAGE ID       CREATED          SIZE</span><br><span class="line">httpd-busybox   v2.0      b83d0a45c90b   6 seconds ago    1.24MB</span><br><span class="line">httpd-busybox   v1.0      fc393ccc5dd0   16 minutes ago   1.24MB</span><br><span class="line">[root@centos7 ~]# docker run -d --name web2 -p 81:80 httpd-busybox:v2.0 /bin/httpd -fv -h /date/html</span><br><span class="line">WARNING: IPv4 forwarding is disabled. Networking will not work.</span><br><span class="line">ef52ca935dc26a7283bc5a9de537f8fb1540de81f12729356c011041744fb6b0</span><br></pre></td></tr></table></figure><h3 id="基于官方镜像生成的容器制作tomcat镜像"><a href="#基于官方镜像生成的容器制作tomcat镜像" class="headerlink" title="基于官方镜像生成的容器制作tomcat镜像"></a>基于官方镜像生成的容器制作tomcat镜像</h3><h4 id="下载官方的tomcat镜像并运行"><a href="#下载官方的tomcat镜像并运行" class="headerlink" title="下载官方的tomcat镜像并运行"></a>下载官方的tomcat镜像并运行</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker images</span><br><span class="line">REPOSITORY   TAG       IMAGE ID   CREATED   SIZE</span><br><span class="line">[root@centos7 ~]# docker run -d -p 8080:8080 tomcat</span><br><span class="line">Unable to find image &#x27;tomcat:latest&#x27; locally</span><br><span class="line">latest: Pulling from library/tomcat</span><br><span class="line">0e29546d541c: Pull complete</span><br><span class="line">9b829c73b52b: Pull complete</span><br><span class="line">cb5b7ae36172: Pull complete</span><br><span class="line">6494e4811622: Pull complete</span><br><span class="line">668f6fcc5fa5: Pull complete</span><br><span class="line">dc120c3e0290: Pull complete</span><br><span class="line">8f7c0eebb7b1: Pull complete</span><br><span class="line">77b694f83996: Pull complete</span><br><span class="line">0f611256ec3a: Pull complete</span><br><span class="line">4f25def12f23: Pull complete</span><br><span class="line">Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324</span><br><span class="line">Status: Downloaded newer image for tomcat:latest</span><br><span class="line">WARNING: IPv4 forwarding is disabled. Networking will not work.</span><br><span class="line">38cedc776327713d0d3081ddc26f0097b4f2b5a0981cc08a9afdfc0056e24434</span><br><span class="line">[root@centos7 ~]# docker ps</span><br><span class="line">CONTAINER ID   IMAGE     COMMAND             CREATED         STATUS         PORTS                                       NAMES</span><br><span class="line">38cedc776327   tomcat    &quot;catalina.sh run&quot;   2 minutes ago   Up 2 minutes   0.0.0.0:8080-&gt;8080/tcp, :::8080-&gt;8080/tcp   gracious_booth</span><br><span class="line">[root@centos7 ~]# curl -I 127.0.0.1:8080</span><br><span class="line">HTTP/1.1 404</span><br><span class="line">Content-Type: text/html;charset=utf-8</span><br><span class="line">Content-Language: en</span><br><span class="line">Transfer-Encoding: chunked</span><br><span class="line">Date: Tue, 23 Aug 2022 15:47:57 GMT</span><br></pre></td></tr></table></figure><h4 id="修改容器"><a href="#修改容器" class="headerlink" title="修改容器"></a>修改容器</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker exec -it 38c bash</span><br><span class="line">root@38cedc776327:/usr/local/tomcat# ls</span><br><span class="line">BUILDING.txt LICENSE  README.md RUNNING.txt  conf  logs    temp     webapps.dist</span><br><span class="line">CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin      lib   native-jni-lib  webapps  work</span><br><span class="line">root@38cedc776327:/usr/local/tomcat# ls webapps</span><br><span class="line">root@38cedc776327:/usr/local/tomcat# ls webapps.dist/</span><br><span class="line">ROOT  docs  examples  host-manager  manager</span><br><span class="line">root@38cedc776327:/usr/local/tomcat# cp -a webapps.dist/* webapps/</span><br><span class="line">root@38cedc776327:/usr/local/tomcat# ls webapps</span><br><span class="line">ROOT  docs  examples  host-manager  manager</span><br><span class="line">root@38cedc776327:/usr/local/tomcat# exit</span><br><span class="line">exit</span><br><span class="line">[root@centos7 ~]# curl -I 127.0.0.1:8080</span><br><span class="line">HTTP/1.1 200</span><br><span class="line">Content-Type: text/html;charset=UTF-8</span><br><span class="line">Transfer-Encoding: chunked</span><br><span class="line">Date: Tue, 23 Aug 2022 15:52:21 GMT</span><br></pre></td></tr></table></figure><h4 id="提交新镜像"><a href="#提交新镜像" class="headerlink" title="提交新镜像"></a>提交新镜像</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker commit -m &quot;add webapps app&quot; -a &quot;chensir&quot; 38c tomcat:9.0.37-v1</span><br><span class="line">sha256:399beff7540e7ade5ec2f34a794a3e972351dd66b2ccab1fb73604d7a1b3518f</span><br><span class="line">[root@centos7 ~]# docker images</span><br><span class="line">REPOSITORY   TAG         IMAGE ID       CREATED         SIZE</span><br><span class="line">tomcat       9.0.37-v1   399beff7540e   4 seconds ago   684MB</span><br><span class="line">tomcat       latest      fb5657adc892   8 months ago    680MB</span><br><span class="line">[root@centos7 ~]# docker history tomcat:9.0.37-v1</span><br><span class="line">IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT</span><br><span class="line">399beff7540e   43 seconds ago   catalina.sh run                                 4.43MB    add webapps app</span><br><span class="line">fb5657adc892   8 months ago     /bin/sh -c #(nop)  CMD [&quot;catalina.sh&quot; &quot;run&quot;]    0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c #(nop)  EXPOSE 8080                  0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c set -eux;  nativeLines=&quot;$(catalin…   0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c set -eux;   savedAptMark=&quot;$(apt-m…   20.2MB</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c #(nop)  ENV TOMCAT_SHA512=c2d2ad5…   0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c #(nop)  ENV TOMCAT_VERSION=10.0.14   0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c #(nop)  ENV TOMCAT_MAJOR=10          0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c #(nop)  ENV GPG_KEYS=A9C5DF4D22E9…   0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c #(nop)  ENV LD_LIBRARY_PATH=/usr/…   0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c #(nop)  ENV TOMCAT_NATIVE_LIBDIR=…   0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c #(nop) WORKDIR /usr/local/tomcat     0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c mkdir -p &quot;$CATALINA_HOME&quot;            0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c #(nop)  ENV PATH=/usr/local/tomca…   0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c #(nop)  ENV CATALINA_HOME=/usr/lo…   0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c #(nop)  CMD [&quot;jshell&quot;]               0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c set -eux;   arch=&quot;$(dpkg --print-…   343MB</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c #(nop)  ENV JAVA_VERSION=11.0.13     0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c #(nop)  ENV PATH=/usr/local/openj…   0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c &#123; echo &#x27;#/bin/sh&#x27;; echo &#x27;echo &quot;$J…   27B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/local/…   0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c set -eux;  apt-get update;  apt-g…   11.3MB</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c apt-get update &amp;&amp; apt-get install…   152MB</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c set -ex;  if ! command -v gpg &gt; /…   18.9MB</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c set -eux;  apt-get update;  apt-g…   10.7MB</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c #(nop)  CMD [&quot;bash&quot;]                 0B</span><br><span class="line">&lt;missing&gt;      8 months ago     /bin/sh -c #(nop) ADD file:c03517c5ddbed4053…   124MB</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">删除当前的容器</span></span><br><span class="line">[root@centos7 ~]# docker rm -f 38c</span><br><span class="line">38c</span><br><span class="line">[root@centos7 ~]# docker ps</span><br><span class="line">CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES</span><br></pre></td></tr></table></figure><h4 id="利用新镜像启动容器"><a href="#利用新镜像启动容器" class="headerlink" title="利用新镜像启动容器"></a>利用新镜像启动容器</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker run -d -p 8080:8080 --name tomcat tomcat:9.0.37-v1</span><br><span class="line">[root@centos7 ~]# docker ps</span><br><span class="line">CONTAINER ID   IMAGE              COMMAND             CREATED        STATUS         PORTS                                       NAMES</span><br><span class="line">ff4f232c7ce0   tomcat:9.0.37-v1   &quot;catalina.sh run&quot;   15 hours ago   Up 5 minutes   0.0.0.0:8080-&gt;8080/tcp, :::8080-&gt;8080/tcp   tomcat</span><br><span class="line">[root@centos7 ~]# hostname -I</span><br><span class="line">10.0.0.14 172.17.0.1</span><br></pre></td></tr></table></figure><h4 id="测试新镜像启动的容器"><a href="#测试新镜像启动的容器" class="headerlink" title="测试新镜像启动的容器"></a>测试新镜像启动的容器</h4><p>浏览器访问 <a href="http://10.0.0.14:8080/">http://10.0.0.14:8080</a> 出现画面即可</p><h3 id="基于Ubuntu的基础镜像利用apt安装手动制作nginx的镜像"><a href="#基于Ubuntu的基础镜像利用apt安装手动制作nginx的镜像" class="headerlink" title="基于Ubuntu的基础镜像利用apt安装手动制作nginx的镜像"></a>基于Ubuntu的基础镜像利用apt安装手动制作nginx的镜像</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">启动容器</span></span><br><span class="line">[root@centos7 ~]# docker run -it -p 80 --name nginx_ubuntu ubuntu bash</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看ubuntu系统信息</span></span><br><span class="line">root@d35021705364:/# cat /etc/os-release</span><br><span class="line">NAME=&quot;Ubuntu&quot;</span><br><span class="line">VERSION=&quot;20.04.3 LTS (Focal Fossa)&quot;</span><br><span class="line">ID=ubuntu</span><br><span class="line">ID_LIKE=debian</span><br><span class="line">PRETTY_NAME=&quot;Ubuntu 20.04.3 LTS&quot;</span><br><span class="line">VERSION_ID=&quot;20.04&quot;</span><br><span class="line">HOME_URL=&quot;https://www.ubuntu.com/&quot;</span><br><span class="line">SUPPORT_URL=&quot;https://help.ubuntu.com/&quot;</span><br><span class="line">BUG_REPORT_URL=&quot;https://bugs.launchpad.net/ubuntu/&quot;</span><br><span class="line">PRIVACY_POLICY_URL=&quot;https://www.ubuntu.com/legal/terms-and-policies/privacy-policy&quot;</span><br><span class="line">VERSION_CODENAME=focal</span><br><span class="line">UBUNTU_CODENAME=focal</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">更新源</span></span><br><span class="line">root@d35021705364:/# apt update</span><br><span class="line">Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]</span><br><span class="line">Get:2 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]</span><br><span class="line">Get:3 http://security.ubuntu.com/ubuntu focal-security/universe amd64 Packages [888 kB]</span><br><span class="line">Get:4 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]</span><br><span class="line">Get:5 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 Packages [27.5 kB]</span><br><span class="line">Get:6 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [2091 kB]</span><br><span class="line">Get:7 http://archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB]</span><br><span class="line">Get:8 http://archive.ubuntu.com/ubuntu focal/restricted amd64 Packages [33.4 kB]</span><br><span class="line">Get:9 http://archive.ubuntu.com/ubuntu focal/multiverse amd64 Packages [177 kB]</span><br><span class="line">Get:10 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [1462 kB]</span><br><span class="line">Get:11 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages [1275 kB]</span><br><span class="line">Get:12 http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages [11.3 MB]</span><br><span class="line">Get:13 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [1183 kB]</span><br><span class="line">Get:14 http://archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [1572 kB]</span><br><span class="line">Get:15 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [2547 kB]</span><br><span class="line">Get:16 http://archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [30.2 kB]</span><br><span class="line">Get:17 http://archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [27.4 kB]</span><br><span class="line">Get:18 http://archive.ubuntu.com/ubuntu focal-backports/main amd64 Packages [55.1 kB]</span><br><span class="line">Fetched 23.3 MB in 28s (841 kB/s)</span><br><span class="line">Reading package lists... Done</span><br><span class="line">Building dependency tree</span><br><span class="line">Reading state information... Done</span><br><span class="line">34 packages can be upgraded. Run &#x27;apt list --upgradable&#x27; to see them.</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装nginx</span></span><br><span class="line">root@d35021705364:/# apt install -y nginx</span><br><span class="line">Reading package lists... Done</span><br><span class="line">Building dependency tree</span><br><span class="line">Reading state information... Done</span><br><span class="line">The following additional packages will be installed:</span><br><span class="line">  fontconfig-config fonts-dejavu-core iproute2 libatm1 libbsd0 libcap2 libcap2-bin libelf1 libexpat1 libfontconfig1 libfreetype6 libgd3 libicu66</span><br><span class="line">  libjbig0 libjpeg-turbo8 libjpeg8 libmnl0 libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream</span><br><span class="line">  libpam-cap libpng16-16 libssl1.1 libtiff5 libwebp6 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxml2 libxpm4 libxslt1.1 libxtables12</span><br><span class="line">  nginx-common nginx-core tzdata ucf</span><br><span class="line">Suggested packages:</span><br><span class="line">  iproute2-doc libgd-tools fcgiwrap nginx-doc ssl-cert</span><br><span class="line">The following NEW packages will be installed:</span><br><span class="line">  fontconfig-config fonts-dejavu-core iproute2 libatm1 libbsd0 libcap2 libcap2-bin libelf1 libexpat1 libfontconfig1 libfreetype6 libgd3 libicu66</span><br><span class="line">  libjbig0 libjpeg-turbo8 libjpeg8 libmnl0 libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream</span><br><span class="line">  libpam-cap libpng16-16 libssl1.1 libtiff5 libwebp6 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxml2 libxpm4 libxslt1.1 libxtables12 nginx</span><br><span class="line">  nginx-common nginx-core tzdata ucf</span><br><span class="line">0 upgraded, 40 newly installed, 0 to remove and 34 not upgraded.</span><br><span class="line">Need to get 15.8 MB of archives.</span><br><span class="line">After this operation, 60.8 MB of additional disk space will be used.</span><br><span class="line">Get:1 http://archive.ubuntu.com/ubuntu focal/main amd64 libbsd0 amd64 0.10.0-1 [45.4 kB]</span><br><span class="line">Get:2 http://archive.ubuntu.com/ubuntu focal/main amd64 libcap2 amd64 1:2.32-1 [15.9 kB]</span><br><span class="line">Get:3 http://archive.ubuntu.com/ubuntu focal/main amd64 libelf1 amd64 0.176-1.1build1 [44.0 kB]</span><br><span class="line">Get:4 http://archive.ubuntu.com/ubuntu focal/main amd64 libmnl0 amd64 1.0.4-2 [12.3 kB]</span><br><span class="line">Get:5 http://archive.ubuntu.com/ubuntu focal/main amd64 libxtables12 amd64 1.8.4-3ubuntu2 [28.4 kB]</span><br><span class="line">Get:6 http://archive.ubuntu.com/ubuntu focal/main amd64 libcap2-bin amd64 1:2.32-1 [26.2 kB]</span><br><span class="line">Get:7 http://archive.ubuntu.com/ubuntu focal/main amd64 iproute2 amd64 5.5.0-1ubuntu1 [858 kB]</span><br><span class="line">Get:8 http://archive.ubuntu.com/ubuntu focal/main amd64 libatm1 amd64 1:2.5.1-4 [21.8 kB]</span><br><span class="line">Get:9 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libexpat1 amd64 2.2.9-1ubuntu0.4 [74.4 kB]</span><br><span class="line">Get:10 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 tzdata all 2022a-0ubuntu0.20.04 [294 kB]</span><br><span class="line">Get:11 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libicu66 amd64 66.1-2ubuntu2.1 [8515 kB]</span><br><span class="line">Get:12 http://archive.ubuntu.com/ubuntu focal/main amd64 libpam-cap amd64 1:2.32-1 [8352 B]</span><br><span class="line">Get:13 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libssl1.1 amd64 1.1.1f-1ubuntu2.16 [1321 kB]</span><br><span class="line">Get:14 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libxml2 amd64 2.9.10+dfsg-5ubuntu0.20.04.4 [640 kB]</span><br><span class="line">Get:15 http://archive.ubuntu.com/ubuntu focal/main amd64 ucf all 3.0038+nmu1 [51.6 kB]</span><br><span class="line">Get:16 http://archive.ubuntu.com/ubuntu focal/main amd64 libpng16-16 amd64 1.6.37-2 [179 kB]</span><br><span class="line">Get:17 http://archive.ubuntu.com/ubuntu focal/main amd64 libxau6 amd64 1:1.0.9-0ubuntu1 [7488 B]</span><br><span class="line">Get:18 http://archive.ubuntu.com/ubuntu focal/main amd64 libxdmcp6 amd64 1:1.1.3-0ubuntu1 [10.6 kB]</span><br><span class="line">Get:19 http://archive.ubuntu.com/ubuntu focal/main amd64 libxcb1 amd64 1.14-2 [44.7 kB]</span><br><span class="line">Get:20 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libx11-data all 2:1.6.9-2ubuntu1.2 [113 kB]</span><br><span class="line">Get:21 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libx11-6 amd64 2:1.6.9-2ubuntu1.2 [575 kB]</span><br><span class="line">Get:22 http://archive.ubuntu.com/ubuntu focal/main amd64 fonts-dejavu-core all 2.37-1 [1041 kB]</span><br><span class="line">Get:23 http://archive.ubuntu.com/ubuntu focal/main amd64 fontconfig-config all 2.13.1-2ubuntu3 [28.8 kB]</span><br><span class="line">Get:24 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libfreetype6 amd64 2.10.1-2ubuntu0.2 [341 kB]</span><br><span class="line">Get:25 http://archive.ubuntu.com/ubuntu focal/main amd64 libfontconfig1 amd64 2.13.1-2ubuntu3 [114 kB]</span><br><span class="line">Get:26 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libjpeg-turbo8 amd64 2.0.3-0ubuntu1.20.04.1 [117 kB]</span><br><span class="line">Get:27 http://archive.ubuntu.com/ubuntu focal/main amd64 libjpeg8 amd64 8c-2ubuntu8 [2194 B]</span><br><span class="line">Get:28 http://archive.ubuntu.com/ubuntu focal/main amd64 libjbig0 amd64 2.1-3.1build1 [26.7 kB]</span><br><span class="line">Get:29 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libwebp6 amd64 0.6.1-2ubuntu0.20.04.1 [185 kB]</span><br><span class="line">Get:30 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libtiff5 amd64 4.1.0+git191117-2ubuntu0.20.04.3 [162 kB]</span><br><span class="line">Get:31 http://archive.ubuntu.com/ubuntu focal/main amd64 libxpm4 amd64 1:3.5.12-1 [34.0 kB]</span><br><span class="line">Get:32 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libgd3 amd64 2.2.5-5.2ubuntu2.1 [118 kB]</span><br><span class="line">Get:33 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 nginx-common all 1.18.0-0ubuntu1.3 [37.7 kB]</span><br><span class="line">Get:34 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libnginx-mod-http-image-filter amd64 1.18.0-0ubuntu1.3 [14.8 kB]</span><br><span class="line">Get:35 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libxslt1.1 amd64 1.1.34-4ubuntu0.20.04.1 [151 kB]</span><br><span class="line">Get:36 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libnginx-mod-http-xslt-filter amd64 1.18.0-0ubuntu1.3 [13.0 kB]</span><br><span class="line">Get:37 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libnginx-mod-mail amd64 1.18.0-0ubuntu1.3 [42.8 kB]</span><br><span class="line">Get:38 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libnginx-mod-stream amd64 1.18.0-0ubuntu1.3 [67.3 kB]</span><br><span class="line">Get:39 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 nginx-core amd64 1.18.0-0ubuntu1.3 [425 kB]</span><br><span class="line">Get:40 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 nginx all 1.18.0-0ubuntu1.3 [3620 B]</span><br><span class="line">Fetched 15.8 MB in 9s (1680 kB/s)</span><br><span class="line">debconf: delaying package configuration, since apt-utils is not installed</span><br><span class="line">Selecting previously unselected package libbsd0:amd64.</span><br><span class="line">(Reading database ... 4127 files and directories currently installed.)</span><br><span class="line">Preparing to unpack .../00-libbsd0_0.10.0-1_amd64.deb ...</span><br><span class="line">Unpacking libbsd0:amd64 (0.10.0-1) ...</span><br><span class="line">Selecting previously unselected package libcap2:amd64.</span><br><span class="line">Preparing to unpack .../01-libcap2_1%3a2.32-1_amd64.deb ...</span><br><span class="line">Unpacking libcap2:amd64 (1:2.32-1) ...</span><br><span class="line">Selecting previously unselected package libelf1:amd64.</span><br><span class="line">Preparing to unpack .../02-libelf1_0.176-1.1build1_amd64.deb ...</span><br><span class="line">Unpacking libelf1:amd64 (0.176-1.1build1) ...</span><br><span class="line">Selecting previously unselected package libmnl0:amd64.</span><br><span class="line">Preparing to unpack .../03-libmnl0_1.0.4-2_amd64.deb ...</span><br><span class="line">Unpacking libmnl0:amd64 (1.0.4-2) ...</span><br><span class="line">Selecting previously unselected package libxtables12:amd64.</span><br><span class="line">Preparing to unpack .../04-libxtables12_1.8.4-3ubuntu2_amd64.deb ...</span><br><span class="line">Unpacking libxtables12:amd64 (1.8.4-3ubuntu2) ...</span><br><span class="line">Selecting previously unselected package libcap2-bin.</span><br><span class="line">Preparing to unpack .../05-libcap2-bin_1%3a2.32-1_amd64.deb ...</span><br><span class="line">Unpacking libcap2-bin (1:2.32-1) ...</span><br><span class="line">Selecting previously unselected package iproute2.</span><br><span class="line">Preparing to unpack .../06-iproute2_5.5.0-1ubuntu1_amd64.deb ...</span><br><span class="line">Unpacking iproute2 (5.5.0-1ubuntu1) ...</span><br><span class="line">Selecting previously unselected package libatm1:amd64.</span><br><span class="line">Preparing to unpack .../07-libatm1_1%3a2.5.1-4_amd64.deb ...</span><br><span class="line">Unpacking libatm1:amd64 (1:2.5.1-4) ...</span><br><span class="line">Selecting previously unselected package libexpat1:amd64.</span><br><span class="line">Preparing to unpack .../08-libexpat1_2.2.9-1ubuntu0.4_amd64.deb ...</span><br><span class="line">Unpacking libexpat1:amd64 (2.2.9-1ubuntu0.4) ...</span><br><span class="line">Selecting previously unselected package tzdata.</span><br><span class="line">Preparing to unpack .../09-tzdata_2022a-0ubuntu0.20.04_all.deb ...</span><br><span class="line">Unpacking tzdata (2022a-0ubuntu0.20.04) ...</span><br><span class="line">Selecting previously unselected package libicu66:amd64.</span><br><span class="line">Preparing to unpack .../10-libicu66_66.1-2ubuntu2.1_amd64.deb ...</span><br><span class="line">Unpacking libicu66:amd64 (66.1-2ubuntu2.1) ...</span><br><span class="line">Selecting previously unselected package libpam-cap:amd64.</span><br><span class="line">Preparing to unpack .../11-libpam-cap_1%3a2.32-1_amd64.deb ...</span><br><span class="line">Unpacking libpam-cap:amd64 (1:2.32-1) ...</span><br><span class="line">Selecting previously unselected package libssl1.1:amd64.</span><br><span class="line">Preparing to unpack .../12-libssl1.1_1.1.1f-1ubuntu2.16_amd64.deb ...</span><br><span class="line">Unpacking libssl1.1:amd64 (1.1.1f-1ubuntu2.16) ...</span><br><span class="line">Selecting previously unselected package libxml2:amd64.</span><br><span class="line">Preparing to unpack .../13-libxml2_2.9.10+dfsg-5ubuntu0.20.04.4_amd64.deb ...</span><br><span class="line">Unpacking libxml2:amd64 (2.9.10+dfsg-5ubuntu0.20.04.4) ...</span><br><span class="line">Selecting previously unselected package ucf.</span><br><span class="line">Preparing to unpack .../14-ucf_3.0038+nmu1_all.deb ...</span><br><span class="line">Moving old data out of the way</span><br><span class="line">Unpacking ucf (3.0038+nmu1) ...</span><br><span class="line">Selecting previously unselected package libpng16-16:amd64.</span><br><span class="line">Preparing to unpack .../15-libpng16-16_1.6.37-2_amd64.deb ...</span><br><span class="line">Unpacking libpng16-16:amd64 (1.6.37-2) ...</span><br><span class="line">Selecting previously unselected package libxau6:amd64.</span><br><span class="line">Preparing to unpack .../16-libxau6_1%3a1.0.9-0ubuntu1_amd64.deb ...</span><br><span class="line">Unpacking libxau6:amd64 (1:1.0.9-0ubuntu1) ...</span><br><span class="line">Selecting previously unselected package libxdmcp6:amd64.</span><br><span class="line">Preparing to unpack .../17-libxdmcp6_1%3a1.1.3-0ubuntu1_amd64.deb ...</span><br><span class="line">Unpacking libxdmcp6:amd64 (1:1.1.3-0ubuntu1) ...</span><br><span class="line">Selecting previously unselected package libxcb1:amd64.</span><br><span class="line">Preparing to unpack .../18-libxcb1_1.14-2_amd64.deb ...</span><br><span class="line">Unpacking libxcb1:amd64 (1.14-2) ...</span><br><span class="line">Selecting previously unselected package libx11-data.</span><br><span class="line">Preparing to unpack .../19-libx11-data_2%3a1.6.9-2ubuntu1.2_all.deb ...</span><br><span class="line">Unpacking libx11-data (2:1.6.9-2ubuntu1.2) ...</span><br><span class="line">Selecting previously unselected package libx11-6:amd64.</span><br><span class="line">Preparing to unpack .../20-libx11-6_2%3a1.6.9-2ubuntu1.2_amd64.deb ...</span><br><span class="line">Unpacking libx11-6:amd64 (2:1.6.9-2ubuntu1.2) ...</span><br><span class="line">Selecting previously unselected package fonts-dejavu-core.</span><br><span class="line">Preparing to unpack .../21-fonts-dejavu-core_2.37-1_all.deb ...</span><br><span class="line">Unpacking fonts-dejavu-core (2.37-1) ...</span><br><span class="line">Selecting previously unselected package fontconfig-config.</span><br><span class="line">Preparing to unpack .../22-fontconfig-config_2.13.1-2ubuntu3_all.deb ...</span><br><span class="line">Unpacking fontconfig-config (2.13.1-2ubuntu3) ...</span><br><span class="line">Selecting previously unselected package libfreetype6:amd64.</span><br><span class="line">Preparing to unpack .../23-libfreetype6_2.10.1-2ubuntu0.2_amd64.deb ...</span><br><span class="line">Unpacking libfreetype6:amd64 (2.10.1-2ubuntu0.2) ...</span><br><span class="line">Selecting previously unselected package libfontconfig1:amd64.</span><br><span class="line">Preparing to unpack .../24-libfontconfig1_2.13.1-2ubuntu3_amd64.deb ...</span><br><span class="line">Unpacking libfontconfig1:amd64 (2.13.1-2ubuntu3) ...</span><br><span class="line">Selecting previously unselected package libjpeg-turbo8:amd64.</span><br><span class="line">Preparing to unpack .../25-libjpeg-turbo8_2.0.3-0ubuntu1.20.04.1_amd64.deb ...</span><br><span class="line">Unpacking libjpeg-turbo8:amd64 (2.0.3-0ubuntu1.20.04.1) ...</span><br><span class="line">Selecting previously unselected package libjpeg8:amd64.</span><br><span class="line">Preparing to unpack .../26-libjpeg8_8c-2ubuntu8_amd64.deb ...</span><br><span class="line">Unpacking libjpeg8:amd64 (8c-2ubuntu8) ...</span><br><span class="line">Selecting previously unselected package libjbig0:amd64.</span><br><span class="line">Preparing to unpack .../27-libjbig0_2.1-3.1build1_amd64.deb ...</span><br><span class="line">Unpacking libjbig0:amd64 (2.1-3.1build1) ...</span><br><span class="line">Selecting previously unselected package libwebp6:amd64.</span><br><span class="line">Preparing to unpack .../28-libwebp6_0.6.1-2ubuntu0.20.04.1_amd64.deb ...</span><br><span class="line">Unpacking libwebp6:amd64 (0.6.1-2ubuntu0.20.04.1) ...</span><br><span class="line">Selecting previously unselected package libtiff5:amd64.</span><br><span class="line">Preparing to unpack .../29-libtiff5_4.1.0+git191117-2ubuntu0.20.04.3_amd64.deb ...</span><br><span class="line">Unpacking libtiff5:amd64 (4.1.0+git191117-2ubuntu0.20.04.3) ...</span><br><span class="line">Selecting previously unselected package libxpm4:amd64.</span><br><span class="line">Preparing to unpack .../30-libxpm4_1%3a3.5.12-1_amd64.deb ...</span><br><span class="line">Unpacking libxpm4:amd64 (1:3.5.12-1) ...</span><br><span class="line">Selecting previously unselected package libgd3:amd64.</span><br><span class="line">Preparing to unpack .../31-libgd3_2.2.5-5.2ubuntu2.1_amd64.deb ...</span><br><span class="line">Unpacking libgd3:amd64 (2.2.5-5.2ubuntu2.1) ...</span><br><span class="line">Selecting previously unselected package nginx-common.</span><br><span class="line">Preparing to unpack .../32-nginx-common_1.18.0-0ubuntu1.3_all.deb ...</span><br><span class="line">Unpacking nginx-common (1.18.0-0ubuntu1.3) ...</span><br><span class="line">Selecting previously unselected package libnginx-mod-http-image-filter.</span><br><span class="line">Preparing to unpack .../33-libnginx-mod-http-image-filter_1.18.0-0ubuntu1.3_amd64.deb ...</span><br><span class="line">Unpacking libnginx-mod-http-image-filter (1.18.0-0ubuntu1.3) ...</span><br><span class="line">Selecting previously unselected package libxslt1.1:amd64.</span><br><span class="line">Preparing to unpack .../34-libxslt1.1_1.1.34-4ubuntu0.20.04.1_amd64.deb ...</span><br><span class="line">Unpacking libxslt1.1:amd64 (1.1.34-4ubuntu0.20.04.1) ...</span><br><span class="line">Selecting previously unselected package libnginx-mod-http-xslt-filter.</span><br><span class="line">Preparing to unpack .../35-libnginx-mod-http-xslt-filter_1.18.0-0ubuntu1.3_amd64.deb ...</span><br><span class="line">Unpacking libnginx-mod-http-xslt-filter (1.18.0-0ubuntu1.3) ...</span><br><span class="line">Selecting previously unselected package libnginx-mod-mail.</span><br><span class="line">Preparing to unpack .../36-libnginx-mod-mail_1.18.0-0ubuntu1.3_amd64.deb ...</span><br><span class="line">Unpacking libnginx-mod-mail (1.18.0-0ubuntu1.3) ...</span><br><span class="line">Selecting previously unselected package libnginx-mod-stream.</span><br><span class="line">Preparing to unpack .../37-libnginx-mod-stream_1.18.0-0ubuntu1.3_amd64.deb ...</span><br><span class="line">Unpacking libnginx-mod-stream (1.18.0-0ubuntu1.3) ...</span><br><span class="line">Selecting previously unselected package nginx-core.</span><br><span class="line">Preparing to unpack .../38-nginx-core_1.18.0-0ubuntu1.3_amd64.deb ...</span><br><span class="line">Unpacking nginx-core (1.18.0-0ubuntu1.3) ...</span><br><span class="line">Selecting previously unselected package nginx.</span><br><span class="line">Preparing to unpack .../39-nginx_1.18.0-0ubuntu1.3_all.deb ...</span><br><span class="line">Unpacking nginx (1.18.0-0ubuntu1.3) ...</span><br><span class="line">Setting up libexpat1:amd64 (2.2.9-1ubuntu0.4) ...</span><br><span class="line">Setting up libxau6:amd64 (1:1.0.9-0ubuntu1) ...</span><br><span class="line">Setting up libssl1.1:amd64 (1.1.1f-1ubuntu2.16) ...</span><br><span class="line">debconf: unable to initialize frontend: Dialog</span><br><span class="line">debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)</span><br><span class="line">debconf: falling back to frontend: Readline</span><br><span class="line">debconf: unable to initialize frontend: Readline</span><br><span class="line">debconf: (Can&#x27;t locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.30.0 /usr/local/share/perl/5.30.0 /usr/lib/x86_64-linux-gnu/perl5/5.30 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.30 /usr/share/perl/5.30 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)</span><br><span class="line">debconf: falling back to frontend: Teletype</span><br><span class="line">Setting up nginx-common (1.18.0-0ubuntu1.3) ...</span><br><span class="line">debconf: unable to initialize frontend: Dialog</span><br><span class="line">debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)</span><br><span class="line">debconf: falling back to frontend: Readline</span><br><span class="line">debconf: unable to initialize frontend: Readline</span><br><span class="line">debconf: (Can&#x27;t locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.30.0 /usr/local/share/perl/5.30.0 /usr/lib/x86_64-linux-gnu/perl5/5.30 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.30 /usr/share/perl/5.30 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)</span><br><span class="line">debconf: falling back to frontend: Teletype</span><br><span class="line">Setting up libatm1:amd64 (1:2.5.1-4) ...</span><br><span class="line">Setting up libjbig0:amd64 (2.1-3.1build1) ...</span><br><span class="line">Setting up libcap2:amd64 (1:2.32-1) ...</span><br><span class="line">Setting up tzdata (2022a-0ubuntu0.20.04) ...</span><br><span class="line">debconf: unable to initialize frontend: Dialog</span><br><span class="line">debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)</span><br><span class="line">debconf: falling back to frontend: Readline</span><br><span class="line">debconf: unable to initialize frontend: Readline</span><br><span class="line">debconf: (Can&#x27;t locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.30.0 /usr/local/share/perl/5.30.0 /usr/lib/x86_64-linux-gnu/perl5/5.30 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.30 /usr/share/perl/5.30 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)</span><br><span class="line">debconf: falling back to frontend: Teletype</span><br><span class="line">Configuring tzdata</span><br><span class="line">------------------</span><br><span class="line"></span><br><span class="line">Please select the geographic area in which you live. Subsequent configuration questions will narrow this down by presenting a list of cities,</span><br><span class="line">representing the time zones in which they are located.</span><br><span class="line"></span><br><span class="line">  1. Africa   3. Antarctica  5. Arctic  7. Atlantic  9. Indian    11. SystemV  13. Etc</span><br><span class="line">  2. America  4. Australia   6. Asia    8. Europe    10. Pacific  12. US</span><br><span class="line">Geographic area: 6</span><br><span class="line"></span><br><span class="line">Please select the city or region corresponding to your time zone.</span><br><span class="line"></span><br><span class="line">  1. Aden      13. Barnaul     25. Dushanbe     37. Jerusalem     49. Macau         61. Pyongyang      73. Taipei         85. Vientiane</span><br><span class="line">  2. Almaty    14. Beirut      26. Famagusta    38. Kabul         50. Magadan       62. Qatar          74. Tashkent       86. Vladivostok</span><br><span class="line">  3. Amman     15. Bishkek     27. Gaza         39. Kamchatka     51. Makassar      63. Qostanay       75. Tbilisi        87. Yakutsk</span><br><span class="line">  4. Anadyr    16. Brunei      28. Harbin       40. Karachi       52. Manila        64. Qyzylorda      76. Tehran         88. Yangon</span><br><span class="line">  5. Aqtau     17. Chita       29. Hebron       41. Kashgar       53. Muscat        65. Rangoon        77. Tel_Aviv       89. Yekaterinburg</span><br><span class="line">  6. Aqtobe    18. Choibalsan  30. Ho_Chi_Minh  42. Kathmandu     54. Nicosia       66. Riyadh         78. Thimphu        90. Yerevan</span><br><span class="line">  7. Ashgabat  19. Chongqing   31. Hong_Kong    43. Khandyga      55. Novokuznetsk  67. Sakhalin       79. Tokyo</span><br><span class="line">  8. Atyrau    20. Colombo     32. Hovd         44. Kolkata       56. Novosibirsk   68. Samarkand      80. Tomsk</span><br><span class="line">  9. Baghdad   21. Damascus    33. Irkutsk      45. Krasnoyarsk   57. Omsk          69. Seoul          81. Ujung_Pandang</span><br><span class="line">  10. Bahrain  22. Dhaka       34. Istanbul     46. Kuala_Lumpur  58. Oral          70. Shanghai       82. Ulaanbaatar</span><br><span class="line">  11. Baku     23. Dili        35. Jakarta      47. Kuching       59. Phnom_Penh    71. Singapore      83. Urumqi</span><br><span class="line">  12. Bangkok  24. Dubai       36. Jayapura     48. Kuwait        60. Pontianak     72. Srednekolymsk  84. Ust-Nera</span><br><span class="line">Time zone: 70  # 配置时区</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">Current default time zone: &#x27;Asia/Shanghai&#x27;</span><br><span class="line">Local time is now:      Wed Aug 24 15:05:46 CST 2022.</span><br><span class="line">Universal Time is now:  Wed Aug 24 07:05:46 UTC 2022.</span><br><span class="line">Run &#x27;dpkg-reconfigure tzdata&#x27; if you wish to change it.</span><br><span class="line"></span><br><span class="line">Setting up libcap2-bin (1:2.32-1) ...</span><br><span class="line">Setting up libx11-data (2:1.6.9-2ubuntu1.2) ...</span><br><span class="line">Setting up libpng16-16:amd64 (1.6.37-2) ...</span><br><span class="line">Setting up libmnl0:amd64 (1.0.4-2) ...</span><br><span class="line">Setting up libwebp6:amd64 (0.6.1-2ubuntu0.20.04.1) ...</span><br><span class="line">Setting up fonts-dejavu-core (2.37-1) ...</span><br><span class="line">Setting up ucf (3.0038+nmu1) ...</span><br><span class="line">debconf: unable to initialize frontend: Dialog</span><br><span class="line">debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)</span><br><span class="line">debconf: falling back to frontend: Readline</span><br><span class="line">debconf: unable to initialize frontend: Readline</span><br><span class="line">debconf: (Can&#x27;t locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.30.0 /usr/local/share/perl/5.30.0 /usr/lib/x86_64-linux-gnu/perl5/5.30 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.30 /usr/share/perl/5.30 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)</span><br><span class="line">debconf: falling back to frontend: Teletype</span><br><span class="line">Setting up libjpeg-turbo8:amd64 (2.0.3-0ubuntu1.20.04.1) ...</span><br><span class="line">Setting up libxtables12:amd64 (1.8.4-3ubuntu2) ...</span><br><span class="line">Setting up libbsd0:amd64 (0.10.0-1) ...</span><br><span class="line">Setting up libelf1:amd64 (0.176-1.1build1) ...</span><br><span class="line">Setting up libpam-cap:amd64 (1:2.32-1) ...</span><br><span class="line">debconf: unable to initialize frontend: Dialog</span><br><span class="line">debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)</span><br><span class="line">debconf: falling back to frontend: Readline</span><br><span class="line">debconf: unable to initialize frontend: Readline</span><br><span class="line">debconf: (Can&#x27;t locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.30.0 /usr/local/share/perl/5.30.0 /usr/lib/x86_64-linux-gnu/perl5/5.30 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.30 /usr/share/perl/5.30 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)</span><br><span class="line">debconf: falling back to frontend: Teletype</span><br><span class="line">Setting up libjpeg8:amd64 (8c-2ubuntu8) ...</span><br><span class="line">Setting up libnginx-mod-mail (1.18.0-0ubuntu1.3) ...</span><br><span class="line">Setting up libxdmcp6:amd64 (1:1.1.3-0ubuntu1) ...</span><br><span class="line">Setting up libxcb1:amd64 (1.14-2) ...</span><br><span class="line">Setting up fontconfig-config (2.13.1-2ubuntu3) ...</span><br><span class="line">Setting up iproute2 (5.5.0-1ubuntu1) ...</span><br><span class="line">debconf: unable to initialize frontend: Dialog</span><br><span class="line">debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)</span><br><span class="line">debconf: falling back to frontend: Readline</span><br><span class="line">debconf: unable to initialize frontend: Readline</span><br><span class="line">debconf: (Can&#x27;t locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.30.0 /usr/local/share/perl/5.30.0 /usr/lib/x86_64-linux-gnu/perl5/5.30 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.30 /usr/share/perl/5.30 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)</span><br><span class="line">debconf: falling back to frontend: Teletype</span><br><span class="line">Setting up libicu66:amd64 (66.1-2ubuntu2.1) ...</span><br><span class="line">Setting up libnginx-mod-stream (1.18.0-0ubuntu1.3) ...</span><br><span class="line">Setting up libfreetype6:amd64 (2.10.1-2ubuntu0.2) ...</span><br><span class="line">Setting up libx11-6:amd64 (2:1.6.9-2ubuntu1.2) ...</span><br><span class="line">Setting up libtiff5:amd64 (4.1.0+git191117-2ubuntu0.20.04.3) ...</span><br><span class="line">Setting up libfontconfig1:amd64 (2.13.1-2ubuntu3) ...</span><br><span class="line">Setting up libxml2:amd64 (2.9.10+dfsg-5ubuntu0.20.04.4) ...</span><br><span class="line">Setting up libxpm4:amd64 (1:3.5.12-1) ...</span><br><span class="line">Setting up libgd3:amd64 (2.2.5-5.2ubuntu2.1) ...</span><br><span class="line">Setting up libxslt1.1:amd64 (1.1.34-4ubuntu0.20.04.1) ...</span><br><span class="line">Setting up libnginx-mod-http-image-filter (1.18.0-0ubuntu1.3) ...</span><br><span class="line">Setting up libnginx-mod-http-xslt-filter (1.18.0-0ubuntu1.3) ...</span><br><span class="line">Setting up nginx-core (1.18.0-0ubuntu1.3) ...</span><br><span class="line">invoke-rc.d: could not determine current runlevel</span><br><span class="line">invoke-rc.d: policy-rc.d denied execution of start.</span><br><span class="line">Setting up nginx (1.18.0-0ubuntu1.3) ...</span><br><span class="line">Processing triggers for libc-bin (2.31-0ubuntu9.2) ...</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看nginx版本</span></span><br><span class="line">root@d35021705364:/# nginx -v</span><br><span class="line">nginx version: nginx/1.18.0 (Ubuntu)</span><br><span class="line">root@d35021705364:/# grep include /etc/nginx/nginx.conf</span><br><span class="line">include /etc/nginx/modules-enabled/*.conf;</span><br><span class="line">include /etc/nginx/mime.types;</span><br><span class="line">include /etc/nginx/conf.d/*.conf;</span><br><span class="line">include /etc/nginx/sites-enabled/*;</span><br><span class="line">root@d35021705364:/# grep root /etc/nginx/sites-enabled/default</span><br><span class="line">root /var/www/html;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">deny access to .htaccess files, <span class="keyword">if</span> Apache<span class="string">&#x27;s document root</span></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash"><span class="string">root /var/www/example.com;</span></span></span><br><span class="line">root@d35021705364:/# echo Nginx website in Docker &gt; /var/www/html/index.html</span><br><span class="line">root@d35021705364:/# exit</span><br><span class="line">exit</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="string">提交为镜像</span></span></span><br><span class="line">[root@centos7 ~]# docker commit -a &#x27;chensir&#x27; -m &#x27;nginx-ubuntu:20.04&#x27; nginx_ubuntu nginx_ubuntu20.04:v1.18.0</span><br><span class="line">sha256:b33b57cff5d3c68c56b5826490ddcb0c9e7751f2d275a9d6d1e43d63764f78b0</span><br><span class="line">[root@centos7 ~]# docker images</span><br><span class="line">REPOSITORY          TAG         IMAGE ID       CREATED         SIZE</span><br><span class="line">nginx_ubuntu20.04   v1.18.0     b33b57cff5d3   5 seconds ago   169MB</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="string">从制作的新镜像启动容器并测试访问</span></span></span><br><span class="line">[root@centos7 ~]# docker run -d -p 80 --name nginx-web nginx_ubuntu20.04:v1.18.0 nginx -g &#x27;daemon off;&#x27;</span><br><span class="line">06098c8bc2ec93978167950adfa5e827c75174aba306337165813a9e950b1972</span><br><span class="line">[root@centos7 ~]# docker ps</span><br><span class="line">CONTAINER ID   IMAGE                       COMMAND                  CREATED         STATUS         PORTS                                     NAMES</span><br><span class="line">06098c8bc2ec   nginx_ubuntu20.04:v1.18.0   &quot;nginx -g &#x27;daemon of…&quot;   2 seconds ago   Up 2 seconds   0.0.0.0:49162-&gt;80/tcp, :::49162-&gt;80/tcp   nginx-web</span><br><span class="line">[root@centos7 ~]# docker ps</span><br><span class="line">CONTAINER ID   IMAGE                       COMMAND                  CREATED         STATUS         PORTS                                     NAMES</span><br><span class="line">06098c8bc2ec   nginx_ubuntu20.04:v1.18.0   &quot;nginx -g &#x27;daemon of…&quot;   2 seconds ago   Up 2 seconds   0.0.0.0:49162-&gt;80/tcp, :::49162-&gt;80/tcp   nginx-web</span><br><span class="line">[root@centos7 ~]# docker port nginx-web</span><br><span class="line">80/tcp -&gt; 0.0.0.0:49162</span><br><span class="line">80/tcp -&gt; :::49162</span><br><span class="line">[root@centos7 ~]# curl 127.0.0.1:49162</span><br><span class="line">Nginx website in Docker</span><br></pre></td></tr></table></figure><h3 id="基于CentOS的基础镜像利用yum安装手动制作nginx的镜像"><a href="#基于CentOS的基础镜像利用yum安装手动制作nginx的镜像" class="headerlink" title="基于CentOS的基础镜像利用yum安装手动制作nginx的镜像"></a>基于CentOS的基础镜像利用yum安装手动制作nginx的镜像</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker pull centos:centos7.7.1908</span><br><span class="line">centos7.7.1908: Pulling from library/centos</span><br><span class="line">f34b00c7da20: Pull complete</span><br><span class="line">Digest: sha256:50752af5182c6cd5518e3e91d48f7ff0cba93d5d760a67ac140e2d63c4dd9efc</span><br><span class="line">Status: Downloaded newer image for centos:centos7.7.1908</span><br><span class="line">docker.io/library/centos:centos7.7.1908</span><br><span class="line">[root@centos7 ~]# docker images</span><br><span class="line">REPOSITORY          TAG              IMAGE ID       CREATED          SIZE</span><br><span class="line">centos              centos7.7.1908   08d05d1d5859   2 years ago      204MB</span><br><span class="line">[root@centos7 ~]# docker run -it centos:centos7.7.1908 bash</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">修改时区</span></span><br><span class="line">[root@0b3db04f3a72 /]# rm -f /etc/localtime</span><br><span class="line">[root@0b3db04f3a72 /]# ln -s ../usr/share/zoneinfo/Asia/Shanghai /etc/localtime</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">更改yum源</span></span><br><span class="line">[root@0b3db04f3a72 /]# yum install -y wget</span><br><span class="line">[root@0b3db04f3a72 /]# wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/Centos-7.repo</span><br><span class="line">[root@0b3db04f3a72 /]# wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo</span><br><span class="line">[root@0b3db04f3a72 /]# yum install -y nginx</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装相关软件和工具</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">yum 安装 nginx</span></span><br><span class="line">[root@0b3db04f3a72 /]# yum install -y nginx</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装常用命令</span></span><br><span class="line">[root@0b3db04f3a72 /]# yum install -y vim curl iproute net-tools</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">清理yum缓存</span></span><br><span class="line">[root@0b3db04f3a72 /]# rm -rf /var/cache/yum/*</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">修改服务的配置信息关闭服务后台运行</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">关闭nginx后台运行</span></span><br><span class="line">[root@0b3db04f3a72 /]# vim /etc/nginx/nginx.conf</span><br><span class="line">user nginx;</span><br><span class="line">daemon off; # 关闭后台运行</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">准备程序和数据</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">自定义web界面</span></span><br><span class="line">[root@0b3db04f3a72 /]# rm -rf /usr/share/nginx/html/index.html</span><br><span class="line">[root@0b3db04f3a72 /]# echo &quot;Nginx Page in Docker&quot; &gt; /usr/share/nginx/html/index.html</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">提交为镜像</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker commit命令在宿主机基于容器ID提交为镜像</span></span><br><span class="line">[root@centos7 ~]# docker commit -a &quot;chensir&quot; -m &quot;nginx yum v1&quot; -c &quot;EXPOSE 80 443&quot; 0b3db04f3a72 chensir/centos-nginx:1.16.1.v1</span><br><span class="line">sha256:3f649568eaca282c2ff0864d725bb0310862849e9393abfb14f49fa60d7071f7</span><br><span class="line">[root@centos7 ~]# docker images</span><br><span class="line">REPOSITORY             TAG              IMAGE ID       CREATED          SIZE</span><br><span class="line">chensir/centos-nginx   1.16.1.v1        3f649568eaca   17 seconds ago   322MB</span><br><span class="line">centos                 centos7.7.1908   08d05d1d5859   2 years ago      204MB</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">从制作的镜像启动容器</span></span><br><span class="line">[root@centos7 ~]# docker run -d -p 8080:80 --name my-centos-nginx chensir/centos-nginx:1.16.1.v1 /usr/sbin/nginx</span><br><span class="line">df983ecee256956f34af0ca6089331bd9bd1863ad24d35defef05c86e6cab5f2</span><br><span class="line">[root@centos7 ~]# docker ps</span><br><span class="line">CONTAINER ID   IMAGE                            COMMAND                  CREATED          STATUS          PORTS                                            NAMES</span><br><span class="line">df983ecee256   chensir/centos-nginx:1.16.1.v1   &quot;/usr/sbin/nginx&quot;        5 seconds ago    Up 5 seconds    443/tcp, 0.0.0.0:8080-&gt;80/tcp, :::8080-&gt;80/tcp   my-centos-nginx</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">访问测试镜像</span></span><br><span class="line">[root@centos7 ~]# curl 127.0.0.1:8080</span><br><span class="line">Nginx Page in Docker</span><br></pre></td></tr></table></figure><h2 id="利用DockerFile文件执行docker-build自动构建镜像"><a href="#利用DockerFile文件执行docker-build自动构建镜像" class="headerlink" title="利用DockerFile文件执行docker build自动构建镜像"></a>利用DockerFile文件执行docker build自动构建镜像</h2><h3 id="Dockerfile使用详解"><a href="#Dockerfile使用详解" class="headerlink" title="Dockerfile使用详解"></a>Dockerfile使用详解</h3><h3 id="Dockerfile介绍"><a href="#Dockerfile介绍" class="headerlink" title="Dockerfile介绍"></a>Dockerfile介绍</h3><p>Dockerfile是一种被Docker程序解释执行的脚本，由一条条的命令组成的，没条命令对应Linux下面的一条命令，Docker程序将这些DockerFile指令再翻译成真正的Linux命令，其有自己的书写方式和支持的命令，Docker程序读取DockerFile并根据指令生成Docker镜像，相比手动制作的镜像方式，DockerFile更能直观的展示镜像是怎么产生的，有了DockerFile，当后期有额外的需求时，只要在之前的DockerFile添加或者修改响应的命令即可重新的Docker镜像，避免了重复手动制作镜像的麻烦，类似与shell脚本一样，可以方便高效的制作镜像。</p><p>Docker守护程序Dockerfile逐一运行指令，如有必要，将每个指令的结果提交到新镜像，然后最终输出新镜像的ID。Docker守护程序将自动清理之前发送的上下文</p><p>请注意，每条指令都是独立运行的，并会导致创建新镜像，比如 RUN cd&#x2F;tmp对下一条指令不会有任何影响。</p><p>Docker将尽可能用中间镜像层（缓存），以显著加速docker build命令的执行过程，这由Using cache控制台输出中的消息提示</p><h3 id="Dockerfile镜像制作和使用流程"><a href="#Dockerfile镜像制作和使用流程" class="headerlink" title="Dockerfile镜像制作和使用流程"></a>Dockerfile镜像制作和使用流程</h3><p><img src="https://img.chensir.ink/chensir-pics/202208241736939.png" alt="image-20220824173636842"></p><h3 id="Dockerfile文件的制作镜像的分层结构"><a href="#Dockerfile文件的制作镜像的分层结构" class="headerlink" title="Dockerfile文件的制作镜像的分层结构"></a>Dockerfile文件的制作镜像的分层结构</h3><p><img src="https://img.chensir.ink/chensir-pics/202208242103479.png" alt="image-20220824210345381"></p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">按照业务类型或系统类型等方式划分创建目录环境，方便后期镜像比较多的时候进行分类</span></span><br><span class="line">[root@centos7 ~]# mkdir -p /data/dockerfile/&#123;web/&#123;nginx,apache,tomcat,jdk&#125;,system/&#123;centos,ubuntu,alpine,debin&#125;&#125;</span><br><span class="line">[root@centos7 ~]# tree /data/dockerfile/</span><br><span class="line">/data/dockerfile/</span><br><span class="line">├── system</span><br><span class="line">│   ├── alpine</span><br><span class="line">│   ├── centos</span><br><span class="line">│   ├── debin</span><br><span class="line">│   └── ubuntu</span><br><span class="line">└── web</span><br><span class="line">    ├── apache</span><br><span class="line">    ├── jdk</span><br><span class="line">    ├── nginx</span><br><span class="line">    └── tomcat</span><br></pre></td></tr></table></figure><h3 id="Dockerfile文件格式"><a href="#Dockerfile文件格式" class="headerlink" title="Dockerfile文件格式"></a>Dockerfile文件格式</h3><p>Dockerfile 是一个有特定语法格式的文本文件</p><p>Dockerfile 官方说明：<a href="https://docs.docker.com/engine/reference/builder/">https://docs.docker.com/engine/reference/builder/</a></p><p>帮助：man 5 dockerfile</p><p>Dockerfile文件说明</p><ul><li>每一行Dockerfile的指令开头，指令不区分大小写，但是惯例使用大写</li><li>使用#开始作为注释</li><li>每一行只支持一条指令，没调指令可以携带多个参数</li><li>指令按文件的顺序从上至下进行执行</li><li>每个指令的执行会生成一个新的镜像层，为了减少分层和镜像大小，尽可能将多条指令合并成一条指令</li><li>制作镜像一般可能需要反复多次，每次执行Dockerfile都按顺序执行，从头开始，已经执行过的指令已经缓存，不需要在执行，如果后续有一行新的指令没执行过，其往后的指令将会重新执行，所以为加速镜像制作，将最常变化的内容放下dockerfile的文件的后面</li></ul><h3 id="Dockerfile相关指令"><a href="#Dockerfile相关指令" class="headerlink" title="Dockerfile相关指令"></a>Dockerfile相关指令</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">ADD</span><br><span class="line">COPY</span><br><span class="line">ENV</span><br><span class="line">EXPOSE</span><br><span class="line">FROM</span><br><span class="line">LABEL</span><br><span class="line">STOPSIGNAL</span><br><span class="line">USER</span><br><span class="line">VOLUME</span><br><span class="line">WORKDIR</span><br></pre></td></tr></table></figure><h4 id="FROM：指定基础镜像"><a href="#FROM：指定基础镜像" class="headerlink" title="FROM：指定基础镜像"></a>FROM：指定基础镜像</h4><p>定制镜像，需要先有一个基础镜像，在这个基础镜像上进行定制。</p><p>FROM 就是指定基础镜像，此指令通常必须放在Dockerfile文件第一个非注释行。后续的指令都是运行于此基准镜像所提供的的运行环境</p><p>基础镜像可以是任何可用镜像文件，默认情况下，docker build会在docker主机上查找指定的镜像文件，若不存在，则会从docker hub registry上拉取所需的镜像文件。如果找不到指定的镜像文件，docker build会返回一个错误信息</p><p><strong>如何选择合适的镜像呢？</strong></p><p>对于不同的软件官方都提供了相关的docker镜像，比如：nginx、redis、mysql、httpd、tomcat等服务类的镜像，也有操作系统类，如：centos、ubuntu、debian等。建议使用官方镜像，比较安全。</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">FROM [--platform=&lt;platform&gt;] &lt;image&gt; [AS &lt;name&gt;]</span><br><span class="line">FROM [--platform=&lt;platform&gt;] &lt;image&gt;[:&lt;tag&gt;] [AS &lt;name&gt;]</span><br><span class="line">FROM [--platform=&lt;platform&gt;] &lt;image&gt;[@&lt;digest&gt;] [AS &lt;name&gt;]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">说明：</span></span><br><span class="line">--platform 指定镜像的平台，比如：linux/amd64,linux/arm64,or windows/amd64</span><br><span class="line">tag 和 digest是可选项，如果不指定，默认为latest</span><br></pre></td></tr></table></figure><p><strong>说明：关于scrach镜像</strong></p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">FROM scratch # 所有镜像的起源镜像，相当于object类</span><br><span class="line">参考链接：</span><br><span class="line">https://hub.docker.com/_/scratch?tab=description</span><br><span class="line">https://docs.docker.com/develop/develop-images/baseimages/</span><br><span class="line">该镜像是一个空的镜像，可以用于构建busybox等超小镜像，可以说是真正的从零开始构建属于自己的镜像</span><br><span class="line">该镜像在构建基础镜像（例如Debian和busybox）或超最小镜像（仅包含一个二进制文件及其所需内容，例如：hello-world）的上下文中最有用。</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例</span></span><br><span class="line">FROM ubuntu</span><br><span class="line">FROM ubuntu:bionic</span><br><span class="line">FROM debian:buster-slim</span><br></pre></td></tr></table></figure><h4 id="LABEL：指定镜像元数据"><a href="#LABEL：指定镜像元数据" class="headerlink" title="LABEL：指定镜像元数据"></a>LABEL：指定镜像元数据</h4><p>可以指定镜像元数据，如：镜像作者等</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">LABEL &lt;key&gt;=&lt;value&gt; &lt;key&gt;=&lt;value&gt; &lt;key&gt;:&lt;value&gt;...</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例</span></span><br><span class="line">LABEL &quot;com.example.vendor&quot;=&quot;ACME Incorporated&quot;</span><br><span class="line">LABEL com.example.label-with-value=&quot;foo&quot;</span><br><span class="line">LABEL version=&quot;1.0&quot;</span><br><span class="line">LABEL description=&quot;This text illustrates that label-values can span multiple lines&quot;</span><br></pre></td></tr></table></figure><p>一个镜像可以有多个label，还可以写在一行中，即多个标签写法，可以减少镜像的大小</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">多标签写法</span></span><br><span class="line">LABEL multi.label1=&quot;value1&quot; multi.label2=&quot;value2&quot; other=&quot;value3&quot;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">多行格式</span></span><br><span class="line">LABEL multi.label1=&quot;value1&quot; \</span><br><span class="line">multi.label2=&quot;value2&quot;\</span><br><span class="line">other=&quot;value3&quot;</span><br></pre></td></tr></table></figure><p>docker inspect 命令可以查看LABEL</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker inspect centos:centos7.7.1908</span><br><span class="line"></span><br><span class="line">&quot;Labels&quot;: &#123;</span><br><span class="line">  &quot;org.label-schema.build-date&quot;: &quot;20191024&quot;,</span><br><span class="line">  &quot;org.label-schema.license&quot;: &quot;GPLv2&quot;,</span><br><span class="line">  &quot;org.label-schema.name&quot;: &quot;CentOS Base Image&quot;,</span><br><span class="line">  &quot;org.label-schema.schema-version&quot;: &quot;1.0&quot;,</span><br><span class="line">  &quot;org.label-schema.vendor&quot;: &quot;CentOS&quot;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="RUN：执行shell命令"><a href="#RUN：执行shell命令" class="headerlink" title="RUN：执行shell命令"></a>RUN：执行shell命令</h4><p>RUN指令用来在构建镜像阶段需要执行FROM指定镜像所支持的shell命令。</p><p>通常各种基础镜像一般都支持丰富的shell命令</p><p>注意：RUN可以写多个，每一个RUN指令都会建立一个镜像层，所以尽可能合并成一条指令，比如将多个shell命令通过&amp;&amp;连接一起成为一条指令</p><p>每个RUN都是独立运行的，和前一个RUN无关</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">shell 格式：相当于 /bin/sh -c &lt;命令&gt; 此种形式支持环境变量</span></span><br><span class="line">RUN &lt;命令&gt;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="built_in">exec</span> 格式：此种形式不支持环境变量，注意：是双引号，不能是单引号</span></span><br><span class="line">RUN [&quot;可执行文件&quot;,&quot;参数1&quot;,&quot;参数2&quot;]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="built_in">exec</span>格式可以指定其他shell</span></span><br><span class="line">RUN [&quot;/bin/bash&quot;,&quot;-c&quot;,&quot;echo hello chensir&quot;]</span><br></pre></td></tr></table></figure><p>说明</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">shell格式中，&lt;command&gt;通常是一个shell命令，且以 &quot;/bin/sh -c&quot; 来运行它，这意味着此进程在容器中的PID不为1，不能接受Unix信号，因此，当使用 docker stop &lt;container&gt; 命令停止容器时，此进程接收不到SIGTERM信号</span><br><span class="line"></span><br><span class="line">exec格式中的参数是一个JSON格式的数组，其中&lt;executable&gt;为要运行的命令，后面&lt;paramN&gt;为传递给命令的选项或参数；然而，此种格式指定的命令不会以 &quot;/bin/sh -c&quot; 来发起，因此常见的shell操作如变量替换以及通配符(?,*)替换将不会进行；不过，如果要运行的命令依赖于shell特性的话，可以将其替代换为类似下面的格式。</span><br><span class="line">RUN [&quot;/bin/bash&quot;,&quot;-c&quot;,&quot;&lt;executable&gt;&quot;,&quot;&lt;laram1&gt;&quot;]</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例</span></span><br><span class="line">RUN echo &#x27;&lt;h1&gt;Hello,Docker&lt;/h1&gt;&#x27; &gt; /usr/share/nginx/html/index.html</span><br><span class="line">RUN [&quot;/bin/bash&quot;,&quot;-c&quot;,&quot;echo hello world&quot;]</span><br><span class="line">RUN yum install -y epel-release</span><br><span class="line"> &amp;&amp; yum install -y nginx</span><br><span class="line"> &amp;&amp; rm -rf /usr/share/nginx/html/* </span><br><span class="line"> &amp;&amp; echo &quot;&lt;h1&gt;docker test nginx&lt;/h1&gt;&quot; &gt; /usr/share/nginx/html/index.html</span><br><span class="line"><span class="meta prompt_"> </span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例多个前后RUN命令独立无关和shell命令不同</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">world.txt并不存放在app内</span></span><br><span class="line">RUN cd /app</span><br><span class="line">RUN echo &quot;hello&quot; &gt; world.txt</span><br></pre></td></tr></table></figure><h4 id="ENV：设置环境变量"><a href="#ENV：设置环境变量" class="headerlink" title="ENV：设置环境变量"></a>ENV：设置环境变量</h4><p>ENV可以定义环境变量和值，会被后续指令（ENV，ADD，COPY，RUN等）通过$KEY或${KEY}进行引用，并在容器运行时保存</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">变量赋值格式1 此格式只能对一个key赋值，&lt;key&gt;之后的所有内容均会被视作其&lt;value&gt;的组成部分</span></span><br><span class="line">ENV &lt;key&gt; &lt;value&gt; </span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">变量赋值格式2 此格式可以支持多个key赋值，定义多个变量建议使用，减少镜像层</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">如果&lt;value&gt;中包含空格，可以以反斜杠 \ 进行转义，也可以通过对&lt;value&gt;加引号进行标识；反斜杠也可用于读行</span></span><br><span class="line">ENV &lt;key1&gt;=&lt;value1&gt; &lt;key2&gt;=&lt;value2&gt; ... </span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">只使用一次变量</span></span><br><span class="line">RUN &lt;key&gt;=&lt;value&gt; &lt;command&gt;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">引用变量</span></span><br><span class="line">RUN $key</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">变量支持高级赋值格式</span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">&#123;key:-word&#125;</span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">&#123;key:+word&#125;</span></span><br></pre></td></tr></table></figure><p>如果运行容器是需要修改变量，可以执行下面通过基于exec机制实现</p><p>注意：下面方式只影响容器运行时环境，而不影响构建镜像的过程，即只能覆盖 docker run时的环境变量，而不会影响docker build时的环境变量的值</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker run -e | --env &lt;key&gt;=&lt;value&gt;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">说明</span></span><br><span class="line">-e,--env list# Set environment variables</span><br><span class="line"> --env-file filename# Read in a file of environment variables</span><br><span class="line"><span class="meta prompt_"> </span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例：两种格式功能相同</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">格式1</span></span><br><span class="line">ENV myName=&quot;John Doe&quot; myDog=Rex\ The\ Dog myCat=fluffy</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">格式2</span></span><br><span class="line">ENV myName John Doe</span><br><span class="line">ENV myDog Rex The Dog</span><br><span class="line">ENV myCat fluffy</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# cat Dockerfile</span><br><span class="line">FROM busybox</span><br><span class="line">LABEL maintainer=&quot;chensir &lt;root@chensir.ink&gt;&quot;</span><br><span class="line">ENV NAME zhao xing chen</span><br><span class="line">RUN touch $NAME.txt</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# cat build.sh</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line">TAG=$1</span><br><span class="line">docker build -t test:$TAG .</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# ./build.sh v5.0</span><br></pre></td></tr></table></figure><h4 id="COPY：复制文本"><a href="#COPY：复制文本" class="headerlink" title="COPY：复制文本"></a>COPY：复制文本</h4><p>复制本地宿主机的文件 到容器中</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">COPY [--chown=&lt;user&gt;:&lt;group&gt;] &lt;src&gt;... &lt;dest&gt;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">路径中有空白字符时，建议使用此格式</span></span><br><span class="line">COPY [--chown=&lt;user&gt;:&lt;group&gt;] [&quot;&lt;src&gt;&quot;,...&quot;&lt;dest&gt;&quot;] </span><br></pre></td></tr></table></figure><p><strong>说明：</strong></p><ul><li>可以是多个，可以使用通配符，通配符规则满足Go的filepath.Match规则</li><li>必须是build上下文中的路径（Dockerfile 所在目录的相对路径），<strong>不能是其父目录中的文件</strong></li><li>如果是目录，则其内部文件或子目录会被递归复制，<strong>但目录自身不会被复制</strong></li><li>如果指定了多个，或在其中使用了通配符，则必须是一个目录，且必须是以 &#x2F; 结尾</li><li>可以是绝对路径或者是WORKDIR指定的相对路径</li><li>使用COPY指令，源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等</li><li>如果事先不存在，它会被自动创建，这包括其父目录路径，即递归创建目录</li></ul><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">COPY hom* /mydir/</span><br><span class="line">COPY hom?.txt /mydir/</span><br></pre></td></tr></table></figure><h4 id="ADD：复制和解包文件"><a href="#ADD：复制和解包文件" class="headerlink" title="ADD：复制和解包文件"></a>ADD：复制和解包文件</h4><p>该命令可以认为是增强版的COPY，不仅支持COPY，还支持自动解包。可以将复制指定的文件到容器中</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">ADD [--chown=&lt;user&gt;:&lt;group&gt;] &lt;src&gt;...&lt;dest&gt;</span><br><span class="line">ADD [--chown=&lt;user&gt;:&lt;group&gt;] [&quot;&lt;src&gt;&quot;,...&quot;&lt;dest&gt;&quot;]</span><br></pre></td></tr></table></figure><p>说明：</p><ul><li>可以是Dockerfile所在目录的一个相对路径；也可是一个URL；还可以是一个tar文件（自动解压）</li><li>可以是绝对路径或是WORKDIR指定的相对路径</li><li>如果是目录，只复目录中的内容，而非目录本身</li><li>如果是一个URL，下载后的文件权限自动设置为600</li><li>如果为URL且不以&#x2F;结尾，则指定的文件将被下载并直接被创建，如果以&#x2F;结尾，则文件名URL指定的文件将被直接下载并保存为&#x2F;<filename></li><li>如果是一个本地文件系统上的打包文件，如：gz，bz2，xz，它将被解包，其行为类似 “tar -x” 命令，但是通过URL获取到的tar文件将不会自动展开</li><li>如果有多个，或间接或直接使用了通配符，则必须是一个以&#x2F;结尾的目录路径；如果不以&#x2F;结尾。则被视作一个普通文件</li></ul><h4 id="CMD：容器启动命令"><a href="#CMD：容器启动命令" class="headerlink" title="CMD：容器启动命令"></a>CMD：容器启动命令</h4><p>一个容器中需要持续运行的进程一般只有一个，CMD用来指定启动程序时默认执行的一个命令，且其运行结束后，容器也会停止，所以一般CMD指定的命令为持续运行且为前台命令</p><ul><li>如果docker run没有指定任何的执行命令或者dockerfile里面也没有ENTRYPOINT，那么开启容器时就会执行CMD指定的默认命令</li><li>前面介绍过的RUN命令是在构建镜像执行的命令，注意二者的不同之处</li><li>每个Dockerfile只能有一条CMD命令。如指定了多条，只有最后一条被执行</li><li>如果用户启动容器时用docker run xxx指定运行的命令，则会覆盖CMD指定的命令</li></ul><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">使用<span class="built_in">exec</span>执行，推荐方式，第一个参数必须是命令的全路径，此种形式而不支持环境变量</span></span><br><span class="line">CMD [&quot;executable&quot;,&quot;param1&quot;,&quot;param2&quot;]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在 /bin/sh 中执行，提供给需要交互的应用；池中形式支持环境变量</span></span><br><span class="line">CMD command param1 param2</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">提供给ENTRYPOINT命令的默认参数</span></span><br><span class="line">CMD [&quot;param1&quot;,&quot;param2&quot;]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例</span></span><br><span class="line">CMD [&quot;nginx&quot;,&quot;-g&quot;,&quot;daemon off&quot;]</span><br></pre></td></tr></table></figure><h4 id="ENTRYPOINT：入口点"><a href="#ENTRYPOINT：入口点" class="headerlink" title="ENTRYPOINT：入口点"></a>ENTRYPOINT：入口点</h4><p>功能类似于CMD，配置容器启动后执行的命令及参数</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">使用<span class="built_in">exec</span>执行</span></span><br><span class="line">ENTRYPOINT [&quot;executable&quot;,&quot;param1&quot;,&quot;param2&quot;]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">shell中执行</span></span><br><span class="line">ENTRYPOINT command param1 param2</span><br></pre></td></tr></table></figure><ul><li>ENTRYPOINT不能被docker run提供的参数覆盖，而是追加，即如果docker run命令有参数，那么参数全部都会作为ENTRYPOINT的参数</li><li>如果docker run后面没有额外的参数，但是Dockerfile中的CMD里有（即上面的第三种用法），即Dockerfile中即有CMD也有ENTRYPOINT，那么CMD的全部内容会作为ENYRTPOINT的参数</li><li>如果docker run后面有额外参数，同时Dockerfile中既有CMD也有ENTRYPOINT，那么docker run后面的参数覆盖掉CMD参数内容，最终作为ENTRYPOINT的参数</li><li>可以通过docker run - -entrypoint string参数在运行时替换，注意string不要加空格</li><li>使用CMD要在运行时重新写命令本身，然后在后面才能追加运行参数，ENTRYPOINT则可以运行时无需重写命令皆可以直接接收新参数</li><li>每个Dockerfile中只能有一个ENTRYPOINT，当指定多个时，只有最后一个生效</li></ul><h4 id="ARG：构建参数"><a href="#ARG：构建参数" class="headerlink" title="ARG：构建参数"></a>ARG：构建参数</h4><p>ARG指令在build阶段指定变量，和ENV不同的是，容器运行时不会存在这些环境变量</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">ARG &lt;name&gt;[=&lt;default value&gt;]</span><br></pre></td></tr></table></figure><p>如果和ENV同名，ENV覆盖ARG变量</p><p>可以用 <code>docekr build --build-arg &lt;参数名&gt;=&lt;值&gt;</code> 来覆盖</p><p>说明：ARG和FROM</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">FROM指令支持由第一个FROM之前的任何ARG指令声明的变量</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例：</span></span><br><span class="line">ARG CODE_VERSION=latest</span><br><span class="line">FROM base:$&#123;CODE_VERSION&#125;</span><br><span class="line">CMD /code/run-app</span><br><span class="line">FROM extras:$&#123;CODE_VERSION&#125;</span><br><span class="line">CMD /code/run-extras</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在FROM之前声明的ARG在构建阶段之外，所以它不能在FROM之后的任何指令中使用。要使用在第一个FROM之前声明的ARG的默认值，请在构建阶段内使用没有值的SRG指令</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例：</span></span><br><span class="line">ARG VERSION=latest</span><br><span class="line">FROM busybox:$VERSION</span><br><span class="line">ARG VERSION</span><br><span class="line">RUN echo $VERSION &gt; image_version</span><br></pre></td></tr></table></figure><h4 id="VOLUME：匿名卷"><a href="#VOLUME：匿名卷" class="headerlink" title="VOLUME：匿名卷"></a>VOLUME：匿名卷</h4><p>在容器中创建一个可以从本地主机或其他容器挂载的挂载点，一般用来存放数据库和需要保存的数据等，一般会将宿主机上的目录挂载至VOLUME指令指定的容器目录。即使容器后期被删除，次宿主机的目录仍会保留，从而实现容器数据的持久保存</p><p>宿主机的目录为 <code>/var/lib/docker/volumes/&lt;volume_id&gt;/_data</code></p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">VOLUME &lt;容器内路径&gt;</span><br><span class="line">VOLUME [&quot;&lt;容器内路径1&quot;,&quot;容器内路径2&quot;]</span><br></pre></td></tr></table></figure><p>注意：</p><ul><li>Dockerfile中的VOLUME实现的是匿名数据卷，无法指定宿主机路径和容器目录的挂载关系</li><li>通过docker rm -fv &lt;容器ID&gt; 可以删除容器的同时删除VOLUME指定的卷</li></ul><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例：在容器创建两个 /data/ , /data2的挂载点</span></span><br><span class="line">VOLUME [&quot;/data1&quot;,&quot;/data2&quot;]</span><br></pre></td></tr></table></figure><h4 id="EXPOSE：暴露端口"><a href="#EXPOSE：暴露端口" class="headerlink" title="EXPOSE：暴露端口"></a>EXPOSE：暴露端口</h4><p>指定服务端的容器需要对外暴露（监听）的端口号，以实现容器与外部通信</p><p>EXPOSE仅仅是声明容器打算使用什么端口而已，并不会真正暴露端口，即不会自动在宿主机进行端口映射</p><p>因此，在启动容器时需要通过-P或-p，Docker主机才会真正分配一个端口转发到指定暴露的端口才可使用</p><p><strong>注意</strong>：即使Dockerfile没有EXPOSE端口指令，也可以通过docker run -p临时暴露容器内程序真正监听的端口，所以EXPOSE相当于指定默认的暴露端口，可以通过docker run -P&#x2F;-p 进行真正暴露</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">EXPOSE &lt;port&gt;[/ &lt;protocol&gt;] [&lt;port&gt;[/ &lt;protocol&gt;]...]</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">说明</span></span><br><span class="line">&lt;protocol&gt;用于指定传输层协议，可为tcp或udp二者之一，默认为TCP协议</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例</span></span><br><span class="line">EXPOSE 80 443</span><br><span class="line">EXPOSE 11211/udp 11211/tcp</span><br></pre></td></tr></table></figure><h4 id="WORKDIR：指定工作目录"><a href="#WORKDIR：指定工作目录" class="headerlink" title="WORKDIR：指定工作目录"></a>WORKDIR：指定工作目录</h4><p>为后续的RUN、CMD、ENTRYPOINT指令配置工作目录，当运行容器后，进入容器内WORKDIR指定的默认目录</p><p>WORKDIR指定工作目录（或称当前目录），以后各层的当前目录就被改为指定的目录，如该目录不存在，WORKDIR会自行创建</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">WORKDIR /path/to/workdir</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">两次 RUN 独立运行，不在同一个目录</span></span><br><span class="line">RUN cd /app</span><br><span class="line">RUN echo &quot;hello&quot; &gt; world.txt</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">如果想实现相同目录可以使用 WORKDIR</span></span><br><span class="line">WORKDIR /app</span><br><span class="line">RUN echo &quot;hello&quot; &gt; world.txt</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">可以使用多个WORKDIR指令，后续命令如果参数是相对路径，则会基于之前命令指定的路径</span></span><br><span class="line">WORKDIR /a</span><br><span class="line">WORKDIR b</span><br><span class="line">WORKDIR c</span><br><span class="line">RUN pwd</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">最终路径为 /a/b/c</span></span><br></pre></td></tr></table></figure><h4 id="ONBUILD：子镜像引用父镜像的指令"><a href="#ONBUILD：子镜像引用父镜像的指令" class="headerlink" title="ONBUILD：子镜像引用父镜像的指令"></a>ONBUILD：子镜像引用父镜像的指令</h4><p>可以用来配置当构建当前镜像的子镜像时，会自动触发执行的命令，但在当前镜像构建时，并不会执行，即延迟到子镜像构建时才执行</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">ONBUILD [INSTRUCTION]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Dockerfile使用如下的内容创建了镜像 image-A</span></span><br><span class="line">ONBUILD ADD https://chensir.ink/pic/a.png /data</span><br><span class="line">ONBUILD RUN rm -rf /*</span><br><span class="line">ONBUILD RUN /usr/local/bin/python-build --dir /app/src...</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">如果基于image-A创建新的镜像image-B时，新的Dockerfile中使用FROM image-A指定基础竟像时，会自动执行ONBUILD指令内容，等价于在后面添加了两条指令。</span></span><br><span class="line">FROM image-A</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Automatically run the following</span></span><br><span class="line">ADD https://chensir.ink/pic/a.png /data</span><br><span class="line">RUN /usr/local/bin/python-build --dir /app/src...</span><br></pre></td></tr></table></figure><p>说明：</p><ul><li>尽管任何指令都可以注册成为触发器指令，但ONBUILD不能自我使用，且不会触发FROM和MAINTAINER指令</li><li>使用ONBUILD指令的镜像，推荐在标签中注明，例如 ruby:1.9-onbuild</li></ul><h4 id="USER：指定当前用户"><a href="#USER：指定当前用户" class="headerlink" title="USER：指定当前用户"></a>USER：指定当前用户</h4><p>指定运行容器时的用户名或UID，后续的RUN也会使用指定用户</p><p>当服务不需要管理员权限时，可以通过该命令指定运行用户</p><p>这个用户必须是事先建立好的，否则无法切换</p><p>如果没有指定USER，默认是root身份执行</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">USER &lt;user&gt;[:&lt;group&gt;]</span><br><span class="line">USER &lt;UID&gt;[:&lt;GID&gt;]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例</span></span><br><span class="line">RUN groupadd -r mysql &amp;&amp; useradd -r -g mysql mysql</span><br><span class="line">USER mysql</span><br></pre></td></tr></table></figure><h4 id="HEALTHCHECK：监控检查"><a href="#HEALTHCHECK：监控检查" class="headerlink" title="HEALTHCHECK：监控检查"></a>HEALTHCHECK：监控检查</h4><p>检查容器的健康性</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">设置检查容器健康状况的命令</span></span><br><span class="line">HEALTHCHECK [选项] CMD &lt;命令&gt;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">如果基础镜像有健康检查指令，使用这行可以屏蔽掉其健康检查指令</span></span><br><span class="line">HEALTHCHECK NONE</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">HEALTHCHECK 支持下列选项：</span></span><br><span class="line">--interval=&lt;间隔&gt; # 两次健康检查的间隔，默认30秒</span><br><span class="line">--timeout=&lt;时长&gt;# 健康检查命令运行超时时间，如果超过这个时间，本次健康检查就被视为失败，默认30秒</span><br><span class="line">--retries=&lt;次数&gt;# 当连续失败指定次数后，则将容器状态视为 unhealthy，默认3次</span><br><span class="line">--start-period=&lt;FDURATION&gt; # default：0s</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">检查结果返回值</span></span><br><span class="line">0 # success</span><br><span class="line">1 # unhealth</span><br><span class="line">2 # reserved</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例</span></span><br><span class="line">FROM nginx</span><br><span class="line">RUN apt-get update &amp;&amp; apt-get install -y curl &amp;&amp; rm -rf /var/lib/spt/lists/*</span><br><span class="line">HEALTHCHECK --interval=5s --timeout=3s \</span><br><span class="line">CMD curl -fs http://localhost/ || exit 1</span><br></pre></td></tr></table></figure><h4 id="STOPSIGNAL：退出容器信号"><a href="#STOPSIGNAL：退出容器信号" class="headerlink" title="STOPSIGNAL：退出容器信号"></a>STOPSIGNAL：退出容器信号</h4><p>STOPSIGNAL指令设置将被发送到容器退出的系统调用信号。该信号可以是与内核syscall表中的位置匹配的有效无符号数字，也可以是SIGNAME格式的信号名称（如SIGKILL）</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">STOPSIGNAL signal</span><br></pre></td></tr></table></figure><h4 id="SHELL：指定shell"><a href="#SHELL：指定shell" class="headerlink" title="SHELL：指定shell"></a>SHELL：指定shell</h4><p>SHELL指令允许覆盖用于命令的shell形式的默认SHLL，必须在Dockerfile中以JSON形式编写SHELL指令。</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">SHELL [&quot;executable&quot;,&quot;parameters&quot;]</span><br></pre></td></tr></table></figure><p>在Linux上默认SHELL程序 <code>[&quot;/bin/sh&quot;,&quot;-c&quot;]</code>，在Windows上，默认SHELL程序为 <code>[&quot;cmd&quot;,&quot;/S&quot;,&quot;/C&quot;]</code>。</p><p>SHELL指令在Windows上特别有用，在Windows上有两个常用且往前不同的本机SHELL:cmd和powershell，以及包括sh在内的备用shell</p><p>SHELL指令可以出现多次。每个SHELL指令将覆盖所有先前的SHELL指令，并影响所有后续的指令</p><h4 id="dockerignore文件"><a href="#dockerignore文件" class="headerlink" title=".dockerignore文件"></a>.dockerignore文件</h4><p>与.gitignore文件类似，生成构建上下文时Docker客户端应忽略的文件和文件夹指定模式</p><p>.dockerignore使用Go的文件路径规则filepath.Match</p><p><strong>完整的语法</strong></p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> <span class="comment"># 以#开头的行为注释</span></span></span><br><span class="line">*  # 匹配任何非分隔符字符序列</span><br><span class="line">?  # 匹配任何单个非分隔符</span><br><span class="line">\\ # 表示 \</span><br><span class="line">** # 匹配任意数量的目录（包括零）例如 **/*.go 将排除在所有目录中以.go结尾的所有文件，包括构建上下文的根</span><br><span class="line">!  # 表示取反，可用于排除例外情况</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">排除 <span class="built_in">test</span> 目录下的所有文件</span></span><br><span class="line">test/*</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">排除 md 目录下的 xttblog.md 文件</span></span><br><span class="line">md/xttblog.md</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">排除 xttblog 为前缀的文件和文件夹</span></span><br><span class="line">xttblog?</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">排除所有目录下的 .sql文件夹</span></span><br><span class="line">**/*.sql</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">除了README的md不排外，排除所有md文件，但不排除README-secret.md</span></span><br><span class="line">*.md</span><br><span class="line">!README*.md</span><br><span class="line">README-secret.md</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">除了所有README的md文件以外的md都排除</span></span><br><span class="line">*.md</span><br><span class="line">README-sevret.md</span><br><span class="line">!README*.md</span><br></pre></td></tr></table></figure><h4 id="dockerfile构建过程和指令总结"><a href="#dockerfile构建过程和指令总结" class="headerlink" title="dockerfile构建过程和指令总结"></a>dockerfile构建过程和指令总结</h4><h5 id="Dockerfile-构建过程"><a href="#Dockerfile-构建过程" class="headerlink" title="Dockerfile 构建过程"></a>Dockerfile 构建过程</h5><ul><li>从基础镜像运行一个容器</li><li>执行一条指令，对容器做出修改</li><li>执行类似docker commit的操作，提交一个新的中间镜像层（可以利用中间层镜像创建容器进项调试和排错）</li><li>再基于刚提交的镜像运行一个新容器</li><li>执行Dockerfile中的下一条指令，直至所有指令执行完毕</li></ul><h5 id="Dockerfile指令总结"><a href="#Dockerfile指令总结" class="headerlink" title="Dockerfile指令总结"></a>Dockerfile指令总结</h5><table><thead><tr><th>BUILD</th><th>RUN</th><th>BOTH</th></tr></thead><tbody><tr><td>FROM</td><td>CMD</td><td>WORKDIR</td></tr><tr><td>LABEL</td><td>VOLUME</td><td>USER</td></tr><tr><td>COPY</td><td>EXPOSE</td><td>ENV</td></tr><tr><td>ADD</td><td>ENTRYPOINT</td><td></td></tr><tr><td>RUN</td><td></td><td></td></tr><tr><td>ONBUILD</td><td></td><td></td></tr><tr><td>.dockerignore</td><td></td><td></td></tr></tbody></table><h3 id="构建镜像docker-build命令"><a href="#构建镜像docker-build命令" class="headerlink" title="构建镜像docker build命令"></a>构建镜像docker build命令</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker build [OPTION] PATH | URL |-</span><br><span class="line">说明：</span><br><span class="line">PATH | URL | -   # 可以是本地路径，也可以是URL路径。如设置为 -，则从标准输入获取Dockerfile的内容</span><br><span class="line">-f,--file string # Dockerfile文件名，默认为PATH/Dockerfile</span><br><span class="line">--force-rm # 总是删除中间层容器，创建镜像失败时，删除临时容器</span><br><span class="line">--no-cache # 不使用之前构建中创建的缓存</span><br><span class="line">-q --quiet=false # 不显示Dockerfile的RUN运行的输出结果</span><br><span class="line">--rm=true # 创建镜像成功时，删除临时容器</span><br><span class="line">-t --tag list # 设置注册名称、镜像名称、标签。格式为 &lt;注册名称&gt;/&lt;镜像名称&gt;:&lt;标签&gt;(标签默认为latest)</span><br></pre></td></tr></table></figure><h1 id="Docker数据管理"><a href="#Docker数据管理" class="headerlink" title="Docker数据管理"></a>Docker数据管理</h1><h2 id="容器数据管理介绍"><a href="#容器数据管理介绍" class="headerlink" title="容器数据管理介绍"></a>容器数据管理介绍</h2><p>Docker镜像由多个只读层叠加而成，启动容器时，Docker会加载只读镜像层并在镜像栈顶部添加一个读写层</p><p>如果运行中的容器修改了现有的一个已经存在的文件，那该文件将会从读写层下面的只读层复制到读写层，该文件的只读版仍然存在，只是已经被读写层中该文件的副本所隐藏，即“写时复制（COW copy on write）机制”</p><p>如果将正在运行中的容器修改生成了新的数据，那么新产生的数据将会被复制到读写层，进行持久化保存，这个读写层也就是容器的工作目录，也为写时复制（COW）机制</p><h3 id="Docker容器的分层"><a href="#Docker容器的分层" class="headerlink" title="Docker容器的分层"></a>Docker容器的分层</h3><p>容器的数据分层目录</p><ul><li>LowerDir：image镜像层，即镜像本身，只读</li><li>UpperDir：容器的上层，可读写，容器变化的数据存放在此处</li><li>MergedDir：容器的文件系统，使用Union FS（联合文件系统）将lowerdir和upperdir合并完成后给容器使用，最终呈现给用户的统一视图</li><li>WorkDir：容器在宿主机的工作目录，挂载后内容会被清空，且在使用过程中其内容用户不可见</li></ul><p>每个镜像层目录中都包含了一个文件link，文件内容则是当前层对应的短标识符，镜像层的内容则存放在diff目录</p><p>删除容器后，所有数据目录都随之而删除</p><h3 id="哪些数据需要持久化"><a href="#哪些数据需要持久化" class="headerlink" title="哪些数据需要持久化"></a>哪些数据需要持久化</h3><h4 id="有状态的协议"><a href="#有状态的协议" class="headerlink" title="有状态的协议"></a>有状态的协议</h4><p>有状态协议就是通信双方要记住双方，并且共享一些信息。而无状态协议的通信每次都是独立的，与上一次的通信没什么关系。</p><p>“状态”可以理解为“记忆”，有状态对应有记忆，无状态对应无记忆</p><img src="https://img.chensir.ink/chensir-pics/202208252027293.png" alt="image-20220825202751166" style="zoom:50%;" /><ul><li>左侧是无状态的http请求服务，右侧为有状态</li><li>下层为不需要存储的服务，上层为需要存储的部分服务</li></ul><h3 id="容器数据持久保存方式"><a href="#容器数据持久保存方式" class="headerlink" title="容器数据持久保存方式"></a>容器数据持久保存方式</h3><p>如果要将写入到容器的数据永久保存，则需要建工人那个器中的数据保存到宿主机的指定目录</p><p>Docker的数据类型分为两种：</p><ul><li>数据卷（Data Volume）：直接将宿主机目录挂载至容器的指定的目录，推荐使用此种方式，此方式较常用</li><li>数据卷容器（Data Volume Container）：间接使用宿主机空间，数据卷容器是将宿主机的目录挂载至一个专门的数据卷容器，然后让其他容器通过数据卷容器读写宿主机的数据，此方式不常用</li></ul><h2 id="数据卷（data-volume）"><a href="#数据卷（data-volume）" class="headerlink" title="数据卷（data volume）"></a>数据卷（data volume）</h2><h3 id="数据卷的特点和使用"><a href="#数据卷的特点和使用" class="headerlink" title="数据卷的特点和使用"></a>数据卷的特点和使用</h3><p>数据卷实际上就是宿主机上的目录或是文件，可以被直接mount到容器当中使用</p><p>实际生产环境中，需要针对不同类型的服务、不同类型的数据存储要求做相应的规划，最终保证服务的可扩展性、稳定性以及数据的安全性</p><h4 id="数据卷使用场景"><a href="#数据卷使用场景" class="headerlink" title="数据卷使用场景"></a>数据卷使用场景</h4><ul><li>数据库</li><li>日志输出</li><li>静态web页面</li><li>应用配置文件</li><li>多容器间目录或文件共享</li></ul><h4 id="数据卷的特点"><a href="#数据卷的特点" class="headerlink" title="数据卷的特点"></a>数据卷的特点</h4><ul><li>数据卷是目录或者文件，并且可以在多个容器之间共同使用，实现容器之间共享和重用</li><li>对数据卷更改数据在所有容器里面会立即更新</li><li>数据卷的数据可以持久保存，及时删除使用该容器卷的容器也不影响</li><li>在容器里面的写入数据不会影响到镜像本身，即容器卷的变化不会影响镜像的更新</li><li>依赖于宿主机目录，宿主机出问题，上面容器会受影响，当宿主机较多时，不方便统一管理</li><li>匿名和命名数据卷在容器启动时初始化，如果容器使用的镜像在挂载点包含了数据，会开呗到新的初始化的数据卷中</li></ul><h4 id="数据卷使用方法"><a href="#数据卷使用方法" class="headerlink" title="数据卷使用方法"></a>数据卷使用方法</h4><p>启动容器时，可以指定使用数据卷实现容器数据的持久化，数据卷有三种</p><ul><li>指定宿主机目录或文件：指定宿主机的具体路径和容器路径的挂载关系</li><li>匿名卷：不指定数据名称，只指定容器内目录路径充当挂载点，docker自动指定宿主机的路径进行挂载</li><li>命名卷：指定数据卷的名称和容器路径的挂载关系</li></ul><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker run 命令的以下格式可以实现数据卷</span></span><br><span class="line">-v,--volume=[host-src:]container-dest[:options]</span><br><span class="line"></span><br><span class="line">&lt;options&gt;</span><br><span class="line">ro 从容器内对此数据卷是只读，不写此项默认为可读可写 </span><br><span class="line">rw 从容器内对此数据卷可读可写，此为默认值</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">指定宿主机目录或文件格式：</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">将宿主机目录挂载容器目录，两个目录都可自动创建</span></span><br><span class="line">-v &lt;宿主机绝对路径的目录或文件&gt;:&lt;容器目录或文件&gt;[:ro]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">匿名卷，只指定容器内路径，没有指定宿主机路径信息，宿主句自动生成/var/lib/docker/vlumes/&lt;卷ID&gt;/_data目录，并挂在至容器指定路径</span></span><br><span class="line">-v &lt;容器内路径&gt;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例</span></span><br><span class="line">docker run --name nginx -v /etc/nginx nginx</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">命名卷将固定的存放在/var/lib/docker/volumes/&lt;卷名&gt;/_data</span></span><br><span class="line">-v &lt;卷名&gt;:&lt;容器目录路径&gt;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">可以通过以下命令事先创建，如没有事先创建卷名，docker run时也会自动创建卷</span></span><br><span class="line">docker volume create &lt;卷名&gt;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例</span></span><br><span class="line">docker run -d -p 80:80 --name nginx01 -v vol1:/usr/share/nginx/html nginx</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker <span class="built_in">rm</span>的 -v 选项可以上处容器时，同时删除相关联的匿名卷</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">管理卷命令</span></span><br><span class="line">docker volume COMMAND</span><br><span class="line"></span><br><span class="line">Commands:</span><br><span class="line">create</span><br><span class="line">inspect</span><br><span class="line">ls</span><br><span class="line">prune</span><br><span class="line">rm</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看数据卷的挂载关系</span></span><br><span class="line">docker inspect --format=&quot;&#123;&#123;.Mounts&#125;&#125;&quot; &lt;容器ID&gt;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">删除所有数据卷</span></span><br><span class="line">docker volume rm `docker volume ls -q`</span><br></pre></td></tr></table></figure><h2 id="数据卷容器"><a href="#数据卷容器" class="headerlink" title="数据卷容器"></a>数据卷容器</h2><h3 id="数据卷容器介绍"><a href="#数据卷容器介绍" class="headerlink" title="数据卷容器介绍"></a>数据卷容器介绍</h3><p><img src="https://img.chensir.ink/chensir-pics/202208261034146.png" alt="image-20220826103411094"></p><p>在Dockerfile中创建的是匿名数据卷无法直接实现多个容器之间共享数据</p><p>数据卷容器最大的功能是可以让数据在多个docker容器之间共享</p><p>相当于先要创建一个后台运行的容器作为Server，用于提供数据卷，这个卷可以为其他容器提供数据存储服务，其他使用此卷的容器作为client端，但此方法不常使用</p><p>缺点：依赖一个Server的容器，所以此Server出了问题，其他Client容器都会受影响</p><h3 id="使用数据卷容器"><a href="#使用数据卷容器" class="headerlink" title="使用数据卷容器"></a>使用数据卷容器</h3><p>启动容器时，指定使用数据卷容器</p><p>docker run 命令的一下选项可以实现数据卷容器</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">--volume-from &lt;数据卷容器&gt;</span><br></pre></td></tr></table></figure><h3 id="数据卷容器总结"><a href="#数据卷容器总结" class="headerlink" title="数据卷容器总结"></a>数据卷容器总结</h3><p>将提供的容器Server删除，已经运行的容器Client依然可以使用挂载的卷，因为容器是通过挂载访问数据的，但是无法创建新的卷容器客户端，但是再把卷容器Server创建后即可正常创建卷容器Client，此方式可以用于线上共享数据目录等环境，因为即使数据卷容器被删除了，其他已经运行的容器依然可以挂载使用</p><p>由此可知，数据卷容器的功能知识将数据挂载信息传递给了其他使用数据卷容器的容器，而数据卷容器本身并不是提供数据存储功能</p><p>数据卷容器可以作为共享的方式为其他容器提供文件共享，类似于NFS，可以在生产中启动一个实例挂载本地的目录，然后其他的容器分别挂载此容器的目录，即可保证各容器之间的数据一致性</p><p>数据卷容器的Server和Client可以不使用同一个镜像生成</p><h1 id="网络管理"><a href="#网络管理" class="headerlink" title="网络管理"></a>网络管理</h1><h2 id="Docker默认的网络通信"><a href="#Docker默认的网络通信" class="headerlink" title="Docker默认的网络通信"></a>Docker默认的网络通信</h2><h3 id="Docker安装后默认的网络设置"><a href="#Docker安装后默认的网络设置" class="headerlink" title="Docker安装后默认的网络设置"></a>Docker安装后默认的网络设置</h3><p>docker容器创建后，必不可少的要和其他主机或容器进行网络通信</p><p>Docker服务安装完成之后，默认在每个宿主机会生成一个名称为docker0的网卡其IP地址都是172.17.0.1&#x2F;16</p><h3 id="创建容器后的网络配置"><a href="#创建容器后的网络配置" class="headerlink" title="创建容器后的网络配置"></a>创建容器后的网络配置</h3><p>每次新建容器后</p><ul><li>宿主机多了一个虚拟网卡，和容器的网卡组合成一个网卡，比如：137：veth8ca6e42@if136，而在容器内的网卡名为136，可以看出和宿主机的网卡之间的关联</li><li>容器会自动获取一个172.17.0.0&#x2F;16网段的随机地址，默认从172.17.0.2开始，第二次为172.17.0.3，以此类推</li><li>容器获取的地址并不固定，每次容器重启，可能会发生地址变化</li></ul><h3 id="容器间的通信"><a href="#容器间的通信" class="headerlink" title="容器间的通信"></a>容器间的通信</h3><h4 id="同一个宿主机的不同容器可相互通信"><a href="#同一个宿主机的不同容器可相互通信" class="headerlink" title="同一个宿主机的不同容器可相互通信"></a>同一个宿主机的不同容器可相互通信</h4><p>默认情况下</p><ul><li><p>同一个宿主机的不同容器之间可以相互通信</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">dockerd --icc  Enable inter-container communication （default true）</span><br><span class="line">--icc=false  # 此配置可以禁止同一个宿主机的容器之间通信</span><br></pre></td></tr></table></figure></li><li><p>不同宿主机之前的容器IP地址重复，默认不能相互通信</p></li></ul><h4 id="禁止同一个宿主机的不同容器间通信"><a href="#禁止同一个宿主机的不同容器间通信" class="headerlink" title="禁止同一个宿主机的不同容器间通信"></a>禁止同一个宿主机的不同容器间通信</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# vim /usr/lib/systemd/system/docker.service</span><br><span class="line">ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --icc=false</span><br><span class="line">[root@centos7 ~]# systemctl daemon-reload</span><br><span class="line">[root@centos7 ~]# systemctl restart docker</span><br></pre></td></tr></table></figure><h3 id="修改默认的网络设置"><a href="#修改默认的网络设置" class="headerlink" title="修改默认的网络设置"></a>修改默认的网络设置</h3><p>新建容器默认使用docekr0的网络配置，可以修改默认指向自定义的网桥网络</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">用自定义的网桥代替默认的docker0</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看默认网络</span></span><br><span class="line">[root@centos7 ~]# ip a</span><br><span class="line">1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN qlen 1</span><br><span class="line">    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00</span><br><span class="line">    inet 127.0.0.1/8 scope host lo</span><br><span class="line">       valid_lft forever preferred_lft forever</span><br><span class="line">    inet6 ::1/128 scope host</span><br><span class="line">       valid_lft forever preferred_lft forever</span><br><span class="line">2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP qlen 1000</span><br><span class="line">    link/ether 00:1c:42:2d:76:72 brd ff:ff:ff:ff:ff:ff</span><br><span class="line">    inet 10.0.0.14/24 brd 10.0.0.255 scope global dynamic eth0</span><br><span class="line">       valid_lft 1219sec preferred_lft 1219sec</span><br><span class="line">    inet6 fe80::b56f:3e7e:8cac:f26d/64 scope link</span><br><span class="line">       valid_lft forever preferred_lft forever</span><br><span class="line">3: docker0: &lt;NO-CARRIER,BROADCAST,MULTICAST,UP&gt; mtu 1500 qdisc noqueue state DOWN</span><br><span class="line">    link/ether 02:42:c6:6c:af:1d brd ff:ff:ff:ff:ff:ff</span><br><span class="line">    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0</span><br><span class="line">       valid_lft forever preferred_lft forever</span><br><span class="line">    inet6 fe80::42:c6ff:fe6c:af1d/64 scope link</span><br><span class="line">       valid_lft forever preferred_lft forever</span><br><span class="line">[root@centos7 ~]# yum install -y bridge-utils</span><br><span class="line">[root@centos7 ~]# brctl addbr br0</span><br><span class="line">[root@centos7 ~]# ip a a 192.168.100.1/24 dev br0</span><br><span class="line">[root@centos7 ~]# brctl show</span><br><span class="line">bridge namebridge idSTP enabledinterfaces</span><br><span class="line">br08000.000000000000no</span><br><span class="line">docker08000.0242c66caf1dno</span><br><span class="line">[root@centos7 ~]# ip a</span><br><span class="line">1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN qlen 1</span><br><span class="line">    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00</span><br><span class="line">    inet 127.0.0.1/8 scope host lo</span><br><span class="line">       valid_lft forever preferred_lft forever</span><br><span class="line">    inet6 ::1/128 scope host</span><br><span class="line">       valid_lft forever preferred_lft forever</span><br><span class="line">2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP qlen 1000</span><br><span class="line">    link/ether 00:1c:42:2d:76:72 brd ff:ff:ff:ff:ff:ff</span><br><span class="line">    inet 10.0.0.14/24 brd 10.0.0.255 scope global dynamic eth0</span><br><span class="line">       valid_lft 1100sec preferred_lft 1100sec</span><br><span class="line">    inet6 fe80::b56f:3e7e:8cac:f26d/64 scope link</span><br><span class="line">       valid_lft forever preferred_lft forever</span><br><span class="line">3: docker0: &lt;NO-CARRIER,BROADCAST,MULTICAST,UP&gt; mtu 1500 qdisc noqueue state DOWN</span><br><span class="line">    link/ether 02:42:c6:6c:af:1d brd ff:ff:ff:ff:ff:ff</span><br><span class="line">    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0</span><br><span class="line">       valid_lft forever preferred_lft forever</span><br><span class="line">    inet6 fe80::42:c6ff:fe6c:af1d/64 scope link</span><br><span class="line">       valid_lft forever preferred_lft forever</span><br><span class="line">22: br0: &lt;BROADCAST,MULTICAST&gt; mtu 1500 qdisc noop state DOWN qlen 1000</span><br><span class="line">    link/ether 72:ed:44:ff:22:a5 brd ff:ff:ff:ff:ff:ff</span><br><span class="line">    inet 192.168.100.1/24 scope global br0</span><br><span class="line">       valid_lft forever preferred_lft forever</span><br><span class="line">[root@centos7 ~]# vim /usr/lib/systemd/system/docker.service</span><br><span class="line">ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -b br0</span><br><span class="line">[root@centos7 ~]# systemctl daemon-reload</span><br><span class="line">[root@centos7 ~]# systemctl restart docker</span><br><span class="line">[root@centos7 ~]# ps -ef |grep dockerd</span><br><span class="line">root      6763     1  1 11:36 ?        00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -b br0</span><br><span class="line">root      6911  6651  0 11:36 pts/1    00:00:00 grep --color=auto dockerd</span><br><span class="line">[root@centos7 ~]# docker run --rm alpine hostname -i</span><br><span class="line">192.168.100.2</span><br></pre></td></tr></table></figure><h2 id="容器名称互联"><a href="#容器名称互联" class="headerlink" title="容器名称互联"></a>容器名称互联</h2><p>新建容器时，docker会自动分配容器名称，容器ID和IP地址，导致容器名称，容器ID和IP都不固定，那么如何区分不同的容器，实现和确定目标容器的通信呢？解决方案是给容器起个固定的名称，容器之间通过固定名称实现确定目标的通信</p><p>有两种固定名称</p><ul><li>容器名称</li><li>容器名称的别名</li></ul><h3 id="通过容器名称互联"><a href="#通过容器名称互联" class="headerlink" title="通过容器名称互联"></a>通过容器名称互联</h3><h4 id="容器名称介绍"><a href="#容器名称介绍" class="headerlink" title="容器名称介绍"></a>容器名称介绍</h4><p>即在同一个宿主机上的容器之间可以通过自定义的容器名称相互访问，比如：一个业务前端静态页面是使用nginx，动态页面使用的是Tomcat，另外还需要负载均衡调度器，如：haproxy对请求调度至nginx和Tomcat的容器，由于容器在启动的时候其内部IP地址是DHCP随机分配的，而给容器起个固定的名称，则是相对比较固定的，因此比较适用于此场景</p><p><strong>注意：如果被引用的容器地址变化，必须重启当前容器才能生效</strong></p><h4 id="容器名称实现"><a href="#容器名称实现" class="headerlink" title="容器名称实现"></a>容器名称实现</h4><p>docker run创建容器，可使用 <code>--link</code>选项实现容器名称的引用</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">--link list</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">格式：</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">先创建指定名称的容器</span></span><br><span class="line">docker run --name &lt;容器名称&gt;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">再创建容器时引用上面容器的名称</span></span><br><span class="line">docker run --link &lt;目标通信的容器ID或容器名称&gt;</span><br></pre></td></tr></table></figure><h3 id="通过自定义容器别名互联"><a href="#通过自定义容器别名互联" class="headerlink" title="通过自定义容器别名互联"></a>通过自定义容器别名互联</h3><h4 id="容器别名介绍"><a href="#容器别名介绍" class="headerlink" title="容器别名介绍"></a>容器别名介绍</h4><p>自定义的容器名称可能后期会发生变化，那么一旦名称发生变化，容器内程序之间也必须要随之发生变化，比如：程序通过固定的容器名称进行服务调用，但是容器名称发生变化之后再使用之前的名称肯定是无法成功调用，每次都进行更改的话又比较麻烦，因此可以使用自定义别名的方式解决，即容器名称可以随意更改，只要不更改别名即可</p><h4 id="容器别名实现"><a href="#容器别名实现" class="headerlink" title="容器别名实现"></a>容器别名实现</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker run --name &lt;容器名称&gt;</span><br><span class="line">docker run -d --name 容器名称 --link &lt;目标容器名称&gt;:&lt;容器别名&gt;</span><br><span class="line">docker run -d --name 容器名称 --link &lt;目标容器名称&gt;:&quot;&lt;容器别名&gt; &lt;容器别名&gt; &lt;容器别名&gt;&quot; # 可以是多个别名</span><br></pre></td></tr></table></figure><h2 id="Docker网络连接模式"><a href="#Docker网络连接模式" class="headerlink" title="Docker网络连接模式"></a>Docker网络连接模式</h2><p>Docker网络支持5种网络模式：</p><ul><li>none</li><li>bridge</li><li>host</li><li>container</li><li>network-name</li></ul><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看默认的网络模式</span></span><br><span class="line">[root@centos7 ~]# docker network ls</span><br><span class="line">NETWORK ID     NAME      DRIVER    SCOPE</span><br><span class="line">adaac389304f   bridge    bridge    local</span><br><span class="line">5feb362eb28e   host      host      local</span><br><span class="line">00f34cf82248   none      null      local</span><br></pre></td></tr></table></figure><h4 id="网络模式指定"><a href="#网络模式指定" class="headerlink" title="网络模式指定"></a>网络模式指定</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">默认新建的容器使用Bridge模式，创建容器时，docker run 命令使用以下指定网络模式</span></span><br><span class="line">docker run --network &lt;model&gt;</span><br><span class="line">docker run --net=&lt;mode&gt;</span><br><span class="line"></span><br><span class="line">&lt;model&gt;: # 可以是以下值</span><br><span class="line">none</span><br><span class="line">bridge</span><br><span class="line">host</span><br><span class="line">container:&lt;容器名或容器ID&gt;</span><br><span class="line">&lt;自定义网络名称&gt;</span><br></pre></td></tr></table></figure><h4 id="bridge网络模式"><a href="#bridge网络模式" class="headerlink" title="bridge网络模式"></a>bridge网络模式</h4><h5 id="bridge网络模式架构"><a href="#bridge网络模式架构" class="headerlink" title="bridge网络模式架构"></a>bridge网络模式架构</h5><img src="https://img.chensir.ink/chensir-pics/202208261610396.png" alt="image-20220826161053335" style="zoom:50%;" /><p>bridge模式是docker的默认模式，即不指定任何模式就是bridge模式，也是使用比较多的模式，此模式创建的容器会为每一个容器分配自己的网络IP等信息，并将容器连接到一个虚拟网桥与外界通信。可以和外部网络之间进行通信，通过SNAT访问网络，使用DNAT可以让容器被外部主机访问，所以此模式也称为NAT模式</p><p>此模式宿主机需要启动ip_forward功能</p><p>bridge网络模式特点：</p><ul><li>网络资源隔离：不同宿主机的容器无法直接通信，各自使用独立网络</li><li>无需手动配置：容器默认自动获取172.17.0.0&#x2F;16的IP地址，此地址可以修改</li><li>可访问外网：利用宿主机的物理网卡，SNAT连接外网</li><li>外部主机无法直接访问容器：可以通过配置DNAT接收外网的访问</li><li>性能较低：因为可通过NAT，望路转换带来更多的损耗</li><li>端口管理繁琐：每个容器必须手动指定唯一的端口，容器产生端口冲突</li></ul><h5 id="bridge模式的默认设置"><a href="#bridge模式的默认设置" class="headerlink" title="bridge模式的默认设置"></a>bridge模式的默认设置</h5><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看bridge模式信息</span></span><br><span class="line">[root@centos7 ~]# docker network inspect bridge</span><br><span class="line">[</span><br><span class="line">    &#123;</span><br><span class="line">        &quot;Name&quot;: &quot;bridge&quot;,</span><br><span class="line">        &quot;Id&quot;: &quot;adaac389304f7654edfab8612d6d82ec5b13b6e81331a296c98fa6c824eb79dd&quot;,</span><br><span class="line">        &quot;Created&quot;: &quot;2022-08-26T13:11:24.088093198+08:00&quot;,</span><br><span class="line">        &quot;Scope&quot;: &quot;local&quot;,</span><br><span class="line">        &quot;Driver&quot;: &quot;bridge&quot;,</span><br><span class="line">        &quot;EnableIPv6&quot;: false,</span><br><span class="line">        &quot;IPAM&quot;: &#123;</span><br><span class="line">            &quot;Driver&quot;: &quot;default&quot;,</span><br><span class="line">            &quot;Options&quot;: null,</span><br><span class="line">            &quot;Config&quot;: [</span><br><span class="line">                &#123;</span><br><span class="line">                    &quot;Subnet&quot;: &quot;192.168.100.0/24&quot;,</span><br><span class="line">                    &quot;Gateway&quot;: &quot;192.168.100.1&quot;</span><br><span class="line">                &#125;</span><br><span class="line">            ]</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;Internal&quot;: false,</span><br><span class="line">        &quot;Attachable&quot;: false,</span><br><span class="line">        &quot;Ingress&quot;: false,</span><br><span class="line">        &quot;ConfigFrom&quot;: &#123;</span><br><span class="line">            &quot;Network&quot;: &quot;&quot;</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;ConfigOnly&quot;: false,</span><br><span class="line">        &quot;Containers&quot;: &#123;&#125;,</span><br><span class="line">        &quot;Options&quot;: &#123;</span><br><span class="line">            &quot;com.docker.network.bridge.default_bridge&quot;: &quot;true&quot;,</span><br><span class="line">            &quot;com.docker.network.bridge.enable_icc&quot;: &quot;true&quot;,</span><br><span class="line">            &quot;com.docker.network.bridge.enable_ip_masquerade&quot;: &quot;true&quot;,</span><br><span class="line">            &quot;com.docker.network.bridge.host_binding_ipv4&quot;: &quot;0.0.0.0&quot;,</span><br><span class="line">            &quot;com.docker.network.bridge.name&quot;: &quot;br0&quot;,</span><br><span class="line">            &quot;com.docker.network.driver.mtu&quot;: &quot;1500&quot;</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;Labels&quot;: &#123;&#125;</span><br><span class="line">    &#125;</span><br><span class="line">]</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看宿主机的网络状态</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装docker后 默认启动ip_forward</span></span><br><span class="line">[root@centos7 ~]# cat /proc/sys/net/ipv4/ip_forward</span><br><span class="line">1</span><br><span class="line">[root@centos7 ~]# iptables -vnL -t nat</span><br><span class="line">Chain PREROUTING (policy ACCEPT 2 packets, 424 bytes)</span><br><span class="line"> pkts bytes target     prot opt in     out     source               destination</span><br><span class="line">    1    64 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL</span><br><span class="line"></span><br><span class="line">Chain INPUT (policy ACCEPT 1 packets, 64 bytes)</span><br><span class="line"> pkts bytes target     prot opt in     out     source               destination</span><br><span class="line"></span><br><span class="line">Chain OUTPUT (policy ACCEPT 3 packets, 984 bytes)</span><br><span class="line"> pkts bytes target     prot opt in     out     source               destination</span><br><span class="line">    0     0 DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL</span><br><span class="line"></span><br><span class="line">Chain POSTROUTING (policy ACCEPT 3 packets, 984 bytes)</span><br><span class="line"> pkts bytes target     prot opt in     out     source               destination</span><br><span class="line">    0     0 MASQUERADE  all  --  *      !br0    192.168.100.0/24     0.0.0.0/0</span><br><span class="line"></span><br><span class="line">Chain DOCKER (2 references)</span><br><span class="line"> pkts bytes target     prot opt in     out     source               destination</span><br><span class="line">    0     0 RETURN     all  --  br0    *       0.0.0.0/0            0.0.0.0/0</span><br></pre></td></tr></table></figure><h5 id="修改默认的bridge模式网络配置"><a href="#修改默认的bridge模式网络配置" class="headerlink" title="修改默认的bridge模式网络配置"></a>修改默认的bridge模式网络配置</h5><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# vim /lib/systemd/system/docker.service</span><br><span class="line">ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip=10.100.0.1/24</span><br><span class="line">[root@centos7 ~]# systemctl daemon-reload</span><br><span class="line">[root@centos7 ~]# systemctl restart docker</span><br><span class="line">[root@centos7 ~]# docker network inspect bridge</span><br><span class="line">[</span><br><span class="line">    &#123;</span><br><span class="line">        &quot;Name&quot;: &quot;bridge&quot;,</span><br><span class="line">        &quot;Id&quot;: &quot;d1f65af6a2d6d9f8e73cf830c47236f5df50c7d04690bde64f499a43c82328eb&quot;,</span><br><span class="line">        &quot;Created&quot;: &quot;2022-08-26T14:04:28.649359443+08:00&quot;,</span><br><span class="line">        &quot;Scope&quot;: &quot;local&quot;,</span><br><span class="line">        &quot;Driver&quot;: &quot;bridge&quot;,</span><br><span class="line">        &quot;EnableIPv6&quot;: false,</span><br><span class="line">        &quot;IPAM&quot;: &#123;</span><br><span class="line">            &quot;Driver&quot;: &quot;default&quot;,</span><br><span class="line">            &quot;Options&quot;: null,</span><br><span class="line">            &quot;Config&quot;: [</span><br><span class="line">                &#123;</span><br><span class="line">                    &quot;Subnet&quot;: &quot;10.100.0.0/24&quot;,</span><br><span class="line">                    &quot;Gateway&quot;: &quot;10.100.0.1&quot;</span><br><span class="line">                &#125;</span><br><span class="line">            ]</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;Internal&quot;: false,</span><br><span class="line">        &quot;Attachable&quot;: false,</span><br><span class="line">        &quot;Ingress&quot;: false,</span><br><span class="line">        &quot;ConfigFrom&quot;: &#123;</span><br><span class="line">            &quot;Network&quot;: &quot;&quot;</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;ConfigOnly&quot;: false,</span><br><span class="line">        &quot;Containers&quot;: &#123;&#125;,</span><br><span class="line">        &quot;Options&quot;: &#123;</span><br><span class="line">            &quot;com.docker.network.bridge.default_bridge&quot;: &quot;true&quot;,</span><br><span class="line">            &quot;com.docker.network.bridge.enable_icc&quot;: &quot;true&quot;,</span><br><span class="line">            &quot;com.docker.network.bridge.enable_ip_masquerade&quot;: &quot;true&quot;,</span><br><span class="line">            &quot;com.docker.network.bridge.host_binding_ipv4&quot;: &quot;0.0.0.0&quot;,</span><br><span class="line">            &quot;com.docker.network.bridge.name&quot;: &quot;docker0&quot;,</span><br><span class="line">            &quot;com.docker.network.driver.mtu&quot;: &quot;1500&quot;</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;Labels&quot;: &#123;&#125;</span><br><span class="line">    &#125;</span><br><span class="line">]</span><br></pre></td></tr></table></figure><h4 id="Host模式"><a href="#Host模式" class="headerlink" title="Host模式"></a>Host模式</h4><p>如果指定host模式启动的容器，那么新创建的容器不会创建自己的虚拟网卡，而是直接使用宿主的网卡和IP地址，因此在容器里面查看到的IP信息就是宿主机的信息，访问容器的时候直接使用宿主机IP+容器端口即可，不过容器内除网络以外的其他资源，如文件系统、系统进程等仍然和宿主机保持隔离</p><p>此模式由于直接使用宿主机的网络无需转换，网络性能最高，但是个容器使用的端口不能相同，适用于运行容器端口比较固定的业务</p><p>Host网络模式特点：</p><ul><li>使用参数  - -network host 指定</li><li>共享宿主机网络</li><li>网络性能无损耗</li><li>网络故障排除相对简单</li><li>各容器网络无隔离</li><li>网络资源无法分别统计</li><li>端口管理困难：容易产生端口冲突</li><li>不支持端口映射</li></ul><h4 id="none模式"><a href="#none模式" class="headerlink" title="none模式"></a>none模式</h4><p>在使用none模式后，Docker容器不会进行任何网洛洛配置，没有网卡，没有IP 也没有路由，因此默认无法与外界通信，需要手动添加网卡配置IP等，所以极少使用</p><p>none模式特点：</p><ul><li>使用参数 - -network none 指定</li><li>默认无网络功能，无法和外部通信</li></ul><h4 id="Container模式"><a href="#Container模式" class="headerlink" title="Container模式"></a>Container模式</h4><p>使用此模式创建的容器需指定和一个已经存在的容器共享一个网络，而不是和宿主机共享网络，新创建的容器不会创建自己的网卡也不会配置自己的IP，而是和一个被指定的已经存在的容器共享IP和端口范围，因此这个容器的端口不能被指定容器的端口冲突，除了网络之外的文件系统、进程信息等仍然保持相互隔离，两个容器的进程可以通过lo网卡进行通信</p><p>Container模式特点：</p><ul><li>使用参数 - -network container:名称或ID 指定</li><li>与宿主机网络隔离</li><li>容器间共享网络空间</li><li>适合频繁的容器间的网络通信</li><li>直接使用对方的网络，较少使用</li></ul><h4 id="自定义网络模式"><a href="#自定义网络模式" class="headerlink" title="自定义网络模式"></a>自定义网络模式</h4><p>除了以上的网络模式，也可以自定义网络，使用自定义的网段地址，网关等信息</p><p><strong>注意：自定义网络内的容器可以直接通过容器名进行相互的访问，而无需使用 - -link</strong></p><p>可以使用自定义网络模式，实现不同集群应用的独立网络管理，而互不影响，而且在一个网络内，可以直接利用容器名相互访问非常便利</p><h5 id="自定义网实现"><a href="#自定义网实现" class="headerlink" title="自定义网实现"></a>自定义网实现</h5><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker network --help</span><br><span class="line"></span><br><span class="line">Usage:  docker network COMMAND</span><br><span class="line"></span><br><span class="line">Manage networks</span><br><span class="line"></span><br><span class="line">Commands:</span><br><span class="line">  connect     Connect a container to a network</span><br><span class="line">  create      Create a network</span><br><span class="line">  disconnect  Disconnect a container from a network</span><br><span class="line">  inspect     Display detailed information on one or more networks</span><br><span class="line">  ls          List networks</span><br><span class="line">  prune       Remove all unused networks</span><br><span class="line">  rm          Remove one or more networks</span><br><span class="line"></span><br><span class="line">Run &#x27;docker network COMMAND --help&#x27; for more information on a command.</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建自定义网络  注意mode不支持host和none</span></span><br><span class="line">docker network create -d &lt;mode&gt; --subnet &lt;CIDR&gt; --gateway  &lt;网关&gt; &lt;自定义网络名称&gt;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看自定义网络</span></span><br><span class="line">docker network inspect &lt;自定义网络名称或网络ID&gt;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">引用自定义网络</span></span><br><span class="line">docker run --network &lt;自定义网络名称&gt; &lt;镜像名称&gt;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">删除自定义网络</span></span><br><span class="line">docker network rm &lt;自定义网络名称或网络ID&gt;</span><br></pre></td></tr></table></figure><h1 id="Docker仓库管理"><a href="#Docker仓库管理" class="headerlink" title="Docker仓库管理"></a>Docker仓库管理</h1><p>Docker仓库，类似于yum仓库，是用来保存镜像的仓库。为了方便的管理和使用docker镜像，可以将镜像集中保存至Docker仓库中，将制作好的镜像push到仓库集中保存，在需要镜像时，从仓库中pull镜像即可。</p><p>Docker仓库分为公有云仓库和私有云仓库</p><p>公有云仓库：由互联网公司对外公开的仓库</p><ul><li>官方</li><li>阿里云等第三方仓库</li></ul><p>私有云仓库：组织内部搭建的仓库，一般只为组织内部使用，常使用下面软件搭建仓库</p><ul><li>docekr registory</li><li>docker harbor</li></ul><h2 id="官方Docker仓库"><a href="#官方Docker仓库" class="headerlink" title="官方Docker仓库"></a>官方Docker仓库</h2><p><a href="https://hub.docker.com/">https://hub.docker.com</a></p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">用户登录 输入账号密码即可</span></span><br><span class="line">docker login</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">上传本地镜像前必须先给上传的镜像用docker tag命令打标签</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">标签格式 docker.io/用户账号/镜像名:TAG</span></span><br><span class="line">docker tag alpine:3.11 docker.io/xchensir/alpine:3.11-v1</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">上传本地镜像至官网</span></span><br><span class="line">docker push docker.io/xchensir/alpine:3.11-v1</span><br></pre></td></tr></table></figure><h2 id="私有云单机仓库Docker-Registry"><a href="#私有云单机仓库Docker-Registry" class="headerlink" title="私有云单机仓库Docker Registry"></a>私有云单机仓库Docker Registry</h2><p>Docker Registry作为Docker的核心组件之一负责单主机的镜像内容的存储与分发，客户端的docker pull以及push命令都将直接与registry进行交互，最初版本的registry由python实现，由于设计初期在安全性，性能以及API的设计上有着诸多缺陷，该版本在0.9之后停止开发，由新项目distribution（新的docker register被称为Distribution）来重新设计并开发下一代registry，新的项目由go语言开发，所有的API，底层存储方式，系统架构都进行了全面的重新设计，已解决上一代registry中存在的问题，2016年4月registry2.0正式发布，docker1.6版本开始支持registry2.0，而八月份随着docker1.8发布，docker hub正式启用2.1版本registry全面替代之前版本registry，新版registry对镜像存储格式进行了重新设计和旧版不兼容，docker1.5和之前的版本无法读取2.0的镜像，另外，Registry2.4版本之后支持了回收站机制，也就是可以删除镜像，在2.4版本之前是不支持删除镜像的，所以最好使用大于Registry2.4版本</p><p>官方文档地址 <a href="https://docs.docker.com/registry/">https://docs.docker.com/registry/</a></p><p>官方部署文档 <a href="https://github.com/docker/docker.github.io/blob/master/registry/deploying.md">https://github.com/docker/docker.github.io/blob/master/registry/deploying.md</a></p><h3 id="搭建单机仓库"><a href="#搭建单机仓库" class="headerlink" title="搭建单机仓库"></a>搭建单机仓库</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">下载 docker registry 镜像</span></span><br><span class="line">[root@centos7 ~]# docker pull registry:2.7.1</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建授权用户密码使用目录</span></span><br><span class="line">[root@centos7 ~]# mkdir -p /etc/docker/auth</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建授权的registry用户和密码</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建registry用户 用于上传和下载镜像</span></span><br><span class="line">[root@centos7 ~]# yum install -y httpd</span><br><span class="line">[root@centos7 ~]# htpasswd -Bbn chensir 123456 &gt; /etc/docker/auth/registry</span><br><span class="line">[root@centos7 ~]# cat /etc/docker/auth/registry</span><br><span class="line">chensir:$2y$05$KP9hiJW3W5ZvwfTeWUctEuak6vHxsHOdJpMRoHRfYQnIXfmEsceOS</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# docker run -d -p 5000:5000 --restart=always --name registry -v /etc/docker/auth/:/auth -e &quot;REGISTRY_AUTH=htpasswd&quot; -e &quot;REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm&quot; -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/registry registry:2.7.1</span><br><span class="line">f2373f9e7c67bf628feb6222ff716cab115d63ffce9791179ef4797a00338145</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# docker ps</span><br><span class="line">CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS          PORTS                                       NAMES</span><br><span class="line">f2373f9e7c67   registry:2.7.1   &quot;/entrypoint.sh /etc…&quot;   47 seconds ago   Up 46 seconds   0.0.0.0:5000-&gt;5000/tcp, :::5000-&gt;5000/tcp   registry</span><br><span class="line">[root@centos7 ~]# docker port f23</span><br><span class="line">5000/tcp -&gt; 0.0.0.0:5000</span><br><span class="line">5000/tcp -&gt; :::5000</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">登陆仓库</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker login 默认使用https登录，而docker registry为http，所以默认登录失败</span></span><br><span class="line">[root@centos7 ~]# docker login 10.0.0.14:5000</span><br><span class="line">Username: chensir</span><br><span class="line">Password:</span><br><span class="line">Error response from daemon: Get &quot;https://10.0.0.14:5000/v2/&quot;: http: server gave HTTP response to HTTPS client</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">修改配置使docker login支持HTTP协议</span></span><br><span class="line">[root@centos7 ~]# vim /lib/systemd/system/docker.service</span><br><span class="line">ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 10.0.0.14:5000</span><br><span class="line">[root@centos7 ~]# systemctl daemon-reload</span><br><span class="line">[root@centos7 ~]# systemctl restart docker</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">再次登录 验证成功</span></span><br><span class="line">[root@centos7 ~]# docker login 10.0.0.14:5000</span><br><span class="line">Authenticating with existing credentials...</span><br><span class="line">WARNING! Your password will be stored unencrypted in /root/.docker/config.json.</span><br><span class="line">Configure a credential helper to remove this warning. See</span><br><span class="line">https://docs.docker.com/engine/reference/commandline/login/#credentials-store</span><br><span class="line"></span><br><span class="line">Login Succeeded</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">打包并上传镜像</span></span><br><span class="line">[root@centos7 ~]# docker images</span><br><span class="line">REPOSITORY   TAG       IMAGE ID       CREATED         SIZE</span><br><span class="line">test         v1        401a15cbac90   8 days ago      1.24MB</span><br><span class="line">[root@centos7 ~]# docker tag test:v1 10.0.0.14:5000/test:v1</span><br><span class="line">[root@centos7 ~]# docker push 10.0.0.14:5000/test:v1</span><br><span class="line">The push refers to repository [10.0.0.14:5000/test]</span><br><span class="line">084326605ab6: Pushed</span><br><span class="line">v1: digest: sha256:c04ecf7d8a544273ae7b7d1cda2f6c123a9690fc56c705dd5e16a20c65bba555 size: 527</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">下载镜像</span></span><br><span class="line">[root@centos7 ~]# docker images</span><br><span class="line">REPOSITORY   TAG       IMAGE ID       CREATED        SIZE</span><br><span class="line">registry     2.7.1     b8604a3fe854   9 months ago   26.2MB</span><br><span class="line">[root@centos7 ~]# docker pull 10.0.0.14:5000/test:v1</span><br><span class="line">v1: Pulling from test</span><br><span class="line">50783e0dfb64: Pull complete</span><br><span class="line">Digest: sha256:c04ecf7d8a544273ae7b7d1cda2f6c123a9690fc56c705dd5e16a20c65bba555</span><br><span class="line">Status: Downloaded newer image for 10.0.0.14:5000/test:v1</span><br><span class="line">10.0.0.14:5000/test:v1</span><br><span class="line">[root@centos7 ~]# docker images</span><br><span class="line">REPOSITORY            TAG       IMAGE ID       CREATED        SIZE</span><br><span class="line">10.0.0.14:5000/test   v1        401a15cbac90   8 days ago     1.24MB</span><br><span class="line">registry              2.7.1     b8604a3fe854   9 months ago   26.2MB</span><br></pre></td></tr></table></figure><h2 id="Docker之分布式仓库Harbor"><a href="#Docker之分布式仓库Harbor" class="headerlink" title="Docker之分布式仓库Harbor"></a>Docker之分布式仓库Harbor</h2><p>Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器，由VMware开源，其通过添加一些企业必须的功能特性，例如安全、标识和管理等，扩展了开源Docker Distribution。作为一个企业级私有Registry服务器，Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制，镜像全部保存在私有Registry中，确保数据和知识产权在公司内部网络中管控，另外，Harbor也提供了高级的安全特性，诸如用户管理，访问控制和活动审计等</p><p>vmware官方开源服务 <a href="https://vmware.github.io/">https://vmware.github.io</a></p><p>harbor官方github地址 <a href="https://github.com/goharbor/harbor">https://github.com/goharbor/harbor</a></p><p>harbor官方网址 <a href="https://goharbor.io/">https://goharbor.io</a></p><p>harbor官方文档 <a href="https://goharbor.io/docs/">https://goharbor.io/docs/</a></p><h3 id="Harbor功能"><a href="#Harbor功能" class="headerlink" title="Harbor功能"></a>Harbor功能</h3><ul><li>基于角色的访问控制：用户与Docker镜像仓库通过“项目”进行组织管理，一个用户可以对多个镜像仓库在同一命名空间（project）里有不同的权限</li><li>镜像复制：镜像可在多个Registry实例中复制（同步）。尤其适合负载均衡，高可用，混合云和多云场景</li><li>图形化用户界面：用户可以通过浏览器来浏览，检索当前Docker镜像仓库，管理项目和命名空间</li><li>AD&#x2F;LDAP支：Harbor可以集成企业内部已有的AD&#x2F;LDAP，用于鉴权认证管理</li><li>国际化：已拥有英文、中文、德文、日文和俄文的本地化版本</li><li>RESTful API：提供给管理员对于Harbor更多的操控，使得其它管理软件集成变得更容易</li><li>部署简单：提供在线和离线两种安装工具，也可以安装到vSphere平台（OVA方式）虚拟设备</li></ul><h3 id="Harbor组成"><a href="#Harbor组成" class="headerlink" title="Harbor组成"></a>Harbor组成</h3><p><img src="https://img.chensir.ink/chensir-pics/202209061545812.png"></p><ul><li>proxy：对应启动组件Nginx。它是一个nginx反向代理，代理Notary client（镜像认证）、Docker client（镜像上传下载等）和浏览器的访问请求（Core Service）给后端的各服务</li><li>UI（Core Service）：对应启动组件harbor-ui。底层数据存储使用mysql数据库，主要提供了四个子功能：<ul><li>UI：一个Web管理页面</li><li>API：Harbor暴露的API服务</li><li>Auth：用户认证服务，decode后的token中的用户信息在这里进行认证；auth后端可以接db、ldap、uaa三种认证实现</li><li>Token服务：负责根据用户在每个project中的role来为每一个docker push&#x2F;pull命令发布一个token，如果从docker client发送给registry的请求没带token，registry会重定向请求到token服务创建token</li></ul></li><li>Registry：对应启动组件registry。负责存储镜像文件和处理镜像的pull&#x2F;push命令。Harbor对镜像进行强制的访问控制，Registry会将客户端的每个pull、push请求转发到token服务来获取有效的token</li><li>Admin Service：对应启动组件harbor-adminserver。是系统的配置管理中心附带检查存储用量，ui和job server启动时需要加载adminserver配置</li><li>Job Service：对应启动组件harbor-jobservice。负责镜像复制的工作，他和registry通信，从一个registry pull镜像然后push到另一个registry，并记录job_log</li><li>Log Collector：对应启动组件harbor-log。日志汇总组件，通过docker的log-drive把日志汇总到一起</li><li>DB：对应启动组件harbor-db，负责存储project、user、role、replication、image_scan、access等的metadata数据</li></ul><h3 id="安装Harbor"><a href="#安装Harbor" class="headerlink" title="安装Harbor"></a>安装Harbor</h3><p>下载地址：<a href="https://github.com/vmware/harbor/releases">https://github.com/vmware/harbor/releases</a></p><p>环境准备：四台机器 两台harbor服务器，两台harbor客户端上传和下载镜像</p><h4 id="安装docker"><a href="#安装docker" class="headerlink" title="安装docker"></a>安装docker</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">rm -rf /etc/yum.repos.d/*</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">centos 7 安装docker依赖三个yum源：Base，Extras，docker-ce</span></span><br><span class="line">wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo</span><br><span class="line">wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo</span><br><span class="line">wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</span><br><span class="line"></span><br><span class="line">yum clean all</span><br><span class="line">yum install docker-ce -y</span><br><span class="line">systemctl enable --now docker</span><br></pre></td></tr></table></figure><h4 id="安装docker-compose"><a href="#安装docker-compose" class="headerlink" title="安装docker-compose"></a>安装docker-compose</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# wget -O /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-linux-x86_64</span><br><span class="line">[root@centos7 ~]# chmod +x /usr/local/bin/docker-compose</span><br><span class="line">[root@centos7 ~]# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose</span><br><span class="line">[root@centos7 ~]# docker-compose --version</span><br></pre></td></tr></table></figure><h4 id="下载Harbor安装包并解压缩安装启动"><a href="#下载Harbor安装包并解压缩安装启动" class="headerlink" title="下载Harbor安装包并解压缩安装启动"></a>下载Harbor安装包并解压缩安装启动</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">推荐下载离线完整版安装包</span></span><br><span class="line">[root@centos7 ~]# wget https://github.com/goharbor/harbor/releases/download/v2.6.0/harbor-offline-installer-v2.6.0.tgz</span><br><span class="line">[root@centos7 ~]# mkdir /apps</span><br><span class="line">[root@centos7 ~]# tar xvf harbor-offline-installer-v2.6.0.tgz  -C /apps/</span><br><span class="line">[root@centos7 ~]# cp /apps/harbor/harbor.yml.tmpl /apps/harbor/harbor.yml</span><br><span class="line">[root@centos7 ~]# vim /apps/harbor/harbor.yml</span><br><span class="line">hostname: 10.0.0.16               # 修改此行，指向当前主机IP</span><br><span class="line">harbor_admin_password: 123456# 修改此行指定harbor登录用户admin的密码，默认用户/密码 admin/Harbor12345</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装docker 先安装python</span></span><br><span class="line">[root@centos7 ~]# /apps/harbor/install.sh</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装后会自动开启很多先关容器</span></span><br><span class="line">[root@centos7 ~]# docker ps</span><br><span class="line">CONTAINER ID   IMAGE                                COMMAND                  CREATED         STATUS                   PORTS                                   NAMES</span><br><span class="line">5a84db870a20   goharbor/nginx-photon:v2.6.0         &quot;nginx -g &#x27;daemon of…&quot;   4 minutes ago   Up 4 minutes (healthy)   0.0.0.0:80-&gt;8080/tcp, :::80-&gt;8080/tcp   nginx</span><br><span class="line">c8ab9fcba25b   goharbor/harbor-jobservice:v2.6.0    &quot;/harbor/entrypoint.…&quot;   4 minutes ago   Up 4 minutes (healthy)                                           harbor-jobservice</span><br><span class="line">7bb48de3447b   goharbor/harbor-core:v2.6.0          &quot;/harbor/entrypoint.…&quot;   4 minutes ago   Up 4 minutes (healthy)                                           harbor-core</span><br><span class="line">d680480c0ef3   goharbor/redis-photon:v2.6.0         &quot;redis-server /etc/r…&quot;   4 minutes ago   Up 4 minutes (healthy)                                           redis</span><br><span class="line">09bbe5448ad2   goharbor/harbor-registryctl:v2.6.0   &quot;/home/harbor/start.…&quot;   4 minutes ago   Up 4 minutes (healthy)                                           registryctl</span><br><span class="line">88f5bcdd4c4b   goharbor/harbor-portal:v2.6.0        &quot;nginx -g &#x27;daemon of…&quot;   4 minutes ago   Up 4 minutes (healthy)                                           harbor-portal</span><br><span class="line">4e8d142ecb96   goharbor/registry-photon:v2.6.0      &quot;/home/harbor/entryp…&quot;   4 minutes ago   Up 4 minutes (healthy)                                           registry</span><br><span class="line">645b169ac0cf   goharbor/harbor-db:v2.6.0            &quot;/docker-entrypoint.…&quot;   4 minutes ago   Up 4 minutes (healthy)                                           harbor-db</span><br><span class="line">7c9e23d67190   goharbor/harbor-log:v2.6.0           &quot;/bin/sh -c /usr/loc…&quot;   4 minutes ago   Up 4 minutes (healthy)   127.0.0.1:1514-&gt;10514/tcp               harbor-log</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">实现开机自动启动harbor</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">方式1：通过service文件实现</span></span><br><span class="line">[root@centos7 ~]# vim /lib/systemd/system/harbor.service</span><br><span class="line">[Unit]</span><br><span class="line">Description=Harbor</span><br><span class="line">After=docker.service systemd-networked.service systemd-resolved.service</span><br><span class="line">Requires=docker.service</span><br><span class="line">Documentation=http://github.com/vmware/harbor</span><br><span class="line"></span><br><span class="line">[Service]</span><br><span class="line">Type=simple</span><br><span class="line">Restart=on-failure</span><br><span class="line">RestartSec=5</span><br><span class="line">ExecStart=/usr/bin/docker-compose -f /apps/harbor/docker-compose.yml up</span><br><span class="line">ExecStop=/usr/bin/docker-compose -f /apps/harbor/docker-compose.yml down</span><br><span class="line"></span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">方式2：通过rc.local实现</span></span><br><span class="line">[root@centos7 harbor]# cat /etc/rc.local</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line">cd /apps/harbor</span><br><span class="line">/usr/bin/docker-compose up</span><br><span class="line">[root@centos7 harbor]# chmod +x /etc/rc.local</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">至此安装完毕 用浏览器访问 http://10.0.0.16</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">用户名：admin 密码：前面harbor.yml指定的密码</span></span><br></pre></td></tr></table></figure><h4 id="命令行登录harbor"><a href="#命令行登录harbor" class="headerlink" title="命令行登录harbor"></a>命令行登录harbor</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# vim /lib/systemd/system/docker.service</span><br><span class="line">ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 10.0.0.16 --insecure-registry 10.0.0.17</span><br><span class="line">[root@centos7 ~]# systemctl daemon-reload</span><br><span class="line">[root@centos7 ~]# systemctl restart docker</span><br><span class="line">[root@centos7 harbor]# docker login 10.0.0.16</span><br><span class="line">Username: admin</span><br><span class="line">Password:</span><br><span class="line">WARNING! Your password will be stored unencrypted in /root/.docker/config.json.</span><br><span class="line">Configure a credential helper to remove this warning. See</span><br><span class="line">https://docs.docker.com/engine/reference/commandline/login/#credentials-store</span><br><span class="line"></span><br><span class="line">Login Succeeded</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看进程是否添加上面的设置</span></span><br><span class="line">[root@centos7 ~]# ps aux |grep dockerd</span><br><span class="line">root      7875  0.5  4.1 1777524 78544 ?       Ssl  10:07   0:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 10.0.0.16 --insecure-registry 10.0.0.17</span><br><span class="line">root      9420  0.0  0.0 112680   984 pts/1    S+   10:09   0:00 grep --color=auto dockerd</span><br></pre></td></tr></table></figure><h4 id="本地镜像打标签上传至harbor"><a href="#本地镜像打标签上传至harbor" class="headerlink" title="本地镜像打标签上传至harbor"></a>本地镜像打标签上传至harbor</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">修改images的名称，不修改成指定格式无法将镜像上传到harbor仓库</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">格式为 （项目名需要登录Harbor管理页面去新建 如果不事先建立项目，上传镜像失败）</span></span><br><span class="line">Harbor主机IP/项目名/image名字:版本</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">例如</span></span><br><span class="line">[root@centos7 ~]# docker images</span><br><span class="line">REPOSITORY                      TAG       IMAGE ID       CREATED         SIZE</span><br><span class="line">busybox-chensir                 v1.0      71a52e0618a5   3 seconds ago   1.24MB</span><br><span class="line">[root@centos7 ~]# docker login 10.0.0.16</span><br><span class="line">Authenticating with existing credentials...</span><br><span class="line">WARNING! Your password will be stored unencrypted in /root/.docker/config.json.</span><br><span class="line">Configure a credential helper to remove this warning. See</span><br><span class="line">https://docs.docker.com/engine/reference/commandline/login/#credentials-store</span><br><span class="line"></span><br><span class="line">Login Succeeded</span><br><span class="line">[root@centos7 ~]# docker tag busybox-chensir:v1.0 10.0.0.16/chensir/busybox-chensir:v1.0</span><br><span class="line">[root@centos7 ~]# docker push 10.0.0.16/chensir/busybox-chensir:v1.0</span><br><span class="line">The push refers to repository [10.0.0.16/chensir/busybox-chensir]</span><br><span class="line">c1cf1676e7d0: Pushed</span><br><span class="line">v1.0: digest: sha256:c501ccda169599fb77102ad0c2e2568336eaccf9ad83c94aec0d6f28fb55c0a0 size: 527</span><br></pre></td></tr></table></figure><h4 id="下载harbor镜像"><a href="#下载harbor镜像" class="headerlink" title="下载harbor镜像"></a>下载harbor镜像</h4><p>在10.0.0.15的centos7主机上无需登录，即可下载镜像</p><p>注：下载前需修改docker的service文件，加入harbor服务器的地址才可以下载</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker pull 10.0.0.16/chensir/busybox-chensir:v1.0</span><br><span class="line">Error response from daemon: Get &quot;https://10.0.0.16/v2/&quot;: dial tcp 10.0.0.16:443: connect: connection refused</span><br><span class="line">[root@centos7 ~]# vim /lib/systemd/system/docker.service</span><br><span class="line">[root@centos7 ~]# systemctl daemon-reload</span><br><span class="line">[root@centos7 ~]# systemctl restart docker</span><br><span class="line">[root@centos7 ~]# docker pull 10.0.0.16/chensir/busybox-chensir:v1.0</span><br><span class="line">v1.0: Pulling from chensir/busybox-chensir</span><br><span class="line">2c39bef88607: Pull complete</span><br><span class="line">Digest: sha256:c501ccda169599fb77102ad0c2e2568336eaccf9ad83c94aec0d6f28fb55c0a0</span><br><span class="line">Status: Downloaded newer image for 10.0.0.16/chensir/busybox-chensir:v1.0</span><br><span class="line">10.0.0.16/chensir/busybox-chensir:v1.0</span><br><span class="line">[root@centos7 ~]# vim /lib/systemd/system/docker.service</span><br><span class="line">[root@centos7 ~]# docker images</span><br><span class="line">REPOSITORY                          TAG       IMAGE ID       CREATED       SIZE</span><br><span class="line">10.0.0.16/chensir/busybox-chensir   v1.0      71a52e0618a5   2 hours ago   1.24MB</span><br></pre></td></tr></table></figure><h4 id="修改harbor配置"><a href="#修改harbor配置" class="headerlink" title="修改harbor配置"></a>修改harbor配置</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">后期修改harbor配置，比如：修改IP地址等，可执行以下步骤生效</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">方法1：</span></span><br><span class="line">[root@centos7 ~]# cd /apps/harbor/</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">停止harbor相关容器</span></span><br><span class="line">[root@centos7 harbor]# docker-compose stop</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">修改配置</span></span><br><span class="line">[root@centos7 harbor]# vim harbor.yml</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">更新配置</span></span><br><span class="line">[root@centos7 harbor]# /apps/harbor/prepare</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">启动harbor</span></span><br><span class="line">[root@centos7 harbor]# docker-compose start</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">方法2：</span></span><br><span class="line">[root@centos7 harbor]# /apps/harbor/install.sh</span><br></pre></td></tr></table></figure><h4 id="实现harbor高可用"><a href="#实现harbor高可用" class="headerlink" title="实现harbor高可用"></a>实现harbor高可用</h4><p>Harbor支持基于策略的Docker镜像复制功能，这类似于MySQL的主从同步，其可以实现不同的数据中心，不同的运行环境之间同步镜像，并提供友好的管理界面，大大简化了实际运维中的镜像管理工作，已经有很多互联网公司使用harbor搭建内网docker仓库的案例，并且还有实现了双向复制功能</p><p>多个harbor需要登录管理页面新建相同的项目，然后在系统管理&#x3D;&#x3D;&gt;仓库管理&#x3D;&#x3D;&gt;新建目标，系统管理&#x3D;&#x3D;&gt;复制管理&#x3D;&#x3D;&gt;新建规则 互相之前配置</p><h4 id="Harbor安全配置https"><a href="#Harbor安全配置https" class="headerlink" title="Harbor安全配置https"></a>Harbor安全配置https</h4><p>harbor默认使用http，为了安全可以使用https</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成私钥和证书</span></span><br><span class="line">[root@centos7 ~]#</span><br><span class="line">[root@centos7 ~]# touch /root/.rnd</span><br><span class="line">[root@centos7 ~]# mkdir /apps/harbor/certs</span><br><span class="line">[root@centos7 ~]# cd /apps/harbor/certs/</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成CA证书</span></span><br><span class="line">[root@centos7 certs]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -subj &quot;/CN=ca.chensir.ink&quot; -days 365 -out ca.crt</span><br><span class="line">Generating a 4096 bit RSA private key</span><br><span class="line">................................................................................++</span><br><span class="line">..++</span><br><span class="line">writing new private key to &#x27;ca.key&#x27;</span><br><span class="line">-----</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成harbor主机的证书申请</span></span><br><span class="line">[root@centos7 certs]# openssl req -newkey rsa:4096 -nodes -sha256 -subj &quot;/CN=ca.chensir.ink&quot; -keyout harbor.chensir.ink.key -out harbor.chensir.ink.csr</span><br><span class="line">Generating a 4096 bit RSA private key</span><br><span class="line">..................................................................................................................................................................................................................................................++</span><br><span class="line">...........................................................................................++</span><br><span class="line">writing new private key to &#x27;harbor.chensir.ink.key&#x27;</span><br><span class="line">-----</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">给harbor主机颁发证书</span></span><br><span class="line">[root@centos7 certs]# openssl x509 -req -in harbor.chensir.ink.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out harbor.chensir.ink.crt</span><br><span class="line">Signature ok</span><br><span class="line">subject=/CN=ca.chensir.ink</span><br><span class="line">Getting CA Private Key</span><br><span class="line"></span><br><span class="line">[root@centos7 certs]# tree /apps/harbor/certs/</span><br><span class="line">/apps/harbor/certs/</span><br><span class="line">├── ca.crt</span><br><span class="line">├── ca.key</span><br><span class="line">├── ca.srl</span><br><span class="line">├── harbor.chensir.ink.crt</span><br><span class="line">├── harbor.chensir.ink.csr</span><br><span class="line">└── harbor.chensir.ink.key</span><br><span class="line"></span><br><span class="line">0 directories, 6 files</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">修改配置文件</span></span><br><span class="line">[root@centos7 certs]# vim /apps/harbor/harbor.yml</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">https related config</span></span><br><span class="line">https:</span><br><span class="line"><span class="meta prompt_">  # </span><span class="language-bash">https port <span class="keyword">for</span> harbor, default is 443</span></span><br><span class="line">  port: 443</span><br><span class="line"><span class="meta prompt_">  # </span><span class="language-bash">The path of cert and key files <span class="keyword">for</span> nginx</span></span><br><span class="line">  certificate: /apps/harbor/certs/harbor.chensir.ink.crt</span><br><span class="line">  private_key: /apps/harbor/certs/harbor.chensir.ink.key</span><br><span class="line"><span class="meta prompt_">  </span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">更新配置</span></span><br><span class="line">[root@centos7 harbor]# /apps/harbor/prepare</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">启动harbor</span></span><br><span class="line">[root@centos7 harbor]# docker-compose start</span><br></pre></td></tr></table></figure><h4 id="在客户端下载CA的证书"><a href="#在客户端下载CA的证书" class="headerlink" title="在客户端下载CA的证书"></a>在客户端下载CA的证书</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">直接登录和上传下载镜像会报错</span></span><br><span class="line">[root@centos7 ~]# vim /etc/hosts</span><br><span class="line">10.0.0.16 harbor.chensir.ink</span><br><span class="line">[root@centos7 ~]# docker login harbor.chensir.ink</span><br><span class="line">Username: admin</span><br><span class="line">Password:</span><br><span class="line">Error response from daemon: Get &quot;https://harbor.chensir.ink/v2/&quot;: x509: certificate has expired or is not yet valid: current time 2022-09-08T13:41:28+08:00 is before 2022-09-08T06:20:55Z</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在客户端下载CA证书</span></span><br><span class="line">[root@centos7 ~]# mkdir -pv /etc/docker/certs.d/harbor.chensir.org/</span><br><span class="line">[root@centos7 ~]# scp -r harbor.chensir.ink:/apps/harbor/certs/ca.crt /etc/docker/certs.d/harbor.chensir.org/</span><br><span class="line">[root@centos7 ~]# tree /etc/docker/certs.d/</span><br><span class="line">/etc/docker/certs.d/</span><br><span class="line">└── harbor.chensir.org</span><br><span class="line">    └── ca.crt</span><br><span class="line"></span><br><span class="line">1 directory, 1 file</span><br></pre></td></tr></table></figure><h1 id="单机编排-Docker-Compose"><a href="#单机编排-Docker-Compose" class="headerlink" title="单机编排 Docker Compose"></a>单机编排 Docker Compose</h1><p>当在宿主机启动较多容器的时候，如果都是手动操作会觉得比较麻烦而且容易出错，此时推荐使用docker单机编排工具docker-compose</p><p>docker-compose是docker容器的一种单机编排服务，docker-compose是一个管理多个容器的工具，比如：可以解决容器之间的依赖关系，就像启动一个nginx前端的时候会调用后端额Tomcat，那就得先启动Tomcat，但是启动Tomcat容器还需要依赖数据库，那就还得启动数据库，docker-compose可以用来解决这样的嵌套依赖关系，并且可以替代docker命令对容器进行创建、启动和停止等手工的操作</p><p>因此，如果说docker命令就像linux的命令，docker-compose就像shell脚本，可以自动的执行容器批量操作，从而实现自动化的容器管理，或者说docker命令相当于Ansible命令，那么docker compose文件，就相当于ansible-playbook的yaml文件</p><p>docker-compose 项目是Docker官方开源项目，负责实现对Docker容器集群的快速编排，docker-compose将所管理的容器分为三层，分别是工程（project），服务（service）以及容器（Container）</p><h2 id="命令格式"><a href="#命令格式" class="headerlink" title="命令格式"></a>命令格式</h2><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 certs]# docker-compose --help</span><br><span class="line">Usage:  docker compose [OPTIONS] COMMAND</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">选项说明</span></span><br><span class="line">-f  # 指定compose模板文件，默认为docker-compose.yml</span><br><span class="line">-p   # 指定项目名称，默认将使用当前所在目录名称作为项目名</span><br><span class="line">--verbose# 显示更多输出信息</span><br><span class="line">--log-level LEVEL # 定义日志级别 （DEBUG，INFO，WARNING，ERROR，CRITICAL）</span><br><span class="line">--no-ansi # 不显示ANSI 控制字符</span><br><span class="line">-v # 显示版本</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">以下命令选项，需要造docker-compose.yml 文件所在目录里执行</span></span><br><span class="line">build# 构建镜像</span><br><span class="line">bundle# 从当前docker compose 文件生成一个以&lt;当前目录&gt;为名称的json格式的Docker Bundle备份文件</span><br><span class="line">config -q # 查看当前配置，没有错误不输出任何信息</span><br><span class="line">create# 创建服务，较少使用</span><br><span class="line">down# 停止和删除所有容器、网络、镜像和卷</span><br><span class="line">events# 从容器接收实时事件，可以指定json日志格式，较少使用</span><br><span class="line">exec# 进入指定容器进行操作</span><br><span class="line">help# 显示帮助信息</span><br><span class="line">images    # 显示镜像信息，较少使用</span><br><span class="line">kill# 强制终止运行中的容器</span><br><span class="line">logs# 查看容器的日志</span><br><span class="line">pause# 暂停服务</span><br><span class="line">port# 查看端口</span><br><span class="line">ps# 列出容器，较少使用</span><br><span class="line">pull# 重新拉去镜像，镜像发生变化后，需要重新拉去镜像，较少使用</span><br><span class="line">push# 上传镜像</span><br><span class="line">restart# 重启服务，较少使用</span><br><span class="line">rm# 删除已经停止的服务</span><br><span class="line">run# 一次性运行容器</span><br><span class="line">scale# 设置指定服务运行的容器个数</span><br><span class="line">start# 启动服务，较少使用</span><br><span class="line">stop# 停止服务，较少使用</span><br><span class="line">top# 显示容器运行状态</span><br><span class="line">unpause# 取消暂定</span><br><span class="line">up# 床架并启动容器，较少使用</span><br></pre></td></tr></table></figure><h2 id="docker-compose文件格式"><a href="#docker-compose文件格式" class="headerlink" title="docker-compose文件格式"></a>docker-compose文件格式</h2><p><a href="https://docs.docker.com/compose/compose-file/">https://docs.docker.com/compose/compose-file/</a></p><p>docker-compose文件是一个yaml格式的文件，所以注意行首的缩进很严格</p><p>默认docker-compose命令会调用当前目录下的docker-compose.yml文件，因此一般执行docker-compose命令先进入docker-compose.yml文件所在目录</p><h2 id="docker-compose启动单各容器"><a href="#docker-compose启动单各容器" class="headerlink" title="docker-compose启动单各容器"></a>docker-compose启动单各容器</h2><p>注意：使用docker-compose之前，先安装docker</p><h3 id="创建docker-compose文件"><a href="#创建docker-compose文件" class="headerlink" title="创建docker-compose文件"></a>创建docker-compose文件</h3><p>docker-compose文件可以在任意目录没创建文件名为docker-compose.yml配置文件，要注意前后的缩进</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker-compose --version</span><br><span class="line">Docker Compose version v2.10.2</span><br><span class="line">[root@centos7 ~]# mkdir /data/docker-compose</span><br><span class="line">[root@centos7 ~]# cd /data/docker-compose/</span><br><span class="line">[root@centos7 docker-compose]# vim docker-compose.yml</span><br><span class="line">services:</span><br><span class="line"> service-nginx-web:</span><br><span class="line">  image: nginx</span><br><span class="line">  container_name: nginx-web</span><br><span class="line">  expose:</span><br><span class="line">   - 80</span><br><span class="line">   - 443</span><br><span class="line">  ports:</span><br><span class="line">   - &quot;80:80&quot;</span><br><span class="line">   - &quot;443:443&quot;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看配置和检查格式</span></span><br><span class="line">[root@centos7 docker-compose]# docker-compose config</span><br><span class="line">[root@centos7 docker-compose]# docker-compose config -q</span><br></pre></td></tr></table></figure><h3 id="启动-停止-删除-容器"><a href="#启动-停止-删除-容器" class="headerlink" title="启动&#x2F;停止&#x2F;删除&#x2F;容器"></a>启动&#x2F;停止&#x2F;删除&#x2F;容器</h3><p>注意：必须要在docker-compose文件所在的目录执行</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">前台启动</span></span><br><span class="line">[root@centos7 docker-compose]# docker-compose up</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">后台启动</span></span><br><span class="line">[root@centos7 docker-compose]# docker-compose up -d</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">停止容器</span></span><br><span class="line">[root@centos7 docker-compose]# docker-compose stop</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">启动容器</span></span><br><span class="line">[root@centos7 docker-compose]# docker-compose start</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">重新启动</span></span><br><span class="line">[root@centos7 docker-compose]# docker-compose restart</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">只删除停止的容器</span></span><br><span class="line">[root@centos7 docker-compose]# docker-compose rm</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">停止并删除容器及镜像</span></span><br><span class="line">[root@centos7 docker-compose]# docker-compose down</span><br></pre></td></tr></table></figure><h3 id="指定同时启动容器的数量"><a href="#指定同时启动容器的数量" class="headerlink" title="指定同时启动容器的数量"></a>指定同时启动容器的数量</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 docker-compose]# vim docker-compose.yml</span><br><span class="line">services:</span><br><span class="line"> service-nginx-web:</span><br><span class="line">  image: nginx</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> container_name: nginx-web  同时启动多个同一镜像的容器，不要指定容器名称，否则会冲突</span></span><br><span class="line">  expose:</span><br><span class="line">   - 80</span><br><span class="line">   - 443</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> ports:   同时启动多个同一镜像，不要指定端口号，否则会冲突</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">  - <span class="string">&quot;80:80&quot;</span></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">  - <span class="string">&quot;443:443&quot;</span></span></span><br><span class="line">[root@centos7 docker-compose]# docker-compose up -d --scale service-nginx-web=5</span><br></pre></td></tr></table></figure><h2 id="docker-compose启动多个容器"><a href="#docker-compose启动多个容器" class="headerlink" title="docker-compose启动多个容器"></a>docker-compose启动多个容器</h2><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">编辑docker-compose文件并使用数据卷</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">注意：同一个文件，数据卷的优先级比镜像内的文件优先级高</span></span><br><span class="line">[root@centos7 docker-compose]# vim docker-compose.yml</span><br><span class="line">services:</span><br><span class="line"> service-nginx-web:</span><br><span class="line">  image: nginx</span><br><span class="line">  container_name: nginx-web</span><br><span class="line">  volumes:</span><br><span class="line">   - /data/nginx:/apps/nginx/html # 指定数据卷，将宿主机/data/nginx挂载到容器/apps/nginx/html</span><br><span class="line">  expose:</span><br><span class="line">   - 80</span><br><span class="line">   - 443</span><br><span class="line">  ports:</span><br><span class="line">   - &quot;80:80&quot;</span><br><span class="line">   - &quot;443:443&quot;</span><br><span class="line"> service-tomcat-app1:</span><br><span class="line">  image: tomcat</span><br><span class="line">  expose:</span><br><span class="line">   - 8080</span><br><span class="line">  ports:</span><br><span class="line">   - &quot;8081:8080&quot;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在宿主机准备nginx测试页面文件</span></span><br><span class="line">[root@centos7 docker-compose]# mkdir /data/nginx</span><br><span class="line">[root@centos7 docker-compose]# echo Docker compose test page &gt; /data/nginx/index.html</span><br><span class="line">[root@centos7 docker-compose]# docker-compose up -d</span><br></pre></td></tr></table></figure><h1 id="Docker的资源限制"><a href="#Docker的资源限制" class="headerlink" title="Docker的资源限制"></a>Docker的资源限制</h1><p><a href="https://docs.docker.com/config/containers/resource_constraints/">https://docs.docker.com/config/containers/resource_constraints/</a></p><p>默认情况下，容器没有资源的使用限制，可以使用主机内核调度程序允许的尽可能多的资源</p><p>Docker提供了控制容器使用资源的方法，可以限制容器使用多少内存或CPU等，在docker run命令的运行时配置标志实现资源限制功能。</p><p>其中许多功能都要求宿主机的内核支持，要检查是否支持这些功能，可以使用docker info命令，如果内核中的某项特性可能会在输出结尾处看到警告，可参考 <a href="https://docs.docker.com/engine/install/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities">https://docs.docker.com/engine/install/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities</a> 消除警告</p><h2 id="OOM（Out-of-Memory-Exception）"><a href="#OOM（Out-of-Memory-Exception）" class="headerlink" title="OOM（Out of Memory Exception）"></a>OOM（Out of Memory Exception）</h2><p>对于Linux主机，如果没有足够的内存来执行其他重要的系统任务，将会抛出OOM，随后系统会开始杀死进程已释放内存，凡是运行在宿主机的进程都有可能被kill，包括Dockerd和其他的应用程序，如果重要的系统进程被kill，会导致和该进程相关的服务全部宕机。通常越消耗内存比较大的应用越容易被kill，比如：MySQL数据库，java程序等</p><p>产生OOM异常时，Dockerd尝试通过调整Docker守护程序上的OOM优先级来减轻这些风险，以便它系统上的其他进程更不可能被杀死但是容器的OOM优先级未调整，这使得单个容器被杀死的可能性比Docker守护程序或其他系统进程被杀死的可能性更大，不推荐通过守护程序或容器上手动设置 oom-score-adj为极端负数，或通过在容器上设置 oom-kill-disable来绕过这些安全措施</p><p><strong>oom优先级机制</strong></p><p>linux会为每个进程算一个分数，最终将分数最高的kill</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">/proc/PID/oom_score_adj</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">范围为 -1000 到 1000，值越高越容易被宿主机<span class="built_in">kill</span>掉，如果将该值设置为-1000，则进程永远不会被宿主机 kernel <span class="built_in">kill</span></span></span><br><span class="line"></span><br><span class="line">/proc/PID/oom_adj</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">范围为 -17 到 +15 取值越高越容易被干掉，如果是 -17 则表示不能被 <span class="built_in">kill</span> 该设置的存在是为了和旧版的linux内核兼容</span></span><br><span class="line"></span><br><span class="line">/proc/PID/oom_score</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">这个值是系统综合进程的内存消耗量、CPU、时间（utime +、存活时间（<span class="built_in">uptime</span> - start <span class="keyword">time</span>））和oom_adj计算出的进程得分，消耗内存越多得分越高，容易被宿主机 kernel强制杀死</span></span><br></pre></td></tr></table></figure><h3 id="查看oom相关值"><a href="#查看oom相关值" class="headerlink" title="查看oom相关值"></a>查看oom相关值</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker服务进程的oom默认值</span></span><br><span class="line">[root@centos7 docker-compose]# cat /proc/`pidof dockerd`/oom_adj</span><br><span class="line">-8</span><br><span class="line">[root@centos7 docker-compose]# cat /proc/`pidof dockerd`/oom_score</span><br><span class="line">0</span><br><span class="line">[root@centos7 docker-compose]# cat /proc/`pidof dockerd`/oom_score_adj</span><br><span class="line">-500</span><br></pre></td></tr></table></figure><h2 id="容器的内存限制"><a href="#容器的内存限制" class="headerlink" title="容器的内存限制"></a>容器的内存限制</h2><p>Docker可以强制执行硬性内存限制，即只允许容器使用给定的内存大小</p><p>Docker也可以执行非硬性内存限制，即容器可以使用尽可能多的内存，除非内核检测到主机上的内存不够用了</p><h3 id="内存相关选项"><a href="#内存相关选项" class="headerlink" title="内存相关选项"></a>内存相关选项</h3><p><a href="https://docs.docker.com/config/containers/resource_constraints/">https://docs.docker.com/config/containers/resource_constraints/</a></p><p>以下设置大部分的选取正整数，跟着一个后缀 b,k,m,g 表示字节，千字节，兆字节或千兆字节</p><table><thead><tr><th>选项</th><th>描述</th></tr></thead><tbody><tr><td><code>-m</code></td><td>容器可以使用的最大物理内存，硬限制，此选项最小允许值为 4m（4MB），常用</td></tr><tr><td><code>--memory-swap</code></td><td>允许此容器交换到磁盘的内存量，必须先用  <code> -m</code>  对内存限制才可以使用，详细说明如下</td></tr><tr><td><code>–memory-swappiness</code></td><td>设置容器使用交换分区的倾向性，值越高表示越倾向于使用swap分区，范围0-100，0为能不用就不用，100为能用就用</td></tr><tr><td><code>--memory-reservation</code></td><td>允许指定小于  –memory 的软限制，当docker检测到主机上的争用或内存不足时会激活该限制，如果使 <code>–memory-reservation</code>，则必须将其设置为低于 –memory才能使其优先生效。因为它是软限制，所以不能保证容器不超过限制</td></tr><tr><td><code>--kernel-memory</code></td><td>容器可以使用的最大内核内存量，最小为4m，由于内核内存与用户空间内存隔离，因此无法与用户空间内存直接交换，因此内核内存不足的容器可能会阻塞宿主机资源，这会对主机和其他容器或者其他服务进程产生影响，因此不建议设置内核内存大小</td></tr><tr><td><code>–oom-kill-disable</code></td><td>默认情况下，如果发生内存不足（OOM）错误，则内核将终止容器中的进程。要更改此行为，请使用该 –oom-kill-disable选项。仅在设置了 -m选项的容器上禁用OOM。如果-m未设置该标志，则主机可能会用完内存，内核可能需要终止系统的进程以释放内存</td></tr></tbody></table><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例</span></span><br><span class="line">[root@centos7 ~]# docker run -e MYSQL_ROOT_PASSWORD=123456 -it --rm -m 1g --oom-kill-disable mysql:5.7.29</span><br><span class="line">[root@centos7 docker-compose]# sysctl -a |grep swappiness</span><br><span class="line">sysctl: reading key &quot;net.ipv6.conf.all.stable_secret&quot;</span><br><span class="line">sysctl: reading key &quot;net.ipv6.conf.default.stable_secret&quot;</span><br><span class="line">sysctl: reading key &quot;net.ipv6.conf.docker0.stable_secret&quot;</span><br><span class="line">sysctl: reading key &quot;net.ipv6.conf.eth0.stable_secret&quot;</span><br><span class="line">sysctl: reading key &quot;net.ipv6.conf.lo.stable_secret&quot;</span><br><span class="line">vm.swappiness = 30</span><br></pre></td></tr></table></figure><h2 id="swap限制"><a href="#swap限制" class="headerlink" title="swap限制"></a>swap限制</h2><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">--memory-swap # 只有设置 --memory 后才会有意义。使用swap，可以让容器将超出限制部分的内存置换到磁盘上，WARNING：经常将内存交换到磁盘的应用程序会降低性能</span><br></pre></td></tr></table></figure><p>不同的 <code>--memory-swap</code> 设置会产生不同的效果</p><table><thead><tr><th>–memory-swap</th><th>–memory</th><th>功能</th></tr></thead><tbody><tr><td>正数S</td><td>正数M</td><td>容器可用内存总空间为S，其中ram为M，swap为S-M，若S&#x3D;M，则无可用swap资源</td></tr><tr><td>0</td><td>正数M</td><td>相当于未设置swap（unset）</td></tr><tr><td>unset</td><td>正数M</td><td>若主机（Docker Host）启用于swap，则容器的可用swap为 2*M</td></tr><tr><td>-1</td><td>正数M</td><td>若主机（Docker Host）启用了swap，则容器可使用最大至主机上所有swap空间</td></tr></tbody></table><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">--memory-swap # 值为正数，那么--memory 和 --memory-swap都必须要设置，--memory-swap表示你能使用的内存和swap分区大小的总和，例如：--memory=300m，--memory-swap=1g，那么该容器能够使用300m物理内存和700m swap，即--memory是实际物理内存大小值不变，而swap的实际计算方式为（--memory-swap）-（--memory）= 容器可用swap</span><br><span class="line">--memory-swap # 如果设置为0，则忽略该配置，并将该值视为未设置，即未设置交换分区</span><br><span class="line">--memory-swap # 如果等于--memory的值，并且--memory设置为正整数，容器无权访问swap</span><br><span class="line">--memory-swap # 如果未设置，如果宿主机开启了swap，则容器的swap值最大为2*（--memory），即两倍物理内存大小，例如，如果--memory=&quot;300m&quot;与--memory-swap没有设置，改哦让其可以使用300m总的内存和600m交换空间，但是并不准确（在容器使用free命令所看到的的swap空间并不精确，毕竟每个容器都可以看到具体大小，宿主机的swap是有上限的，而且不是所有容器看到的累计大小）</span><br><span class="line">--memory-swap # 如果设置为-1，如果宿主机开启了swap，则容器可以使用主机上swap的最大空间</span><br></pre></td></tr></table></figure><p>注意：在容器中执行free命令看到的是宿主机的内存和swap使用，而非容器自身的swap使用情况</p><h3 id="stress-ng压力测试工具"><a href="#stress-ng压力测试工具" class="headerlink" title="stress-ng压力测试工具"></a>stress-ng压力测试工具</h3><p>stress-ng是一个压力测试工具，可以通过软件仓库进行安装，也提供了docker版本容器</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">centos</span></span><br><span class="line">yum install -y stress-ng</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">容器方式安装</span></span><br><span class="line">docker pull lorel/docker-stress-ng</span><br></pre></td></tr></table></figure><p>假如一个容器未做内存使用限制，则该容器可以利用到系统内存最大空间，默认创建的容器没有做内存资源限制</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">默认一个workers分配256M内存，2个即占512M内存</span></span><br><span class="line">[root@centos7 ~]# docker run --name c1 -it --rm lorel/docker-stress-ng --vm 2</span><br><span class="line">stress-ng: info: [1] defaulting to a 86400 second run per stressor</span><br><span class="line">stress-ng: info: [1] dispatching hogs: 2 vm</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">上面命令是前台执行，下面在另一个终端窗口执行，可以看奥占用512M左右内存</span></span><br><span class="line">[root@centos7 ~]# docker stats</span><br><span class="line">CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O   PIDS</span><br><span class="line">a28df8e66a8b   c1        197.23%   512.0MiB / 1.792GiB   28.02%    648B / 0B   0B / 0B     5</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">指定内存最大值</span></span><br><span class="line">[root@centos7 ~]# docker run --name c1 -it --rm -m 300m lorel/docker-stress-ng --vm 2</span><br><span class="line">stress-ng: info: [1] defaulting to a 86400 second run per stressor</span><br><span class="line">stress-ng: info: [1] dispatching hogs: 2 vm</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在另一窗口执行，一次性查看资源使用情况</span></span><br><span class="line">[root@centos7 ~]# docker stats --no-stream</span><br><span class="line">CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O     PIDS</span><br><span class="line">c769402345f5   c1        163.55%   300MiB / 300MiB     100.00%   648B / 0B   6.75GB / 0B   5</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">内存限制 200M</span></span><br><span class="line">[root@centos7 ~]# docker run -it --rm -m 200M lorel/docker-stress-ng --vm 2 --vm-bytes 256M</span><br><span class="line">stress-ng: info: [1] defaulting to a 86400 second run per stressor</span><br><span class="line">stress-ng: info: [1] dispatching hogs: 2 vm</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# docker stats --no-stream</span><br><span class="line">CONTAINER ID   NAME              CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O    PIDS</span><br><span class="line">c384505f559d   hardcore_shtern   192.41%   199.9MiB / 200MiB   99.96%    648B / 0B   741MB / 0B   5</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看基于 cgroup对容器进行资源的大小限制</span></span><br><span class="line">[root@centos7 ~]# cat /sys/fs/cgroup/memory/docker/c384505f559d799d9a20d0fbee95e131539778f3b0063829fdcf22226d435582/memory.limit_in_bytes</span><br><span class="line">209715200</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">动态修改内存限制</span></span><br><span class="line">[root@centos7 ~]# echo 300*1024*1024|bc</span><br><span class="line">314572800</span><br><span class="line">[root@centos7 ~]# echo 314572800 &gt; /sys/fs/cgroup/memory/docker/c384505f559d799d9a20d0fbee95e131539778f3b0063829fdcf22226d435582/memory.limit_in_bytes</span><br><span class="line">[root@centos7 ~]# cat /sys/fs/cgroup/memory/docker/c384505f559d799d9a20d0fbee95e131539778f3b0063829fdcf22226d435582/memory.limit_in_bytes</span><br><span class="line">314572800</span><br><span class="line">[root@centos7 ~]# docker stats --no-stream</span><br><span class="line">CONTAINER ID   NAME              CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O     PIDS</span><br><span class="line">c384505f559d   hardcore_shtern   181.25%   300MiB / 300MiB     100.00%   648B / 0B   10.7GB / 0B   5</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">通过<span class="built_in">echo</span>命令可以改内存限制的值，但是可以在原基础上增大内存限制，缩小内存限制会报错</span> </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-bash: <span class="built_in">echo</span>: 写错误: 无效的参数</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">内存大小软限制</span></span><br><span class="line">[root@centos7 ~]# docker run -it --rm -m 256m --memory-reservation 128m --name c1 lorel/docker-stress-ng --vm 2 --vm-bytes 256m</span><br><span class="line">stress-ng: info: [1] defaulting to a 86400 second run per stressor</span><br><span class="line">stress-ng: info: [1] dispatching hogs: 2 vm</span><br><span class="line"></span><br><span class="line">[root@centos7 ~]# docker stats --no-stream</span><br><span class="line">CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O     PIDS</span><br><span class="line">9fd1ea32cc83   c1        178.48%   255.9MiB / 256MiB   99.96%    648B / 0B   1.44GB / 0B   5</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看硬限制</span></span><br><span class="line">[root@centos7 ~]# cat /sys/fs/cgroup/memory/docker/9fd1ea32cc83788b3f223295d6976295fcb307b0adaf9b82ea883f1fba129c49/memory.limit_in_bytes</span><br><span class="line">268435456</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看软限制</span></span><br><span class="line">[root@centos7 ~]# cat /sys/fs/cgroup/memory/docker/9fd1ea32cc83788b3f223295d6976295fcb307b0adaf9b82ea883f1fba129c49/memory.soft_limit_in_bytes</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">软限制不能高于硬限制</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">关闭OOM机制</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看docker OOM机制默认值</span></span><br><span class="line">[root@centos7 ~]# cat /sys/fs/cgroup/memory/docker/memory.oom_control</span><br><span class="line">oom_kill_disable 0</span><br><span class="line">under_oom 0</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">启动容器时关闭OOM机制</span></span><br><span class="line">[root@centos7 ~]# docker run -it --rm -m 200m --oom-kill-disable lorel/docker-stress-ng --vm 2 --vm-bytes 256m</span><br><span class="line">stress-ng: info: [1] defaulting to a 86400 second run per stressor</span><br><span class="line">stress-ng: info: [1] dispatching hogs: 2 vm</span><br><span class="line">[root@centos7 ~]# docker stats --no-stream</span><br><span class="line">CONTAINER ID   NAME          CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O     PIDS</span><br><span class="line">b0bccc1c29f7   epic_edison   0.00%     185.1MiB / 200MiB   92.56%    648B / 0B   28.7kB / 0B   5</span><br><span class="line">[root@centos7 ~]# cat /sys/fs/cgroup/memory/docker/b0bccc1c29f7355073442a1d84270827a19dc38a9258eafb5b3f017e3378cae0/memory.oom_control</span><br><span class="line">oom_kill_disable 1</span><br><span class="line">under_oom 1</span><br></pre></td></tr></table></figure><h4 id="交换分区限制"><a href="#交换分区限制" class="headerlink" title="交换分区限制"></a>交换分区限制</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker run -it --rm -m 256m --memory-swap 512m --name c1 centos bash</span><br><span class="line">cat /sys/fs/cgroup/memory/docker/容器ID/memory.memsw.limit_in_bytes</span><br></pre></td></tr></table></figure><h2 id="容器的CPU限制"><a href="#容器的CPU限制" class="headerlink" title="容器的CPU限制"></a>容器的CPU限制</h2><p>一个宿主机，有几十个核心的CPU，但是宿主机上可以同时运行成百上千个不同的进程用已处理不同的任务，多进程共用一个CPU的核心为可压缩资源，即一个核心的 CPU可以通过调整而运行多个进程，但是同一个单位时间内只能有一个进程在CPU上运行，那这么多的进程怎么在CPU上执行可调度的呢</p><p>Linux kernel进程的调度基于CFS（Completely Fair Scheduler），完全公平调度</p><h4 id="服务器资源密集型"><a href="#服务器资源密集型" class="headerlink" title="服务器资源密集型"></a>服务器资源密集型</h4><ul><li>CPU密集型的场景：优先级越低越好，计算密集型任务的特点是要进行大量的计算，消耗CPU资源，比如计算圆周率、数据处理、对视频频进行高清解码等等，全靠CPU的运算能力。</li><li>IO密集型的场景：优先级值高点，设计到网络。磁盘IO的任务都是IO密集型任务，这类任务的特点是CPU消耗很少，任务的大部分时间都在等IO操作完成（因为IO的速度远远低于CPU和内存的速度），比如Web应用，高并发，数据量大的动态网站来说，数据库应该为IO密集型</li></ul><p><strong>CFS原理</strong></p><p>cfs定义了进程调度的新模型，它给cfs_rq（cfs的run queue）中的每一个进程安排一个虚拟时钟vruntime。如果一个进程得以执行，随着时间的增长，其vruntime将不断增大。没有得到执行的进程vruntime不变，而调度器总是选择vruntime跑得最慢的那个进程来执行。这就是所谓的“完全公平”。为了区别不同优先级的进程，优先级高的进程vruntime增长得慢，以至于它可能得到更多的运行机会。CFS的意义在于，在一个混杂着打来年计算型进程和IO交互进程的系统中，CFS调度器相对其它调度器在对待IO交互进程要更加友善和公平。</p><h4 id="配置默认的CFS调度程序"><a href="#配置默认的CFS调度程序" class="headerlink" title="配置默认的CFS调度程序"></a>配置默认的CFS调度程序</h4><p>默认情况下，每个容器对主机的CPU周期的访问都是不受限制的。可以设置各种约束，以限制给定容器对主机CPU周期的访问。大多数用户使用并配置默认的CFS调度程序。在Docker1.13及更高版本中，还可以配置realtime scheduler</p><p>CFS是用于常规Linux进程的Linux内核CPU调度程序。通过几个运行时标志，可以配置对容器拥有的CPU资源的访问量。使用这些设置时，Docker会在主机上修改容器cgroup的设置</p><table><thead><tr><th>选项</th><th>描述</th></tr></thead><tbody><tr><td><code>--cpus</code></td><td>指定一个容器可以使用多少个可用的CPU核心资源。例如，如果主机有两个CPU，如果设置了<code>–cpus=“1.5”</code>，则可以保证容器最多使用1.5个CPU（如果是4核CPU，那么还可以是4核心上每核用一点，但是总计是1.5核心的CPU）。这相当于设置<code>–cpu-period=100000</code>和<code>–cpu-quota=“150000”</code>。此设置可在Docker1.13及更高版本中可用，目的是替代<code>–cpu-period</code>和<code>–cpu-quota</code>两个参数，从而是配置更简单，但是最大不能超过宿主机的CPU总核心数（在操作系统看到的CPU超线程后的数值），此项常用</td></tr><tr><td><code>--cpu-period</code></td><td>过时选项，指定CPU CFS调度程序周期，必须与cpu-quta一起使用。默认为100微秒。大多数用户不会更改默认设置。如果使用Docker1.13或更高版本，请改用cpus</td></tr><tr><td><code>--cpu-quota</code></td><td>过时选项，在容器上添加CPU CFS配额，计算方式为cpu-quota&#x2F;cpu-period的结果值，docker1.13及以上版本通常使用cpus设置此值</td></tr><tr><td><code>--cpuset-cpus</code></td><td>用于指定容器运行的CPU编号，也就是所谓的CPU绑定。如果一个或多个CPU，则容器可以使用逗号分隔的列表或连字符分隔的CPU范围。第一个CPU编号为0.有效值可能是0-3（使用第一，第二，第三和第四CPU）或1,3（使用第二和第四CPU）</td></tr><tr><td><code>--cpu-shares</code></td><td>用于设置cfs中调度的相对最大比例权重，cpu-share的值越高的容器，将会分得更多的时间片（宿主机多核CPU总数为100%，假如容器A为1024，容器B为2048，那么容器B将最大是容器A的可用CPU的两倍），默认的时间片1024，最大262144.这是一个软限制。</td></tr></tbody></table><h4 id="使用stress-ng测试CPU配置"><a href="#使用stress-ng测试CPU配置" class="headerlink" title="使用stress-ng测试CPU配置"></a>使用stress-ng测试CPU配置</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看stress-n关于CPU的帮助</span></span><br><span class="line">[root@centos7 ~]# docker run -it --rm --name c1 lorel/docker-stress-ng |grep cpu</span><br><span class="line"> -c N, --cpu N            start N workers spinning on sqrt(rand())</span><br><span class="line">       --cpu-ops N        stop when N cpu bogo operations completed</span><br><span class="line"> -l P, --cpu-load P       load CPU by P %%, 0=sleep, 100=full load (see -c)</span><br><span class="line">       --cpu-method m     specify stress cpu method m, default is all</span><br><span class="line">Example: stress-ng --cpu 8 --io 4 --vm 2 --vm-bytes 128M --fork 4 --timeout 10s</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">不限制容器CPU</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">占用4个CPU资源，但只是平均的使用CPU资源</span></span><br><span class="line">docker run -it --rm lorel/docker-stress-ng --cpu 4</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">限制使用CPU</span></span><br><span class="line">docker run -it --rm --cpus 1.5 lorel/docker-stress-ng --cpu 4</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">绑定CPU</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">一般不建议绑在0号CPU上，因0号CPU一般会较忙</span></span><br><span class="line">docker run -it --rm --cpus 1.5 --cpuset-cpus 2,4-5 lorel/docker-stress-ng --cpu 4</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">多个容器的CPU利用率比例</span></span><br><span class="line">docker run -it --rm --name c1 --cpu-shares 1000 lorel/docker-stress-ng --cpu 4</span><br><span class="line">docker run -it --rm --name c2 --spu-shares 500 lorel/docker-stress-ng --cpu 4</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看c1容器的cpu利用比例</span></span><br><span class="line">cat /sys/fs/cgroup/cpu,cpuacct/docker/c1容器ID/cpu.shares</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看c2容器的cpu利用比例</span></span><br><span class="line">cat /sys/fs/cgroup/cpu,cpuacct/docker/c2容器ID/cpu.shares</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">再打开新的容器，CPU分配比例会动态调整</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">动态调整cpu shares值</span></span><br><span class="line">echo 2000 &gt; /sys/fs/cgroup/cpu,cpuacct/docker/容器ID/cpu.shares</span><br></pre></td></tr></table></figure><h1 id="可视化图形工具Portainer"><a href="#可视化图形工具Portainer" class="headerlink" title="可视化图形工具Portainer"></a>可视化图形工具Portainer</h1><p>Portainer是一个可视化的容器镜像的图形管理工具，利用Portainer可以轻松构建，管理和维护Docker环境。而且完全免费，基于容器化的安装方式，方便高效。</p><p>官方站点：<a href="https://www.portainer.io/">https://www.portainer.io</a></p><h2 id="安装Portainer"><a href="#安装Portainer" class="headerlink" title="安装Portainer"></a>安装Portainer</h2><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@centos7 ~]# docker search portainer |head -n 3</span><br><span class="line">NAME                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED</span><br><span class="line">portainer/portainer                    This Repo is now deprecated, use portainer/p…   2262</span><br><span class="line">portainer/portainer-ce                 Portainer CE - a lightweight service deliver…   1350</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">portainer项目废弃</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">portainer-ce项目替代portainer</span></span><br><span class="line">[root@centos7 ~]# docker pull portainer/portainer-ce</span><br><span class="line">Using default tag: latest</span><br><span class="line">latest: Pulling from portainer/portainer-ce</span><br><span class="line">772227786281: Pull complete</span><br><span class="line">96fd13befc87: Pull complete</span><br><span class="line">bc9eaab2cad1: Pull complete</span><br><span class="line">6458f72e4747: Pull complete</span><br><span class="line">Digest: sha256:444ade51d69d7fca889c7aa14525c459dba313a0e7ca79aee985e6c0749427de</span><br><span class="line">Status: Downloaded newer image for portainer/portainer-ce:latest</span><br><span class="line">docker.io/portainer/portainer-ce:latest</span><br><span class="line">[root@centos7 ~]# docker volume create portainer_data</span><br><span class="line">portainer_data</span><br><span class="line">[root@centos7 ~]# docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce</span><br><span class="line">7d62ec92aaaca24218d44b13155fb47fb752847a596a1f732b90167687a986c3</span><br></pre></td></tr></table></figure><p>浏览器访问 <a href="http://ip:9000/">http://ip:9000</a></p><img src="https://img.chensir.ink/chensir-pics/202209131434025.png" alt="image-20220913143452855" style="zoom:67%;" /><h1 id="docker命令总结"><a href="#docker命令总结" class="headerlink" title="docker命令总结"></a>docker命令总结</h1><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">attach# 当前shell下attach连接指定运行镜像</span><br><span class="line">build# 通过Dockerfile定制镜像</span><br><span class="line">commit# 提交当前容器为新的镜像</span><br><span class="line">cp# 从容其中拷贝指定文件或者目录到宿主机中</span><br><span class="line">create# 创建一个新的容器，同run 但不能启动</span><br><span class="line">diff# 查看dokcer 容器变化</span><br><span class="line">events# 从docker服务获取容器实时事件</span><br><span class="line">exec# 在已存在的容器上运行命令</span><br><span class="line">export# 导出容器的内容作为一个tar 归档文件[对应import]</span><br><span class="line">history# 展示一个镜像形成的历史</span><br><span class="line">images# 列出系统当前镜像</span><br><span class="line">import# 从tar包中的内容创建一个新的文件系统映像[对应export]</span><br><span class="line">info# 显示系统相关系统</span><br><span class="line">inspect# 查看容器详细信息</span><br><span class="line">kill# kill指定容器</span><br><span class="line">load# 从一个tar包中加载一个镜像[对应save]</span><br><span class="line">login# 注册或者登录一个docker源服务器</span><br><span class="line">logout# 从当前docker registry退出</span><br><span class="line">logs# 输出当前日志信息</span><br><span class="line">port# 查看映射端口对应的容器内部源端口</span><br><span class="line">pause# 暂停容器</span><br><span class="line">ps# 列出容器列表</span><br><span class="line">pull# 从docker镜像源服务器拉取指定镜像或者库镜像</span><br><span class="line">push# 推送指定镜像或者库镜像至docker源服务器</span><br><span class="line">restart# 重启运行的容器</span><br><span class="line">rm# 移除一个或多个容器</span><br><span class="line">rmi# 移除一个或多个镜像[无容器使用该镜像才可删除，否则需要删除相关容器才可继续 或 -f 强制删除]</span><br><span class="line">run# 创建一个新的容器并运行一个命令</span><br><span class="line">save# 保存一个镜像为一个tar包[对应load]</span><br><span class="line">search# 在docker hub中搜索镜像</span><br><span class="line">start# 启动容器</span><br><span class="line">stop# 停止容器</span><br><span class="line">tag# 给源中镜像打标签</span><br><span class="line">top# 查看容器中运行的进程信息</span><br><span class="line">unpause# 取消暂停容器</span><br><span class="line">version# 查看docker版本号</span><br><span class="line">wait# 截取容器停止时的退出状态值</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;Docker介绍和基础操作&quot;&gt;&lt;a href=&quot;#Docker介绍和基础操作&quot; class=&quot;headerlink&quot; title=&quot;Docker介绍和基础操作&quot;&gt;&lt;/a&gt;Docker介绍和基础操作&lt;/h1&gt;&lt;h2 id=&quot;Docker介绍&quot;&gt;&lt;a</summary>
        
      
    
    
    
    <category term="Linux" scheme="https://chensir.ink/categories/Linux/"/>
    
    
    <category term="Docker" scheme="https://chensir.ink/tags/Docker/"/>
    
    <category term="harbor" scheme="https://chensir.ink/tags/harbor/"/>
    
  </entry>
  
  <entry>
    <title>链路追踪SkyWalking</title>
    <link href="https://chensir.ink/2022/08/03/%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AASkyWalking/"/>
    <id>https://chensir.ink/2022/08/03/%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AASkyWalking/</id>
    <published>2022-08-02T21:31:25.000Z</published>
    <updated>2025-11-26T14:04:32.784Z</updated>
    
    <content type="html"><![CDATA[<h2 id="什么是SkyWalking"><a href="#什么是SkyWalking" class="headerlink" title="什么是SkyWalking"></a>什么是SkyWalking</h2><p> <a href="https://skywalking.apache.org/">SkyWalking官网</a></p><p>SkyWalking是一个优秀的国产开源框架，2015年由个人吴晟（华为开发者）开源，2017年加入Apache孵化器。短短两年就被收入Apache麾下，实力可见一斑。SkyWalking支持dubbo，SpringCloud，SpringBoot集成，代码无侵入，通信方式采用GRPC，性能较好，实现方式是java探针，支持告警，支持JVM监控，支持全局调用统计等，功能比较完善。</p><h2 id="SkyWalking优势"><a href="#SkyWalking优势" class="headerlink" title="SkyWalking优势"></a>SkyWalking优势</h2><ul><li><p>采用字节码增强的技术实现代码无侵入</p></li><li><p>功能比较丰富，报表统计，UI界面更加人性化</p></li></ul><h2 id="SkyWalking架构"><a href="#SkyWalking架构" class="headerlink" title="SkyWalking架构"></a>SkyWalking架构</h2><p>SkyWalking和zipkin一样，分为服务端和客户端，服务端负责手机日志数据并且展示</p><p><img src="https://img.chensir.ink/chensir-pics/202208011039087.png"></p><p>SkyWalking在逻辑上风味四个部分：Probes（探针），Platform backend（平台后端），Storage （存储）and UI（用户界面）</p><ul><li>Probes：收集数据并根据SkyWalking要求重新格式化（不同探头支持不同的来源）</li><li>Platform backend：支持数据聚合，分析，涵盖跟踪、指标和日志</li><li>Storage：存储SkyWalking数据，可以选择现有的实现，如ElasticSearch、H2、MySQL等</li><li>UI：负责提供web控制台，查看链路，查看各种指标，性能等等</li></ul><h2 id="部署skywalking"><a href="#部署skywalking" class="headerlink" title="部署skywalking"></a>部署skywalking</h2><h3 id="安装docker"><a href="#安装docker" class="headerlink" title="安装docker"></a>安装docker</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装依赖</span></span><br><span class="line">sudo yum install -y yum-utils device-mapper-persistent-data lvm2</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">添加源</span></span><br><span class="line">sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">更新</span></span><br><span class="line">sudo yum makecache fast</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装docker-ce</span></span><br><span class="line">sudo yum -y install docker-ce</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建配置文件目录</span></span><br><span class="line">sudo mkdir -p /etc/docker</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建配置文件</span></span><br><span class="line">touch /etc/docker/daemon.json</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">新增配置文件内容 /mitr/middleware/docker目录已创建</span> </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在 docker 19.xx 版本以后使用data-root来代替graph</span></span><br><span class="line">cat &lt;&lt;EOF | sudo tee /etc/docker/daemon.json</span><br><span class="line">&#123;</span><br><span class="line">&quot;registry-mirrors&quot;:[&quot;https://docker.mirrors.ustc.edu.cn&quot;],</span><br><span class="line">&quot;data-root&quot;: &quot;/mitr/middleware/docker&quot; # docker主目录 存储images等</span><br><span class="line">&#125;</span><br><span class="line">EOF</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">加载启动并设置开机自启</span></span><br><span class="line">systemctl daemon-reload &amp;&amp; systemctl enable docker &amp;&amp; systemctl start docker</span><br></pre></td></tr></table></figure><h3 id="部署Elasticsearch"><a href="#部署Elasticsearch" class="headerlink" title="部署Elasticsearch"></a>部署Elasticsearch</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">1.拉取镜像</span></span><br><span class="line">docker pull docker.elastic.co/elasticsearch/elasticsearch:7.7.1</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">2.调整系统内核参数</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">elastic官方建议 生产环境下使用 elasticsearch镜像 需设置Linux参数 vm.max_map_count</span></span><br><span class="line">echo &quot;vm.max_map_count=262144&quot; &gt;&gt; /etc/sysctl.conf</span><br><span class="line">sysctl -p</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">3.新建 elasticsearch 目录</span></span><br><span class="line">mkdir -p /hsadata/elasticsearch/&#123;config,data,plugins&#125;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">4.修改 elasticsearch 配置</span></span><br><span class="line">vim /hsadata/elasticsearch/config/elasticsearch.yml</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">配置内容如下</span></span><br><span class="line">cluster.name: &quot;docker-cluster&quot;</span><br><span class="line">network.host: 0.0.0.0</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">开启 elasticsearch 安全认证 xpack认证</span></span><br><span class="line">http.cors.allow-headers: Authorization</span><br><span class="line">xpack.security.enabled: true</span><br><span class="line">xpack.security.transport.ssl.enabled: true</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">5.添加系统用户 elasticsearch</span></span><br><span class="line">adduser elasticsearch</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">6.授权目录及所属</span></span><br><span class="line">chmod g+rwx /hsadata/elasticsearch</span><br><span class="line">chown -R elasticsearch:root /hsadata/elasticsearch/</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">7.创建并启动容器（4核8G）</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">ES_JAVA_OPTS=<span class="string">&quot;-Xms2688m -Xmx2688m&quot;</span> JVM内核参数优化</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">--<span class="built_in">ulimit</span> nofile=65535:65535 设置 系统限制用户最大进程数 限制用户打开最大文件数</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">--cpuset-cpus=<span class="string">&quot;1&quot;</span> -m 4G 限制容器可用的CPU和内存资源</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Redhat8.6 涉及到权限问题 导致启动失败</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">解决方案 不挂载data目录启动镜像 然后将容器内的data目录拷贝到宿主机即可</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker <span class="built_in">cp</span> es:/usr/share/elasticsearch/data /hsadata/elasticsearch/data</span></span><br><span class="line">docker run -d -e ES_JAVA_OPTS=&quot;-Xms2688m -Xmx2688m&quot; -e &quot;discovery.type=single-node&quot; -p 9200:9200 -p 9300:9300 --restart=always --ulimit nofile=65535:65535 --cpuset-cpus=&quot;1&quot; -m 4G -v /hsadata/elasticsearch/data:/usr/share/elasticsearch/data -v /hsadata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -v /hsadata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml --name es 830a894845e3</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">8.启动xpack认证 并设置 elasticsearch 密码</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">进入 docker 容器</span></span><br><span class="line">docker exec -it es bash</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在容器内执行 并设置密码</span></span><br><span class="line">elasticsearch-setup-passwords interactive</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">.... 设置 es_xpack 认证的6个账户密码 ....</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">9.验证部署是否成功</span></span><br><span class="line">curl -u 用户名:密码 -XGET &#x27;http://127.0.0.1:9200&#x27;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">结果如下为部署成功</span></span><br><span class="line">&#123;</span><br><span class="line">  &quot;name&quot; : &quot;ba34d751f560&quot;,</span><br><span class="line">  &quot;cluster_name&quot; : &quot;docker-cluster&quot;,</span><br><span class="line">  &quot;cluster_uuid&quot; : &quot;AIm_UjiAT2-8X4gDjbPYxA&quot;,</span><br><span class="line">  &quot;version&quot; : &#123;</span><br><span class="line">    &quot;number&quot; : &quot;7.7.1&quot;,</span><br><span class="line">    &quot;build_flavor&quot; : &quot;default&quot;,</span><br><span class="line">    &quot;build_type&quot; : &quot;docker&quot;,</span><br><span class="line">    &quot;build_hash&quot; : &quot;ad56dce891c901a492bb1ee393f12dfff473a423&quot;,</span><br><span class="line">    &quot;build_date&quot; : &quot;2020-05-28T16:30:01.040088Z&quot;,</span><br><span class="line">    &quot;build_snapshot&quot; : false,</span><br><span class="line">    &quot;lucene_version&quot; : &quot;8.5.1&quot;,</span><br><span class="line">    &quot;minimum_wire_compatibility_version&quot; : &quot;6.8.0&quot;,</span><br><span class="line">    &quot;minimum_index_compatibility_version&quot; : &quot;6.0.0-beta1&quot;</span><br><span class="line">  &#125;,</span><br><span class="line">  &quot;tagline&quot; : &quot;You Know, for Search&quot;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="部署SkyWalking-OAP"><a href="#部署SkyWalking-OAP" class="headerlink" title="部署SkyWalking OAP"></a>部署SkyWalking OAP</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">拉取镜像</span></span><br><span class="line">docker pull apache/skywalking-oap-server:8.3.0-es7</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">启动SkyWalking OAP</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">注：–<span class="built_in">link</span>后面的第一个参数和elasticsearch容器名一致;</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-e SW_STORAGE_ES_CLUSTER_NODES：es7也可改为你es服务器部署的Ip地址，即ip:9200</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">SW_ES_USER：es用户名</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">SW_ES_PASSWORD：es密码</span></span><br><span class="line">docker run --name oap --restart always -d --restart=always -p 12800:12800 -p 11800:11800 --link es:elasticsearch -e TZ=Asia/Shanghai -e SW_STORAGE=elasticsearch7 -e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 -e SW_ES_USER=elastic -e SW_ES_PASSWORD=3cu8rt00@A apache/skywalking-oap-server:8.3.0-es7</span><br></pre></td></tr></table></figure><h3 id="部署SkyWalking-UI"><a href="#部署SkyWalking-UI" class="headerlink" title="部署SkyWalking UI"></a>部署SkyWalking UI</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">拉取镜像</span></span><br><span class="line">docker pull apache/skywalking-ui:8.3.0</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">启动SkyWalking UI</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">注：–<span class="built_in">link</span>后面的第一个参数和skywalking OAP容器名一致</span></span><br><span class="line">docker run -d --name skywalking-ui --restart=always -p 8098:8080 --link oap:oap -e TZ=Asia/Shanghai -e SW_OAP_ADDRESS=oap:12800 apache/skywalking-ui:8.3.0</span><br></pre></td></tr></table></figure><h3 id="应用程序配合SkyWalking-Agent"><a href="#应用程序配合SkyWalking-Agent" class="headerlink" title="应用程序配合SkyWalking Agent"></a>应用程序配合SkyWalking Agent</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">下载SkyWalking Agent</span></span><br><span class="line">wget https://archive.apache.org/dist/skywalking/8.3.0/apache-skywalking-apm-es7-8.3.0.tar.gz</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">解压</span></span><br><span class="line">tar -zxvf apache-skywalking-apm-es7-8.3.0.tar.gz</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">启动java服务 agent路径 我放到了 /mitr/middleware/skywalking-apm/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar 所以配置如下</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">backend_service是skywalking-oap服务地址</span></span><br><span class="line">java -jar  -javaagent:/mitr/middleware/skywalking-apm/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar -Dskywalking.agent.service_name=118erptest -Dskywalking.collector.backend_service=127.0.0.1:11800 app.jar</span><br></pre></td></tr></table></figure><p><strong>集成日志</strong> logback</p><p>引入POM依赖</p><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.apache.skywalking<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>apm-toolkit-trace<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">version</span>&gt;</span>8.3.0<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">scope</span>&gt;</span>provided<span class="tag">&lt;/<span class="name">scope</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!--打印skywalking的TraceId到日志--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.apache.skywalking<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>apm-toolkit-logback-1.x<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">version</span>&gt;</span>8.3.0<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br></pre></td></tr></table></figure><p>修改logback.xml</p><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;UTF-8&quot;</span>?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">configuration</span> <span class="attr">scan</span>=<span class="string">&quot;true&quot;</span> <span class="attr">scanPeriod</span>=<span class="string">&quot;10 seconds&quot;</span> <span class="attr">debug</span>=<span class="string">&quot;false&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">property</span> <span class="attr">name</span>=<span class="string">&quot;APP_NAME&quot;</span> <span class="attr">value</span>=<span class="string">&quot;hsa-iep-opp&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">property</span> <span class="attr">name</span>=<span class="string">&quot;APPLOG_PATH&quot;</span> <span class="attr">value</span>=<span class="string">&quot;/var/log/hsa-iep-opp-local&quot;</span>/&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">appender</span> <span class="attr">name</span>=<span class="string">&quot;dailyRollingFileAppender&quot;</span> <span class="attr">class</span>=<span class="string">&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">File</span>&gt;</span>$&#123;APPLOG_PATH&#125;/$&#123;APP_NAME&#125;.log<span class="tag">&lt;/<span class="name">File</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">rollingPolicy</span> <span class="attr">class</span>=<span class="string">&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">FileNamePattern</span>&gt;</span>$&#123;APPLOG_PATH&#125;/$&#123;APP_NAME&#125;.%d&#123;yyyy-MM-dd&#125;.log<span class="tag">&lt;/<span class="name">FileNamePattern</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">maxHistory</span>&gt;</span>15<span class="tag">&lt;/<span class="name">maxHistory</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">rollingPolicy</span>&gt;</span></span><br><span class="line">        <span class="comment">&lt;!-- 打印tid --&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">encoder</span> <span class="attr">class</span>=<span class="string">&quot;ch.qos.logback.core.encoder.LayoutWrappingEncoder&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">layout</span> <span class="attr">class</span>=<span class="string">&quot;org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout&quot;</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">pattern</span>&gt;</span>%d&#123;yyyy-MM-dd HH:mm:ss.SSS&#125; [%tid] [%thread] %highlight(%5level) %cyan(%-40logger&#123;40&#125;) %4line : %msg %n<span class="tag">&lt;/<span class="name">pattern</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">layout</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">encoder</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">appender</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">appender</span> <span class="attr">name</span>=<span class="string">&quot;dailyRollingFileErrorAppender&quot;</span> <span class="attr">class</span>=<span class="string">&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">File</span>&gt;</span>$&#123;APPLOG_PATH&#125;/$&#123;APP_NAME&#125;-error.log<span class="tag">&lt;/<span class="name">File</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">rollingPolicy</span> <span class="attr">class</span>=<span class="string">&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;</span>&gt;</span></span><br><span class="line">            <span class="comment">&lt;!-- daily rollover --&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">FileNamePattern</span>&gt;</span>$&#123;APPLOG_PATH&#125;/$&#123;APP_NAME&#125;-error.%d&#123;yyyy-MM-dd&#125;.log<span class="tag">&lt;/<span class="name">FileNamePattern</span>&gt;</span></span><br><span class="line">            <span class="comment">&lt;!-- keep 30 days&#x27; worth of history --&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">maxHistory</span>&gt;</span>15<span class="tag">&lt;/<span class="name">maxHistory</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">rollingPolicy</span>&gt;</span></span><br><span class="line">        <span class="comment">&lt;!-- 打印tid --&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">encoder</span> <span class="attr">class</span>=<span class="string">&quot;ch.qos.logback.core.encoder.LayoutWrappingEncoder&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">layout</span> <span class="attr">class</span>=<span class="string">&quot;org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout&quot;</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">pattern</span>&gt;</span>%d&#123;yyyy-MM-dd HH:mm:ss.SSS&#125; [%tid] [%thread] %highlight(%5level) %cyan(%-40logger&#123;40&#125;) %4line : %msg %n<span class="tag">&lt;/<span class="name">pattern</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">layout</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">encoder</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">filter</span> <span class="attr">class</span>=<span class="string">&quot;ch.qos.logback.classic.filter.LevelFilter&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">level</span>&gt;</span>ERROR<span class="tag">&lt;/<span class="name">level</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">onMatch</span>&gt;</span>ACCEPT<span class="tag">&lt;/<span class="name">onMatch</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">onMismatch</span>&gt;</span>DENY<span class="tag">&lt;/<span class="name">onMismatch</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">filter</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">appender</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">appender</span> <span class="attr">name</span>= <span class="string">&quot;STDOUT&quot;</span> <span class="attr">class</span>=<span class="string">&quot;ch.qos.logback.core.ConsoleAppender&quot;</span>&gt;</span></span><br><span class="line">        <span class="comment">&lt;!-- 打印tid --&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">encoder</span> <span class="attr">class</span>=<span class="string">&quot;ch.qos.logback.core.encoder.LayoutWrappingEncoder&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">layout</span> <span class="attr">class</span>=<span class="string">&quot;org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout&quot;</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">pattern</span>&gt;</span>%d&#123;yyyy-MM-dd HH:mm:ss.SSS&#125; [%tid] [%thread] %highlight(%5level) %cyan(%-40logger&#123;40&#125;) %4line : %msg %n<span class="tag">&lt;/<span class="name">pattern</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">layout</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">encoder</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">appender</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">&lt;!-- 自定义日志 --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">logger</span> <span class="attr">name</span>=<span class="string">&quot;cn.hsa&quot;</span> <span class="attr">level</span>=<span class="string">&quot;DEBUG&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">logger</span> <span class="attr">name</span>=<span class="string">&quot;org.springframework&quot;</span> <span class="attr">level</span>=<span class="string">&quot;WARN&quot;</span>/&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">root</span> <span class="attr">level</span>=<span class="string">&quot;DEBUG&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">&quot;dailyRollingFileAppender&quot;</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">&quot;dailyRollingFileErrorAppender&quot;</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">&quot;STDOUT&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">root</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">configuration</span>&gt;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;什么是SkyWalking&quot;&gt;&lt;a href=&quot;#什么是SkyWalking&quot; class=&quot;headerlink&quot; title=&quot;什么是SkyWalking&quot;&gt;&lt;/a&gt;什么是SkyWalking&lt;/h2&gt;&lt;p&gt; &lt;a</summary>
        
      
    
    
    
    <category term="Linux" scheme="https://chensir.ink/categories/Linux/"/>
    
    
    <category term="SkyWalking" scheme="https://chensir.ink/tags/SkyWalking/"/>
    
  </entry>
  
  <entry>
    <title>安全加固,浅谈OpenSSL和OpenSSH</title>
    <link href="https://chensir.ink/2022/07/21/%E5%AE%89%E5%85%A8%E5%8A%A0%E5%9B%BA,%E6%B5%85%E8%B0%88OpenSSL%E5%92%8COpenSSH/"/>
    <id>https://chensir.ink/2022/07/21/%E5%AE%89%E5%85%A8%E5%8A%A0%E5%9B%BA,%E6%B5%85%E8%B0%88OpenSSL%E5%92%8COpenSSH/</id>
    <published>2022-07-21T07:40:15.000Z</published>
    <updated>2025-11-26T14:04:32.776Z</updated>
    
    <content type="html"><![CDATA[<h1 id="OpenSSL"><a href="#OpenSSL" class="headerlink" title="OpenSSL"></a>OpenSSL</h1><p>OpenSSl是一个强大的安全套接字层密码库，Apache使用它加密HTTPS，OpenSSH使用它加密SSH，但是不能只将它作为一个库来使用，它是一个多用途。跨平台的密码工具。</p><h2 id="基本功能"><a href="#基本功能" class="headerlink" title="基本功能"></a>基本功能</h2><p>OpenSSL整个软件包大概可以分成三个主要的功能部分：密码算法库，SSL协议库以及应用程序。</p><p>OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。</p><ul><li>OpenSSL：多用途的命令工具，每种功能都使用专用的子命令来实现</li><li>libcrypto：加密，解密库文件</li><li>libssl：加密模块应用库，实现了ssl及tls</li></ul><h2 id="密码算法库"><a href="#密码算法库" class="headerlink" title="密码算法库"></a>密码算法库</h2><h3 id="对称加密算法"><a href="#对称加密算法" class="headerlink" title="对称加密算法"></a>对称加密算法</h3><p>我们一般的加密使用一个密码加密文件，然后解密也用同样的密码，这个对是称加密。OpenSSL一共提供了8种对称加密算法，其中7种是分组加密算法，仅有的一种加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5，都支持电子密码本模式（ECB）、加密分组链接模式（CBC）、加密反馈模式（CFB）和输出反馈模式（OFB）四种常用的分组密码加密模式。其中AES使用的加密反馈模式（CFB）和输出反馈模式（OFB）分组长度是128位，其它算法使用的则是64位。事实上，DES算法里面不仅仅是常用的DES算法，还支持三个秘钥和两个秘钥DES算法。</p><h3 id="非对称加密算法"><a href="#非对称加密算法" class="headerlink" title="非对称加密算法"></a>非对称加密算法</h3><p>有些加密用的一个密码，而解密用另外一组密码，这个叫非对称加密。OpenSSL一共实现了4中非对称加密算法，包括DH算法、RSA算法、DSA算法和椭圆曲线算法（EC）。DH算法一般用户秘钥交换。RSA算法既可以用于秘钥交换，也可以用于数字签名，当然，如果你能够忍受其缓慢的速度，那么也可以用于数据加密。DSA算法则一般只用于数字签名。</p><h3 id="信息摘要算法"><a href="#信息摘要算法" class="headerlink" title="信息摘要算法"></a>信息摘要算法</h3><p>OpenSSL实现了5种信息摘要算法，分别是MD2、MD5、MDC2、SHA（SHA1）和RIPEMD。SHA算法事实上包括了SHA和SHA1两种信息摘要算法，此外，OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。</p><h3 id="秘钥和证书管理"><a href="#秘钥和证书管理" class="headerlink" title="秘钥和证书管理"></a>秘钥和证书管理</h3><p>秘钥和证书管理是PKI的一个重要组成部分，OpenSSL为之提供了丰富的功能，支持多种标准。</p><p>首先，OpenSSL实现了ASN.1的证书和秘钥相关标准，提供了对证书、公钥、私钥、证书请求以及CRL等数据对象的DER、PEM和BASE64的编解码功能。OpenSSL提供了产生各种公开秘钥和对称秘钥的方法、函数和应用程序，同时提供了对公钥和私钥的DER编解码功能。并实现了私钥的PKCS#12和PKCS#8的编解码功能。OpenSSL在标准中提供了对私钥的加密保护功能，使得秘钥可以安全地进行存储和分发。</p><p>在此基础上，OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能。并提供了一种文本数据库，支持证书的管理功能，包括秘钥产生、请求产生、证书签发、吊销和验证等功能。</p><p>事实上，OpenSSL提供的CA应用程序就是一个小型的证书管理中心（CA），实现了证书签发的整个流程和证书管理的大部分机制。</p><h2 id="OpenSSL命令"><a href="#OpenSSL命令" class="headerlink" title="OpenSSL命令"></a>OpenSSL命令</h2><h3 id="查看程序版本号"><a href="#查看程序版本号" class="headerlink" title="查看程序版本号"></a>查看程序版本号</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">openssl version</span><br></pre></td></tr></table></figure><h3 id="标准命令"><a href="#标准命令" class="headerlink" title="标准命令"></a>标准命令</h3><p>enc crl ca dh req ……</p><h3 id="对称加密"><a href="#对称加密" class="headerlink" title="对称加密"></a>对称加密</h3><p>工具：openssl enc，gpg</p><p>算法：3des，aes，blowfish</p><h4 id="enc命令"><a href="#enc命令" class="headerlink" title="enc命令"></a>enc命令</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">openssl enc -e -des3 -a -salt -in ipset.sh -out ipset</span><br></pre></td></tr></table></figure><p>-enc：表示加密</p><p>-e：加密算法</p><p>-des3：des3加密算法</p><p>-a：基于ase64文本进行编码</p><p>-salt：加盐</p><p>-in：加密的文件</p><p>-out：输出文件</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">openssl enc -d -des3 -a -salt -in ipest -out ipset.sh</span><br></pre></td></tr></table></figure><p>-d：表示解密</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">openssl enc -e -des3 -a -salt -in /etc/fstab -out fstab.ciphertext 加密文件 要输入密码</span><br></pre></td></tr></table></figure><p><img src="https://img.chensir.ink/chensir-pics/202207201326711.png"></p><p>解密</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">openssl enc -d -des3 -a -salt -in fstab.ciphertext -out fstab</span><br></pre></td></tr></table></figure><h3 id="单向加密"><a href="#单向加密" class="headerlink" title="单向加密"></a>单向加密</h3><p>获取数据的特征码</p><p>工具 MD5sum sha1sum sha224sum sha256sum…… openssl dgst</p><h4 id="dgst命令"><a href="#dgst命令" class="headerlink" title="dgst命令"></a>dgst命令</h4><p>常用选项:</p><p>[-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] : 指定一种加密算法</p><p>-out filename：将加密的内容保存到指定文件中</p><p>Openssl dgst -md5 -hex fstab 相当于 md5sum fstab 默认16进制编码</p><p><img src="https://img.chensir.ink/chensir-pics/202207201409376.png"></p><p>单向加密除了openssl dgst 工具还有：md5sum，sha1sum，sha224sum，sha256sum，sha384sum，sha512sum</p><p><img src="https://img.chensir.ink/chensir-pics/202207201412440.png"></p><p>MAC：Message Autentication Code单向加密的一种延伸应用，用于实现网络通信中保证所传输的数据的完整性机制</p><p>CBC-MAC</p><p>HMAC：使用md5或sha1算法</p><h3 id="生成用户密码"><a href="#生成用户密码" class="headerlink" title="生成用户密码"></a>生成用户密码</h3><p>openssl passwd，用法如下：</p><p>openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}</p><p>常用选项：</p><p>-1：使用md5加密算法</p><p>-salt string：加入随机数，最多8位随机数</p><p>-in file：对输入的文件内容进行加密</p><p>-stdin：对标准输入的内容进行加密</p><p><img src="https://img.chensir.ink/chensir-pics/202207201418172.png"></p><p><strong>生成随机数（适合充当salt）</strong></p><p>生成随机数需要用到标准命令rand，用法如下</p><p>openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num</p><p>常用选项：</p><p>-out file：将生成的随机数保存至指定文件中</p><p>-base64：使用base64编码格式</p><p>-hex：使用16进制编码格式</p><h3 id="公钥加密"><a href="#公钥加密" class="headerlink" title="公钥加密"></a>公钥加密</h3><p>加密算法：RSA ELGmal</p><p>工具：gpg，openssl rsautl man rsautl</p><p>数字签名：发送方用自己的私钥加密，接收方用发送方的公钥解密。</p><p>数字签名会加密语言数据的特征码，而不会加密语言数据本身。</p><p>算法：RSA，EIGamal，DSA（只能用来做签名，而无法用来加密）</p><p>DSA：digital signature algorithm</p><p>DSS：digital signature standard（只能私钥加密，公钥解密）</p><h3 id="密钥交换"><a href="#密钥交换" class="headerlink" title="密钥交换"></a>密钥交换</h3><p>算法：dh</p><p>数字证书：公钥加密的另一个应用</p><p>证书格式：x509</p><h3 id="生成密钥对"><a href="#生成密钥对" class="headerlink" title="生成密钥对"></a>生成密钥对</h3><h4 id="genrsa命令"><a href="#genrsa命令" class="headerlink" title="genrsa命令"></a>genrsa命令</h4><p>openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]</p><p>常用选项：</p><p>-out filename：将生成的私钥保存至指定的文件中</p><p>-des|-des3|-idea：不同的加密算法</p><p>numbits：指定生成私钥的大小，默认2048</p><p>一般情况下密钥文件的权限一定要控制好，只能自己读写，因此可以使用umask命令设置生成的私钥权限</p><p>生成私钥</p><p>openssl genrsa -out &#x2F;PATH&#x2F;TO&#x2F;PRIVATEKEY.FILE NUM_BITS</p><p><img src="https://img.chensir.ink/chensir-pics/202207201434099.png"></p><h4 id="ras命令"><a href="#ras命令" class="headerlink" title="ras命令"></a>ras命令</h4><p>openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg]<br>[-sgckey] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-engine id]</p><p>常用选项:</p><p>-in filename：指明私钥文件</p><p>-out filename：指明将提取出的公钥保存至指定文件中</p><p>-pubout：根据私钥提取出公钥</p><p><strong>生成公钥</strong></p><p><img src="https://img.chensir.ink/chensir-pics/202207201439949.png"></p><p><strong>私钥权限控制</strong></p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">加括号在子shell中运行，<span class="built_in">umask</span>只在这一次有用 对私钥加密  3des</span></span><br><span class="line">(umask 077; openssl genrsa -out key.pri 2048) </span><br></pre></td></tr></table></figure><h3 id="随机数生成器"><a href="#随机数生成器" class="headerlink" title="随机数生成器"></a>随机数生成器</h3><p>熵池：在操作系统上有一个叫做熵池的地方，它是用来保存硬件终端产生的随机数（每一次硬件终端都会产生一个随机数）</p><p>&#x2F;dev&#x2F;random：仅从熵池中返回随机数，随机数耗尽时，取随机数的进程将会被阻塞</p><p>&#x2F;dev&#x2F;unrandom：仅从熵池中取随机数，随机数耗尽时，就通过伪随机数生成器生成伪随机数（伪随机数不安全）</p><p>熵池中随机数的来源：硬盘IO中断时间间隔</p><h2 id="建立私有AC"><a href="#建立私有AC" class="headerlink" title="建立私有AC"></a>建立私有AC</h2><p>数字证书的获取：</p><ul><li>向RA注册申请，即公共信任的CA</li><li>自己创建私有CA，内部网络使用</li></ul><h3 id="CA-相关文件列表"><a href="#CA-相关文件列表" class="headerlink" title="CA 相关文件列表"></a>CA 相关文件列表</h3><ul><li>openssl的配置文件：&#x2F;etc&#x2F;pki&#x2F;tls&#x2F;openssl.cnf</li><li>CA的工作目录：&#x2F;etc&#x2F;pki&#x2F;CA</li><li>吊销列表的存放位置：&#x2F;etc&#x2F;pki&#x2F;CA&#x2F;crl</li><li>刚签署的证书的存放位置：&#x2F;etc&#x2F;pki&#x2F;CA&#x2F;newcerts</li><li>CA自身的公钥的位置：&#x2F;etc&#x2F;pki&#x2F;CA&#x2F;cacert.pem</li><li>发出的证书的编号位置：&#x2F;etc&#x2F;pki&#x2F;CA&#x2F;serial</li><li>为吊销的证书编号的位置：&#x2F;etc&#x2F;pki&#x2F;CA&#x2F;crlnumber</li><li>CA自己的私钥位置：&#x2F;etc&#x2F;pki&#x2F;CA&#x2F;private&#x2F;cakey.pem</li><li>随机数文件：&#x2F;etc&#x2F;pki&#x2F;CA&#x2F;private&#x2F;.rand</li></ul><h3 id="测试在centos上创建CA"><a href="#测试在centos上创建CA" class="headerlink" title="测试在centos上创建CA"></a>测试在centos上创建CA</h3><p>实验环境：两台centos7机器，一台作为CA主机10.0.0.54，一台作为用户主机10.0.0.53（证书请求主机，web服务）</p><p><strong>构建私有CA CA主机10.0.0.54</strong>，在确定为CA的服务器上生成一个自签证书，并为CA提供所需要的目录及文件</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">1.生成私钥，CA自签名证书，需要一个私钥，在openssl.cnf中，默认私钥文件存放路径为 /etc/pki/CA/private/cakey.pem</span></span><br><span class="line">openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096</span><br><span class="line">chmod 077 /etc/pki/CA/private/cakey.pem</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">2.生成自签证书</span></span><br><span class="line">openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365</span><br><span class="line"></span><br><span class="line">-new：生成新证书签署请求</span><br><span class="line">-x509：生成自签格式证书，专用于创建私有CA</span><br><span class="line">-key：生成请求时用到的私钥文件路径</span><br><span class="line">-out：生成的请求文件路径；如果自签操作将直接生成签署过的证书</span><br><span class="line">-days：证书的有效时长，单位为天</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成有效期长一些的证书</span></span><br><span class="line">openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例</span></span><br><span class="line">[root@OpenSSH01 CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650</span><br><span class="line">You are about to be asked to enter information that will be incorporated</span><br><span class="line">into your certificate request.</span><br><span class="line">What you are about to enter is what is called a Distinguished Name or a DN.</span><br><span class="line">There are quite a few fields but you can leave some blank</span><br><span class="line">For some fields there will be a default value,</span><br><span class="line">If you enter &#x27;.&#x27;, the field will be left blank.</span><br><span class="line">-----</span><br><span class="line">Country Name (2 letter code) [XX]:CN</span><br><span class="line">State or Province Name (full name) []:LiaoNing</span><br><span class="line">Locality Name (eg, city) [Default City]:DL</span><br><span class="line">Organization Name (eg, company) [Default Company Ltd]:chensir.ink</span><br><span class="line">Organizational Unit Name (eg, section) []:technology</span><br><span class="line">Common Name (eg, your name or your server&#x27;s hostname) []:chensir</span><br><span class="line">Email Address []:xchensir@qq.com</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">3.为CA提供所需的目录及文件</span></span><br><span class="line">mkdir -pv /etc/pki/CA/&#123;certs,crl,newcerts&#125;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建 index.txt文件 （数据库文件）</span></span><br><span class="line">touch index.txt</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">指明证书的开始编号</span></span><br><span class="line">echo 01 &gt;serial</span><br></pre></td></tr></table></figure><p><strong>向CA请求签署证书 CA用户主机10.0.0.53</strong>提供web服务需要用到证书进行安全通信的服务器，需要向CA请求签署证书</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">以httpd为例</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在需要使用证书的主机上生成私钥，私钥位置随意</span></span><br><span class="line">mkdir -p /etc/httpd/ssl</span><br><span class="line">openssl genrsa -out /etc/httpd/ssl/httpd.key  2048</span><br><span class="line">chmod 077 /etc/httpd/ssl/httpd.key</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成证书签署请求</span></span><br><span class="line">openssl req -new  -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">将生成的httpd.csr请求文件通过可靠的方式发给CA主机</span></span><br><span class="line">scp /etc/httpd/ssl/httpd.csr root@10.0.0.54:/tmp/</span><br></pre></td></tr></table></figure><p>在CA主机上签署证书</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在CA主机上查看请求主机发送的证书请求</span></span><br><span class="line">cat /tmp/httpd.csr</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">签署证书</span></span><br><span class="line">openssl ca -in /tmp/httpd.csr  -out  /etc/pki/CA/certs/httpd.crt  -days 365</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看证书信息</span></span><br><span class="line">openssl x509  -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">将签署完的证书发回请求主机</span></span><br><span class="line">scp /etc/pki/CA/certs/httpd.crt root@10.0.0.53:/etc/httpd/ssl</span><br></pre></td></tr></table></figure><p><strong>吊销证书</strong></p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">客户端获取要吊销证书的Serial（在使用证书的主机执行）</span></span><br><span class="line">openssl x509 -in /etc/pki/CA/certs/httpd.crt  -noout -serial  -subject</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">CA主机吊销证书 先根据客户提交Serial和subject信息，对比其与本机数据库index.txt中存储的是否一致</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">吊销 其中的SERIAL要换成证书真正的序列号</span></span><br><span class="line">openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.PEM</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成吊销证书的吊销编号（第一次吊销证书时执行）</span></span><br><span class="line">echo 01&gt;/etc/pki/CA/crlnumber</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">更新吊销证书列表</span></span><br><span class="line">openssl ca -gencrl -out thisca.crl</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看crl文件</span></span><br><span class="line">openssl crl -in /path/from/crl_file.crl -noout -text</span><br></pre></td></tr></table></figure><h1 id="OpenSSH"><a href="#OpenSSH" class="headerlink" title="OpenSSH"></a>OpenSSH</h1><h2 id="OpenSSH和OpenSSL的关系"><a href="#OpenSSH和OpenSSL的关系" class="headerlink" title="OpenSSH和OpenSSL的关系"></a>OpenSSH和OpenSSL的关系</h2><p>OpenSSH和OpenSSL并不是直系亲属，顶多算有共同志向的兄弟。</p><p>他们是由不同的团队开发，有不同目的，但都是开放源码，为安全通信提供支持。</p><ul><li>SSl是通讯链路的附加层，可以包含很多协议 https,ftps……</li><li>SSH只是加密的shell，最初是用来替代telnet的，通过port forward，也可以让其他协议通过ssh的隧道 起到加密的效果</li><li>OpenSSL：一个C语言函数库，是对SSL协议的实现</li><li>OpenSSH：是对SSH协议的实现</li><li>SSH利用OpenSSL提供的库。OpenSSH依赖于OpenSSL，没有OpenSSL的话OpenSSH就编译不过去，也运行不了</li></ul><h2 id="OpenSSH发展"><a href="#OpenSSH发展" class="headerlink" title="OpenSSH发展"></a>OpenSSH发展</h2><p>ssh：secure shell，Protocol 22&#x2F;tcp 安全的远程登录功能</p><p>openssh：ssh协议的开源实现</p><p>代替不安全的Telent telnet使用超级守恒进程xinet</p><p>SSH协议版本</p><p>V1 基于CRC-32做MAC（消息身份认证），不安全；man-in-middle</p><p>V2 双方主机协议选择安全的MAC方式</p><p>基于DH算法做密钥交换，基于RSA或DSA算法实现身份认证，两种方式的用户登录认证：</p><ul><li>基于password认证</li><li>基于key</li></ul><h2 id="OpenSSH架构"><a href="#OpenSSH架构" class="headerlink" title="OpenSSH架构"></a>OpenSSH架构</h2><p>C&#x2F;S架构</p><p>C：ssh，scp，sftp</p><p><strong>客户端组件</strong></p><p>ssh，配置文件：&#x2F;etc&#x2F;ssh&#x2F;ssh_config</p><p>StrictHostKeyChecking no 首次登录不显示检查提示</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">ssh [user@] host [COMMAND]</span><br><span class="line"></span><br><span class="line">-p 监听端口 cmd 远程执行命令</span><br><span class="line">-X [user@]host 支持x11的图形转发</span><br><span class="line">-Y 支持信任的x11转发</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">存放已授权基于key登录的主机的公钥</span></span><br><span class="line">~/.ssh/authorized_keys</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">存放本机SSH连接过的主机的公钥</span></span><br><span class="line">~/.ssh/know_hosts</span><br></pre></td></tr></table></figure><h3 id="两种方式的用户登录认证"><a href="#两种方式的用户登录认证" class="headerlink" title="两种方式的用户登录认证"></a><strong>两种方式的用户登录认证</strong></h3><h4 id="基于password"><a href="#基于password" class="headerlink" title="基于password"></a><strong>基于password</strong></h4><p>只要知道自己账号和口令就可以登录到远程主机。所有传输的数据都会被加密，但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器，也就是“中间人”这种方式的攻击。</p><p>大致流程：</p><ul><li>客户端发起ssh请求，服务器会把自己的公钥发送给用户</li><li>用户会根据服务器发来的公钥对密码进行加密</li><li>加密后的信息回传给服务器，服务器用自己的私钥解密，如果密码正确，则用户登录成功</li></ul><h4 id="基于key"><a href="#基于key" class="headerlink" title="基于key"></a><strong>基于key</strong></h4><p>需要依靠秘钥，也就是你必须为自己创建一对密钥，并把公钥放在需要访问的服务器上。如果要连接到SSH服务器，客户端软件就会向服务器发出请求，请求你的密钥进行安全验证。服务器收到请求后，现在服务器上你的目录下找寻你的公钥，然后把它和你发送过来的公钥进行比较。如果两个密钥一致，服务器就用公钥加密质询（challenge）并把它发送给客户端软件。客户端软件收到质询之后就用你的私钥解密再把它发送给服务器。</p><p>大致流程：</p><ul><li>在客户端生成一对密钥</li><li>并将客户端的公钥ssh-copy-id拷贝到服务器端对应用户的家目录下</li><li>当客户端再次发送一个连接请求，包括ip、用户名</li><li>服务端得到客户端的请求后，会到authorized_keys中查找，如果有相应的IP和用户，服务器就会发出质询，表现为一串随机字符，如：asfh</li><li>服务端将使用客户端拷贝过来的公钥对质询加密，然后发送给客户端</li><li>得到服务端发来质询后，客户端会使用私钥进行解密，然后将解密的字符串发送给服务端</li><li>服务端接收到客户端发来的字符串后，跟之前的字符串进对比，如果一致，就允许免密码登录</li></ul><h4 id="其他可以通过OpenSSH免密的工具"><a href="#其他可以通过OpenSSH免密的工具" class="headerlink" title="其他可以通过OpenSSH免密的工具"></a>其他可以通过OpenSSH免密的工具</h4><p><strong>scp</strong></p><p>常用选项：</p><p>-r：递归复制</p><p>-p：保持原文件的属性信息</p><p>-q：静默模式</p><p>-P：Port 指明远程主机监听端口</p><p><strong>sftp</strong></p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sftp root@10.0.0.53</span><br></pre></td></tr></table></figure><p><strong>服务端</strong> sshd 配置文件 &#x2F;etc&#x2F;ssh&#x2F;sshd_config &#x2F;etc&#x2F;ssh 密钥位置</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">常用参数：</span></span><br><span class="line">Port 22  # 不要监听在默认端口</span><br><span class="line">AddressFamily any  ipv4 or ipv6</span><br><span class="line">ListenAddress ip    # 只监听内网地址</span><br><span class="line">SyslogFacility      # 日志保存在 /var/log/secure</span><br><span class="line">PermitRootLogin yes  # 允许管理员登录</span><br><span class="line">MaxAuthTries 6       # 最大尝试次数</span><br><span class="line">MaxSessions 10       # 最大并行会话数</span><br><span class="line">AuthorizedKeyFile .ssh/authorized_key   # 服务器端公钥存放位置</span><br><span class="line">PasswordAuthentication yes # 允许口令登录</span><br><span class="line">X11Forward yes</span><br><span class="line">Subsystem  sftp  # 支持sftp远程连接</span><br><span class="line">UseDNS no        # 做DNS反向解析</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">限制可登录用户的办法</span></span><br><span class="line">AllowUsers</span><br><span class="line">AllowGroups</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">重启sshd服务 SElinux要关掉</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">CentOS6：</span></span><br><span class="line">service  sshd   restart </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">CentOS7：</span></span><br><span class="line">systemctl restart sshd.service</span><br></pre></td></tr></table></figure><h1 id="Centos7升级OpenSSH"><a href="#Centos7升级OpenSSH" class="headerlink" title="Centos7升级OpenSSH"></a>Centos7升级OpenSSH</h1><h2 id="制作openssh-8-9p1-rpm包"><a href="#制作openssh-8-9p1-rpm包" class="headerlink" title="制作openssh-8.9p1 rpm包"></a>制作openssh-8.9p1 rpm包</h2><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装编译依赖的组件</span></span><br><span class="line">yum install -y rpm-build gcc gcc-c++ glibc glibc-devel openssl-devel openssl prce pcre-devel zlib zlib-devel make wget krb5-devel pam-devel libX11-devel xmkmf libXt-devel initscripts libXt-devel imake gtk2-devel lrzsz</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">建立编译目录</span></span><br><span class="line">mkdir -pv /root/rpmbuild/&#123;BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS&#125;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">源码包下载到/root/rpmbuild/SOURCES</span></span><br><span class="line">cd /root/rpmbuild/SOURCES</span><br><span class="line">wget https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssh-8.9p1.tar.gz</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">解压spec编译文件</span></span><br><span class="line">tar -xf openssh-8.9p1.tar.gz openssh-8.9p1/contrib/redhat/openssh.spec</span><br><span class="line">mv openssh-8.9p1 /root/rpmbuild/SPECS</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">配置spec编译文件</span></span><br><span class="line">cd /root/rpmbuild/SPECS/openssh-8.9p1/contrib/redhat</span><br><span class="line">sed -i -e &quot;s/%global no_gnome_askpass 0/%global no_gnome_askpass 1/g&quot; openssh.spec</span><br><span class="line">sed -i -e &quot;s/%global no_x11_askpass 0/%global no_x11_askpass 1/g&quot; openssh.spec</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">解决openssl-devel &lt; 1.1报错</span></span><br><span class="line">sed -i &#x27;/openssl-devel &lt; 1.1/s/^/#/&#x27; openssh.spec</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">编译openssh源码 编译好的rpm包会在：/root/rpmbuild/RPMS/x86_64/</span></span><br><span class="line">rpmbuild -bb /root/rpmbuild/SPECS/openssh-8.9p1/contrib/redhat/openssh.spec</span><br></pre></td></tr></table></figure><h2 id="升级OpenSSH"><a href="#升级OpenSSH" class="headerlink" title="升级OpenSSH"></a>升级OpenSSH</h2><h3 id="安全备份"><a href="#安全备份" class="headerlink" title="安全备份"></a>安全备份</h3><p>为防止升级过程中升级失败，配置telnet协议 连接Linux</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">yum install -y telnet-server xinetd</span><br><span class="line">systemctl enable xinetd telnet.socket</span><br></pre></td></tr></table></figure><p>默认情况下，centos系统是不允许root用户通过telnet方式远程登录系统的。如果要使用root用户直接登录系统，需要添加以下配置</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">echo -e &#x27;pts/0\npts/1\npts/2\npts/3&#x27; &gt;&gt;/etc/securetty</span><br></pre></td></tr></table></figure><p>重启telnet服务</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">systemctl restart xinetd telnet.socket</span><br></pre></td></tr></table></figure><p>验证结果</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">telnet localhost</span><br></pre></td></tr></table></figure><h3 id="ssh备份"><a href="#ssh备份" class="headerlink" title="ssh备份"></a>ssh备份</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">mkdir /etc/sshconfig_backup</span><br><span class="line">cp /etc/ssh/sshd_config /etc/sshconfig_backup/</span><br><span class="line">cp /etc/pam.d/sshd /etc/sshconfig_backup/pam.d_sshd</span><br><span class="line">cp -a /root/.ssh /etc/sshconfig_backup</span><br></pre></td></tr></table></figure><h3 id="升级"><a href="#升级" class="headerlink" title="升级"></a>升级</h3><p>把准备好的rpm包上传到需要升级的服务器上</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">cd /root/rpmbuild/RPMS/x86_64</span><br><span class="line">rpm -Uvh openssh*.rpm</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">恢复之前的配置</span></span><br><span class="line">cp /etc/sshconfig_backup/sshd_config /etc/ssh/sshd_config </span><br><span class="line">cp /etc/sshconfig_backup/pam.d_sshd /etc/pam.d/sshd</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">允许root用户登录</span></span><br><span class="line">sed -i &quot;s/#PermitRootLogin yes/PermitRootLogin yes/g&quot; /etc/ssh/sshd_config</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">修改ssh_host*key的权限，因为之前openssh旧版本权限太宽松，新版本要求比较严格</span></span><br><span class="line">chmod 600 /etc/ssh/*</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">sshd_config 最后添加一行KexAlgorithms</span></span><br><span class="line">echo &quot;KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1&quot; &gt;&gt; /etc/ssh/sshd_config</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">重启ssh</span></span><br><span class="line">systemctl restart sshd</span><br></pre></td></tr></table></figure><h3 id="卸载并关闭telnet"><a href="#卸载并关闭telnet" class="headerlink" title="卸载并关闭telnet"></a>卸载并关闭telnet</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">yum remove -y telnet-server xinetd</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;OpenSSL&quot;&gt;&lt;a href=&quot;#OpenSSL&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="Linux" scheme="https://chensir.ink/categories/Linux/"/>
    
    
    <category term="OpenSSH" scheme="https://chensir.ink/tags/OpenSSH/"/>
    
  </entry>
  
  <entry>
    <title>轻量化日志中心 Grafana Loki</title>
    <link href="https://chensir.ink/2022/07/14/%E8%BD%BB%E9%87%8F%E5%8C%96%E6%97%A5%E5%BF%97%E4%B8%AD%E5%BF%83%20Grafana%20Loki/"/>
    <id>https://chensir.ink/2022/07/14/%E8%BD%BB%E9%87%8F%E5%8C%96%E6%97%A5%E5%BF%97%E4%B8%AD%E5%BF%83%20Grafana%20Loki/</id>
    <published>2022-07-13T19:41:55.000Z</published>
    <updated>2025-11-26T14:04:32.772Z</updated>
    
    <content type="html"><![CDATA[<h2 id="需要集中的日志系统的原因"><a href="#需要集中的日志系统的原因" class="headerlink" title="需要集中的日志系统的原因"></a>需要集中的日志系统的原因</h2><p>目前现状，每个服务生产上有三台，定位生产问题，需要连上一台机器，然后使用 cd &#x2F; tail &#x2F; less &#x2F; grep &#x2F; sed &#x2F; awk 等 linux命令去日志里查找故障原因。如果在这台机器没搜索到线索，就去另外两台机器上查日志。</p><p>但在分布式系统中，众多服务分散部署在数十台甚至上百台不同的服务器上，想要快速方便的实现查找、分析和归档等功能，使用Linux命令等传统的方式查询到想要的日志就费事费力，更不要说对日志进行分析与归纳了。</p><p>为解决大量日志归档，文件搜索慢，如何多维度查询就得需要集中化日志管理，将所有服务器上的日志收集汇总，常见的解决思路就是建立集中式日志收集系统。</p><h3 id="LPG"><a href="#LPG" class="headerlink" title="LPG"></a>LPG</h3><p><strong>Loki + Promtail + GRafana</strong></p><ul><li>Loki：聚合并存储日志数据，可以作为Grafana的数据源，为Grafana提供可视化数据</li><li>Promtail：日志收集器，有点像Filebeat，可以手机日志文件中的日志，并把收集到的数据推送到Loki。</li><li>Grafana：从Loki中获取日志信息，进行可视化展示</li></ul><p>Loki是 Grafana Labs 团队最新的开源项目，是一个水平可扩展，高可用，多租户的日志聚合系统。它的设计非常经济高效且易于操作，因为它不会为日志内容编制索引，而是为每个日志流编制一组标签，专门为 Prometheus和Kubernetes用户做了相关优化。</p><p>该项目受Prometheus启发，官方的介绍就是：Like Prometheus，But For Logs。类似Prometheus的日志系统。</p><h4 id="项目地址："><a href="#项目地址：" class="headerlink" title="项目地址："></a><strong>项目地址：</strong></h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">https://github.com/grafana/loki/</span><br></pre></td></tr></table></figure><p><strong>与其他日志聚合系统相比，Loki具有以下特性：</strong></p><ul><li>不对日志进行全文索引。通过存储压缩非结构化日志和仅索引元数据，Loki操作起来会更简单，更省成本</li><li>通过使用与Prometheus相同的标签记录流对日志进行索引和分组，这使得日志的扩展和操作效率更高，能对接 alertmanager</li><li>特别适合存储Kubernetes Pod日志；诸如Pod标签之类的元数据会被自动删除和编入索引</li><li>受Grafana原生支持，避免Kibana和grafana来回切换</li></ul><h5 id="日志收集流程图"><a href="#日志收集流程图" class="headerlink" title="日志收集流程图"></a><strong>日志收集流程图</strong></h5><p><img src="https://img.chensir.ink/chensir-pics/202207131205911.png"></p><h4 id="架构说明"><a href="#架构说明" class="headerlink" title="架构说明"></a><strong>架构说明</strong></h4><p><img src="https://img.chensir.ink/chensir-pics/202207150911442.svg" alt="loki_architecture_components"></p><h4 id="部署"><a href="#部署" class="headerlink" title="部署"></a>部署</h4><h5 id="安装-docker"><a href="#安装-docker" class="headerlink" title="安装 docker"></a>安装 docker</h5><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装依赖</span></span><br><span class="line">sudo yum install -y yum-utils device-mapper-persistent-data lvm2</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">添加源</span></span><br><span class="line">sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">更新</span></span><br><span class="line">sudo yum makecache fast</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装docker-ce</span></span><br><span class="line">sudo yum -y install docker-ce</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建配置文件目录</span></span><br><span class="line">sudo mkdir -p /etc/docker</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建配置文件</span></span><br><span class="line">touch /etc/docker/daemon.json</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">新增配置文件内容 /mitr/middleware/docker目录已创建</span></span><br><span class="line">cat &lt;&lt;EOF | sudo tee /etc/docker/daemon.json</span><br><span class="line">&#123;</span><br><span class="line">&quot;registry-mirrors&quot;:[&quot;https://docker.mirrors.ustc.edu.cn&quot;],</span><br><span class="line">&quot;data-root&quot;: &quot;/mitr/middleware/docker&quot;</span><br><span class="line">&#125;</span><br><span class="line">EOF</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">加载启动并设置开机自启</span></span><br><span class="line">systemctl daemon-reload &amp;&amp; systemctl enable docker &amp;&amp; systemctl start docker</span><br></pre></td></tr></table></figure><h5 id="安装grafana"><a href="#安装grafana" class="headerlink" title="安装grafana"></a>安装grafana</h5><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">拉取镜像</span></span><br><span class="line">docker pull grafana/grafana</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建镜像并启动grafana 初始密码 admin/admin</span></span><br><span class="line">docker run --name=grafana -id -p 3000:3000 grafana/grafana</span><br></pre></td></tr></table></figure><h5 id="安装Promtail"><a href="#安装Promtail" class="headerlink" title="安装Promtail"></a>安装Promtail</h5><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">拉取镜像</span></span><br><span class="line">docker pull grafana/promtail</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建配置文件目录</span></span><br><span class="line">mkdir -p /etc/promtail</span><br><span class="line"></span><br><span class="line">cat &lt;&lt;EOF |sudo tee /etc/promtail/promtail-config.yaml</span><br><span class="line">server:</span><br><span class="line">  http_listen_port: 9080</span><br><span class="line">  grpc_listen_port: 0</span><br><span class="line"></span><br><span class="line">positions:</span><br><span class="line">  filename: /tmp/positions.yaml</span><br><span class="line"></span><br><span class="line">clients:</span><br><span class="line">  - url: http://10.0.0.58:3100/loki/api/v1/push</span><br><span class="line"></span><br><span class="line">scrape_configs:</span><br><span class="line">- job_name: system</span><br><span class="line">  static_configs:</span><br><span class="line">  - targets:</span><br><span class="line">      - localhost</span><br><span class="line">    labels:</span><br><span class="line">      job: varlogs</span><br><span class="line">      host: localhost</span><br><span class="line">      __path__: /var/log/*</span><br><span class="line">EOF</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建并启动容器</span></span><br><span class="line">docker run -di --name=promtail -v /etc/promtail/promtail-config.yaml:/etc/promtail/config.yml -v /var/log:/var/log -p 9080:9080 grafana/promtail</span><br></pre></td></tr></table></figure><h5 id="安装Loki"><a href="#安装Loki" class="headerlink" title="安装Loki"></a>安装Loki</h5><p><a href="https://grafana.com/docs/loki/latest/configuration/">Loki配置文件参考</a></p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">拉取镜像</span></span><br><span class="line">docker pull grafana/loki</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建配置文件目录</span></span><br><span class="line">mkdir -p /etc/loki</span><br><span class="line"></span><br><span class="line">cat &lt;&lt;EOF |sudo tee /etc/loki/local-config.yaml</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">认证配置</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">通过X-Scope-OrgID头启用身份验证，该头必须存在</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">如果情况属实。如果为假，则OrgID将始终设置为<span class="string">&quot;fake&quot;</span></span></span><br><span class="line">auth_enabled: false</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">端口配置</span></span><br><span class="line">server:</span><br><span class="line">  http_listen_port: 3100</span><br><span class="line"></span><br><span class="line">ingester:</span><br><span class="line"><span class="meta prompt_">  # </span><span class="language-bash">WAL(Write Ahead Log)记录传入的日志，并将他们存储在本地文件系统，在进程雪崩的情况下，保证已确认数据的持久性。</span></span><br><span class="line">  wal:</span><br><span class="line">    enabled: true</span><br><span class="line">    dir: /loki/wal</span><br><span class="line">  </span><br><span class="line"><span class="meta prompt_">  # </span><span class="language-bash">生命周期配置</span></span><br><span class="line">  lifecycler:</span><br><span class="line">    address: 127.0.0.1</span><br><span class="line">    ring:</span><br><span class="line">      kvstore:</span><br><span class="line">        # Backend storage to use for the ring. Supported values are: consul, etcd,</span><br><span class="line">        # inmemory, memberlist</span><br><span class="line">        # CLI flag: -ring.store</span><br><span class="line">        store: inmemory</span><br><span class="line"></span><br><span class="line">      # The number of ingesters to write to and read from </span><br><span class="line">      # default = 3</span><br><span class="line">      replication_factor: 1</span><br><span class="line">    # 在退出以确保指标被抓取之前休眠的持续时间 default = 30s  </span><br><span class="line">    final_sleep: 0s</span><br><span class="line">  chunk_idle_period: 1h       # Any chunk not receiving new logs in this time will be flushed</span><br><span class="line">  max_chunk_age: 1h           # All chunks will be flushed when they hit this age, default is 1h</span><br><span class="line">  chunk_target_size: 1048576  # Loki will attempt to build chunks up to 1.5MB, flushing first if chunk_idle_period or max_chunk_age is reached first</span><br><span class="line">  chunk_retain_period: 30s    # Must be greater than index read cache TTL if using an index cache (Default index read cache TTL is 5m)</span><br><span class="line">  max_transfer_retries: 0     # Chunk transfers disabled</span><br><span class="line"></span><br><span class="line">schema_config:</span><br><span class="line">  configs:</span><br><span class="line">    - from: 2020-10-24</span><br><span class="line">      store: boltdb-shipper</span><br><span class="line">      object_store: filesystem</span><br><span class="line">      schema: v11</span><br><span class="line">      index:</span><br><span class="line">        prefix: index_</span><br><span class="line">        period: 24h</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">配置Loki存储数据的位置</span></span><br><span class="line">storage_config:</span><br><span class="line">  boltdb_shipper:</span><br><span class="line">    active_index_directory: /loki/boltdb-shipper-active</span><br><span class="line">    cache_location: /loki/boltdb-shipper-cache</span><br><span class="line">    cache_ttl: 24h         # Can be increased for faster performance over longer query periods, uses more disk space</span><br><span class="line">    shared_store: filesystem</span><br><span class="line">  filesystem:</span><br><span class="line">    directory: /loki/chunks</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">压缩块配置压缩器组件，该组件压缩索引碎片以提高性能</span></span><br><span class="line">compactor:</span><br><span class="line">  working_directory: /loki/boltdb-shipper-compactor</span><br><span class="line">  shared_store: filesystem</span><br><span class="line"></span><br><span class="line">limits_config:</span><br><span class="line">  reject_old_samples: true</span><br><span class="line"><span class="meta prompt_">  # </span><span class="language-bash">Maximum accepted sample age before rejecting</span></span><br><span class="line">  reject_old_samples_max_age: 168h</span><br><span class="line"></span><br><span class="line">chunk_store_config:</span><br><span class="line"><span class="meta prompt_">  # </span><span class="language-bash">向后查找日志行所需的最大时间。仅适用于即时日志查询 default = 30s</span></span><br><span class="line">  max_look_back_period: 0s</span><br><span class="line"></span><br><span class="line">table_manager:</span><br><span class="line">  retention_deletes_enabled: true</span><br><span class="line">  retention_period: 360h</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">ruler:</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">  storage:</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">    <span class="built_in">type</span>: <span class="built_in">local</span></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">    <span class="built_in">local</span>:</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">      directory: /loki/rules</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">  rule_path: /loki/rules-temp</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">  alertmanager_url: http://localhost:9093</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">  ring:</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">    kvstore:</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">      store: inmemory</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">  enable_api: <span class="literal">true</span></span>  </span><br><span class="line">EOF</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建并启动容器</span></span><br><span class="line">docker run -di --name=loki -v loki-data:/loki -v /etc/loki/local-config.yaml:/etc/loki/local-config.yaml -p 3100:3100 grafana/loki</span><br></pre></td></tr></table></figure><h5 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h5><p>Grafana配置Loki数据源</p><p>如下图：</p><p><img src="https://img.chensir.ink/chensir-pics/202207141656735.png"></p><p>源地址配置 <a href="http://10.0.0.74:3100/">http://10.0.0.74:3100</a> 即可 保存</p><p><img src="https://img.chensir.ink/chensir-pics/202207141657643.png"></p><p>保存之后，切换到grafana左侧区域的Explore，即可进入到Loki页面</p><p><img src="https://img.chensir.ink/chensir-pics/202207141658942.png"></p><p>然后点击Log browser 就可以把当前系统采集的日志标签显示出来，再根据这些标签进行日志的过滤查询即可，比如这里选择 &#x2F;var&#x2F;log&#x2F;message，10.0.0.74，就会把该文件下面的日志过滤展示出来</p><p><img src="https://img.chensir.ink/chensir-pics/202207141702931.png"></p><p><img src="https://img.chensir.ink/chensir-pics/202207141703249.png"></p><p>这里展示的是Promtail容器里面的 &#x2F;var&#x2F;log 目录中的日志</p><p>Promtail容器  &#x2F;etc&#x2F;promtail&#x2F;config.yml</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">server:</span></span><br><span class="line">  <span class="attr">http_listen_port:</span> <span class="number">9080</span></span><br><span class="line">  <span class="attr">grpc_listen_port:</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line"><span class="attr">positions:</span></span><br><span class="line">  <span class="attr">filename:</span> <span class="string">/tmp/positions.yaml</span></span><br><span class="line"></span><br><span class="line"><span class="attr">clients:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">url:</span> <span class="string">http://loki:3100/loki/api/v1/push</span></span><br><span class="line"></span><br><span class="line"><span class="attr">scrape_configs:</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">job_name:</span> <span class="string">system</span></span><br><span class="line">  <span class="attr">static_configs:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">targets:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">localhost</span></span><br><span class="line">    <span class="attr">labels:</span></span><br><span class="line">      <span class="attr">job:</span> <span class="string">varlogs</span></span><br><span class="line">      <span class="attr">__path__:</span> <span class="string">/var/log/*log</span></span><br></pre></td></tr></table></figure><p>这里的 job 就是varlog，文件路径就是 &#x2F;var&#x2F;log&#x2F;*log</p><p><strong>只索引标签</strong>：之前多次看到Loki和ES最大的不同是Loki只对标签进行索引而不对内容索引。</p><p><strong>静态标签匹配模式</strong></p><p>以简单的Promtail配置举例</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">scrape_configs:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">job_name:</span> <span class="string">system</span></span><br><span class="line">   <span class="attr">pipeline_stages:</span></span><br><span class="line">   <span class="attr">static_configs:</span></span><br><span class="line">   <span class="bullet">-</span> <span class="attr">targets:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">localhost</span></span><br><span class="line">     <span class="attr">labels:</span></span><br><span class="line">      <span class="attr">job:</span> <span class="string">message</span></span><br><span class="line">      <span class="attr">__path__:</span> <span class="string">/var/log/messages</span></span><br></pre></td></tr></table></figure><p>解读：</p><ul><li>上面这段配置代表启动一个日志采集任务</li><li>这个任务有一个固定标签 job: message</li><li>采集日志路径为 &#x2F;var&#x2F;log&#x2F;messages，会以一个名为filename的固定标签</li><li>在Promtail的web页面上可以看到类似Promtail的target信息页面</li></ul><p>可以和使用Prometheus一样的标签匹配语句进行查询  {job&#x3D;”message”}</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">scrape_configs:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">job_name:</span> <span class="string">system</span></span><br><span class="line">   <span class="attr">pipeline_stages:</span></span><br><span class="line">   <span class="attr">static_configs:</span></span><br><span class="line">   <span class="bullet">-</span> <span class="attr">targets:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">localhost</span></span><br><span class="line">     <span class="attr">labels:</span></span><br><span class="line">      <span class="attr">job:</span> <span class="string">syslog</span></span><br><span class="line">      <span class="attr">__path__:</span> <span class="string">/var/log/syslog</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">job_name:</span> <span class="string">system</span></span><br><span class="line">   <span class="attr">pipeline_stages:</span></span><br><span class="line">   <span class="attr">static_configs:</span></span><br><span class="line">   <span class="bullet">-</span> <span class="attr">targets:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">localhost</span></span><br><span class="line">     <span class="attr">labels:</span></span><br><span class="line">      <span class="attr">job:</span> <span class="string">apache</span></span><br><span class="line">      <span class="attr">__path__:</span> <span class="string">/var/log/apache.log</span></span><br></pre></td></tr></table></figure><p>如果我们配置了两个job，则可以使用 {job&#x3D;~”message|varlogs”} 进行多job匹配；同时也支持正则匹配</p><p><strong>标签匹配模式特点</strong></p><ul><li>和Prometheus一致，相同标签对应的是一个流Prometheus处理series的模式</li><li>Prometheus中标签一致对应的同一个hash值和refid（正整数递增的id），也就是同一个series</li><li>时序数据不断的append追加到这个memseries中</li><li>当有人以标签发生变化时会产生新的hash值和refid，对应新的series</li></ul><p>Loki处理日志的模式和Prometheus一致，loki一组标签值会生成一个stream。日志随着时间的递增会追加到这个stream中，最后压缩为chunk。当有人以标签发生变化时会产生新的hash值，对应新的stream</p><p><strong>查询过程</strong>：</p><ul><li>loki现根据标签算出hash值在倒排索引中找到对应的chunk</li><li>然后再根据查询语句中的关键词等进行过滤，这样可以提速</li><li>因为这种根据标签算哈希在倒排中查找id，对应找到存储的块在Prometheus中已经被验证过了</li><li>属于第开销 速度快</li></ul><p><strong>动态标签和高基数</strong></p><ul><li><p>动态标签：标签的value不固定</p></li><li><p>高基数标签：标签的value可能性太多了，达到10万，100万甚至更多</p></li></ul><p>比如Apache的access日志</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">11.11.11.11 - frank [25/Jan/2000:14:00:01 -0500] &quot;GET /1986.js HTTP/1.1&quot; 200 932 &quot;-&quot; &quot;Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6&quot;</span><br></pre></td></tr></table></figure><p>在Promtail中使用regex想要匹配action和status_code两个标签：</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">scrape_configs:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">job_name:</span> <span class="string">system</span></span><br><span class="line">   <span class="attr">pipeline_stages:</span></span><br><span class="line">   <span class="attr">static_configs:</span></span><br><span class="line">   <span class="bullet">-</span> <span class="attr">targets:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">localhost</span></span><br><span class="line">     <span class="attr">labels:</span></span><br><span class="line">      <span class="attr">job:</span> <span class="string">syslog</span></span><br><span class="line">      <span class="attr">__path__:</span> <span class="string">/var/log/syslog</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">job_name:</span> <span class="string">system</span></span><br><span class="line">   <span class="attr">pipeline_stages:</span></span><br><span class="line">   <span class="attr">static_configs:</span></span><br><span class="line">   <span class="bullet">-</span> <span class="attr">targets:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">localhost</span></span><br><span class="line">     <span class="attr">labels:</span></span><br><span class="line">      <span class="attr">job:</span> <span class="string">apache</span></span><br><span class="line">      <span class="attr">__path__:</span> <span class="string">/var/log/apache.log</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">job_name:</span> <span class="string">system</span></span><br><span class="line">    <span class="attr">pipeline_stages:</span></span><br><span class="line">       <span class="bullet">-</span> <span class="attr">regex:</span></span><br><span class="line">         <span class="attr">expression:</span> <span class="string">&quot;^(?P&lt;ip&gt;\\S+) (?P&lt;identd&gt;\\S+) (?P&lt;user&gt;\\S+) \\[(?P&lt;timestamp&gt;[\\w:/]+\\s[+\\-]\\d&#123;4&#125;)\\] \&quot;(?P&lt;action&gt;\\S+)\\s?(?P&lt;path&gt;\\S+)?\\s?(?P&lt;protocol&gt;\\S+)?\&quot; (?P&lt;status_code&gt;\\d&#123;3&#125;|-) (?P&lt;size&gt;\\d+|-)\\s?\&quot;?(?P&lt;referer&gt;[^\&quot;]*)\&quot;?\\s?\&quot;?(?P&lt;useragent&gt;[^\&quot;]*)?\&quot;?$&quot;</span></span><br><span class="line">     <span class="bullet">-</span> <span class="attr">labels:</span></span><br><span class="line">         <span class="attr">action:</span></span><br><span class="line">         <span class="attr">status_code:</span></span><br><span class="line">    <span class="attr">static_configs:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">targets:</span></span><br><span class="line">       <span class="bullet">-</span> <span class="string">localhost</span></span><br><span class="line">      <span class="attr">labels:</span></span><br><span class="line">       <span class="attr">job:</span> <span class="string">apache</span></span><br><span class="line">       <span class="attr">env:</span> <span class="string">dev</span></span><br><span class="line">       <span class="attr">__path__:</span> <span class="string">/var/log/apache.log</span></span><br></pre></td></tr></table></figure><p>那么对应action&#x3D;get&#x2F;post 和 status_code&#x3D;200&#x2F;400 则对应4个流：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">11.11.11.11 - frank [25/Jan/2000:14:00:01 -0500] &quot;GET /1986.js HTTP/1.1&quot; 200 932 &quot;-&quot; &quot;Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6&quot;</span><br><span class="line">11.11.11.12 - frank [25/Jan/2000:14:00:02 -0500] &quot;POST /1986.js HTTP/1.1&quot; 200 932 &quot;-&quot; &quot;Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6&quot;</span><br><span class="line">11.11.11.13 - frank [25/Jan/2000:14:00:03 -0500] &quot;GET /1986.js HTTP/1.1&quot; 400 932 &quot;-&quot; &quot;Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6&quot;</span><br><span class="line">11.11.11.14 - frank [25/Jan/2000:14:00:04 -0500] &quot;POST /1986.js HTTP/1.1&quot; 400 932 &quot;-&quot; &quot;Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6&quot;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>那四个日志行将变成4个单独的流，并开始填充4个单独的块，如果出现另一个独特的标签组合（如 status_code&#x3D;500）,则会创建另一个新流。</p><p>高基数问题：就像上面，如果给ip设置一个标签，来自用户的每个不同的ip请求不仅成为唯一的流。可以快速生成成千上万的流，这是高基数，这样可以杀死Loki</p><p>如果字段没有被当做标签被索引，会不会查询很慢，Loki的能力是将查询分解为小块并行分发，以便可以在短时间内查询大量日志数据</p><p><strong>全文索引问题</strong></p><p>大索引既复杂又昂贵。通常日志数据的全文索引的大小等于或大于日志数据本身的大小。</p><p>要查询日志数据，需要加载此索引，并且为了提高性能，它可能在内存中。这很难扩展，并随着日志增多，索引会迅速变大。</p><p>Loki的索引通常比摄取的日志量小一个数量级，索引的增长非常缓慢。</p><p>加速查询没标签字段：以👆提到的ip字段为例，使用过滤器表达式查询</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">&#123;job=&quot;apache&quot;&#125;|=&quot;11.11.11.11&quot;</span><br></pre></td></tr></table></figure><p><strong>loki查询时的分片（按时间范围分段 grep）</strong></p><ul><li>Loki把查询分解成较小的分片，并且与标签匹配的流打开每个区块，并开始寻找IP地址</li><li>这些分片的大小和并行化的数量是可以配置的，并取决于提供的资源</li><li>如果需要，可以将分片间隔配置文件5min，部署20个查询器，并在几秒钟内处理千兆字节的日志</li><li>或者，可以设置200个查询器并处理TB的日志</li></ul><p><strong>两种索引模式对比</strong></p><ul><li>es的大索引，不管你查不查询，它都必须时刻存在。比如长时间占用过多的内存</li><li>loki的逻辑是查询时在启动多个分段并行查询</li></ul><p><strong>日志量少时少加标签</strong></p><ul><li>因为每多加载一个chunk就有额外的开销</li><li>举例，如果查询是 {app&#x3D;“loki”,level!&#x3D;“bug”}</li><li>在没加level标签的情况下只需要加载一个chunk 即app&#x3D;“loki”的标签</li><li>如果加了level的情况，则需要把level&#x3D;info,warn,error,critical 5个chunk都加载再查询</li></ul><p><strong>需要标签是再去添加</strong></p><ul><li>当chunk_target_size&#x3D;1M时 以1M的压缩大小来切割块</li><li>对应原始日志大小在5M—10M，如果日志在max_chunk_age时间内能达到10M，考虑添加标签</li></ul><p><strong>日志应当按时间递增</strong></p><ul><li>这个问题和tsdb中处理旧数据是一样的道理</li><li>目前loki为了性能考虑直接拒绝掉旧数据</li></ul><h4 id="对接Prometheus监控"><a href="#对接Prometheus监控" class="headerlink" title="对接Prometheus监控"></a>对接Prometheus监控</h4><p>修改 prometheus.yml</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">scrape_configs:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">job_name:</span> <span class="string">&#x27;Loki&#x27;</span></span><br><span class="line">      <span class="attr">static_configs:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">targets:</span> [<span class="string">&quot;10.0.0.74:3100&quot;</span>]</span><br></pre></td></tr></table></figure><p>然后加载Prometheus即可</p><h4 id="Grafana-dashboard"><a href="#Grafana-dashboard" class="headerlink" title="Grafana dashboard"></a>Grafana dashboard</h4><p>安装插件 </p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">grafana-cli plugins install grafana-piechart-panel</span><br></pre></td></tr></table></figure><p>dashboard效果图</p><p><img src="https://img.chensir.ink/chensir-pics/202207181555502.png"></p><p>import Dashboard Json</p><figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;annotations&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;list&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:7&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;builtIn&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;-- Grafana --&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;enable&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;hide&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;iconColor&quot;</span><span class="punctuation">:</span> <span class="string">&quot;rgba(0, 211, 255, 1)&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Annotations &amp; Alerts&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;target&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;limit&quot;</span><span class="punctuation">:</span> <span class="number">100</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;matchAny&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;tags&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;dashboard&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;dashboard&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;description&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Loki metrics via 2.0&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;editable&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;gnetId&quot;</span><span class="punctuation">:</span> <span class="number">13407</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;graphTooltip&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">28</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;links&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;panels&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;description&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">24</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">21</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;content&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&lt;div class=\&quot;left dashboard-header\&quot;&gt;\n   &lt;img src=\&quot;https://marketplace-assets.digitalocean.com/logos/loki-logo.svg\&quot; style=\&quot;height:29px;\&quot;/&gt;\n  &lt;span&gt;Loki Global Metrics&lt;/span&gt;\n&lt;/div&gt;&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;html&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;loki_build_info&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;table&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;instant&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;transparent&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;text&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fieldConfig&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;defaults&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;decimals&quot;</span><span class="punctuation">:</span> <span class="number">4</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;links&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;mappings&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;absolute&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;steps&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">              <span class="punctuation">&#123;</span></span><br><span class="line">                <span class="attr">&quot;color&quot;</span><span class="punctuation">:</span> <span class="string">&quot;green&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="attr">&quot;value&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">              <span class="punctuation">&#125;</span></span><br><span class="line">            <span class="punctuation">]</span></span><br><span class="line">          <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;unit&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;overrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">2</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">59</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;colorMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;background&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;graphMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;none&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;justifyMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;center&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;orientation&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;reduceOptions&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;calcs&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">            <span class="string">&quot;last&quot;</span></span><br><span class="line">          <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;fields&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/^version$/&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;text&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;textMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;loki_build_info&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;table&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;instant&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Loki Version&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;stat&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fieldConfig&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;defaults&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;decimals&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;links&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;mappings&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;absolute&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;steps&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">              <span class="punctuation">&#123;</span></span><br><span class="line">                <span class="attr">&quot;color&quot;</span><span class="punctuation">:</span> <span class="string">&quot;green&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="attr">&quot;value&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">              <span class="punctuation">&#125;</span></span><br><span class="line">            <span class="punctuation">]</span></span><br><span class="line">          <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;unit&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;overrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">2</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;colorMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;value&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;graphMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;none&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;justifyMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;center&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;orientation&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;reduceOptions&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;calcs&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">            <span class="string">&quot;last&quot;</span></span><br><span class="line">          <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;fields&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;text&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;textMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sum(log_messages_total)&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;instant&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Message Total&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;stat&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fieldConfig&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;defaults&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;decimals&quot;</span><span class="punctuation">:</span> <span class="number">4</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;links&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;mappings&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;absolute&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;steps&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">              <span class="punctuation">&#123;</span></span><br><span class="line">                <span class="attr">&quot;color&quot;</span><span class="punctuation">:</span> <span class="string">&quot;green&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="attr">&quot;value&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">              <span class="punctuation">&#125;</span></span><br><span class="line">            <span class="punctuation">]</span></span><br><span class="line">          <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;unit&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;overrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">4</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">12</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">2</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">23</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;colorMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;value&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;graphMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;area&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;justifyMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;orientation&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;reduceOptions&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;calcs&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">            <span class="string">&quot;mean&quot;</span></span><br><span class="line">          <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;fields&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;text&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;textMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sum(loki_store_series_total)&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;instant&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Store Series Total&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;stat&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fieldConfig&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;defaults&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;decimals&quot;</span><span class="punctuation">:</span> <span class="number">4</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;links&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;mappings&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;absolute&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;steps&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">              <span class="punctuation">&#123;</span></span><br><span class="line">                <span class="attr">&quot;color&quot;</span><span class="punctuation">:</span> <span class="string">&quot;green&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="attr">&quot;value&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">              <span class="punctuation">&#125;</span></span><br><span class="line">            <span class="punctuation">]</span></span><br><span class="line">          <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;unit&quot;</span><span class="punctuation">:</span> <span class="string">&quot;bytes&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;overrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">5</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">16</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">2</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">41</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;colorMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;value&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;graphMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;none&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;justifyMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;orientation&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;reduceOptions&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;calcs&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">            <span class="string">&quot;mean&quot;</span></span><br><span class="line">          <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;fields&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;text&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;textMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sum(loki_ingester_chunk_stored_bytes_total)&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;instant&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Store Chunks Total&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;stat&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fieldConfig&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;defaults&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;decimals&quot;</span><span class="punctuation">:</span> <span class="number">4</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;links&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;mappings&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;absolute&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;steps&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">              <span class="punctuation">&#123;</span></span><br><span class="line">                <span class="attr">&quot;color&quot;</span><span class="punctuation">:</span> <span class="string">&quot;green&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="attr">&quot;value&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">              <span class="punctuation">&#125;</span></span><br><span class="line">            <span class="punctuation">]</span></span><br><span class="line">          <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;unit&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;overrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">21</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">2</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">24</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;colorMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;value&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;graphMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;none&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;justifyMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;center&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;orientation&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;reduceOptions&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;calcs&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">            <span class="string">&quot;last&quot;</span></span><br><span class="line">          <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;fields&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;text&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;textMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;loki_panic_total&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;instant&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Panic &quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;stat&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;aliasColors&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;bars&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashes&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fieldConfig&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;defaults&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;links&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;overrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fill&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fillGradient&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">12</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">5</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hiddenSeries&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">11</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;legend&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alignAsTable&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;avg&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;current&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;rightSide&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="string">&quot;current&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sortDesc&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;total&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;lines&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;linewidth&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;nullPointMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;null as zero&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alertThreshold&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;percentage&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pointradius&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;points&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;renderer&quot;</span><span class="punctuation">:</span> <span class="string">&quot;flot&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;seriesOverrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;spaceLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;stack&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;steppedLine&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;histogram_quantile(0.95, sum(rate(loki_request_duration_seconds_bucket[5m])) by (le,route))&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&#123;&#123; route &#125;&#125;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeRegions&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;API Request Durations&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tooltip&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;shared&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;value_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;individual&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;graph&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;xaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;buckets&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;time&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxes&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:155&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;s&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:156&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;align&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alignLevel&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;aliasColors&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;bars&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashes&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fieldConfig&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;defaults&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;links&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;overrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fill&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fillGradient&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">12</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">12</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">5</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hiddenSeries&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">12</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;legend&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alignAsTable&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;avg&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;current&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;rightSide&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="string">&quot;current&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sortDesc&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;total&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;lines&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;linewidth&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;nullPointMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;null as zero&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alertThreshold&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;percentage&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pointradius&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;points&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;renderer&quot;</span><span class="punctuation">:</span> <span class="string">&quot;flot&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;seriesOverrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;spaceLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;stack&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;steppedLine&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;histogram_quantile(0.95, sum(rate(loki_logql_querystats_latency_seconds_bucket[5m])) by (le,type))&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&#123;&#123; type &#125;&#125;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeRegions&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;LogQL Latency&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tooltip&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;shared&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;value_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;individual&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;graph&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;xaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;buckets&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;time&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxes&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:155&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;s&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:156&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;align&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alignLevel&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;aliasColors&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;bars&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashes&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fieldConfig&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;defaults&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;links&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;overrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fill&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fillGradient&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">7</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">24</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">11</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hiddenSeries&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">13</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;legend&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alignAsTable&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;avg&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;current&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;rightSide&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="string">&quot;current&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sortDesc&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;total&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;lines&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;linewidth&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;nullPointMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;null as zero&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alertThreshold&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;percentage&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pointradius&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;points&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;renderer&quot;</span><span class="punctuation">:</span> <span class="string">&quot;flot&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;seriesOverrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;spaceLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;stack&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;steppedLine&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;histogram_quantile(0.95, sum(rate(loki_logql_querystats_bytes_processed_per_seconds_bucket[5m])) by (le,type))&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&#123;&#123; type &#125;&#125;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeRegions&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;LogQL  Processed bytes&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tooltip&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;shared&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;value_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;individual&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;graph&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;xaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;buckets&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;time&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxes&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:155&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Bps&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:156&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;align&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alignLevel&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;collapsed&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">24</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">18</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">19</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;panels&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Distributor&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;row&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;aliasColors&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;bars&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashes&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fill&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fillGradient&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">19</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hiddenSeries&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">20</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;legend&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;avg&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;current&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;total&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;lines&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;linewidth&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;nullPointMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;null&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alertThreshold&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;percentage&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pointradius&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;points&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;renderer&quot;</span><span class="punctuation">:</span> <span class="string">&quot;flot&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;seriesOverrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;spaceLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;stack&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;steppedLine&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sum by (tenant) (rate(loki_distributor_lines_received_total[5m]))&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;distributor / &#123;&#123; tenant&#125;&#125;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeRegions&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Received Lines / sec&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tooltip&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;shared&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;value_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;individual&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;graph&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;xaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;buckets&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;time&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxes&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:1092&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:1093&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;align&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alignLevel&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;aliasColors&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;bars&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashes&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fill&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fillGradient&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">19</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hiddenSeries&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">15</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;legend&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;avg&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;current&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;total&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;lines&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;linewidth&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;nullPointMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;null&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alertThreshold&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;percentage&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pointradius&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;points&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;renderer&quot;</span><span class="punctuation">:</span> <span class="string">&quot;flot&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;seriesOverrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;spaceLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;stack&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;steppedLine&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sum(rate(loki_distributor_bytes_received_total[5m])) by (tenant)&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;distributor / &#123;&#123;tenant&#125;&#125;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeRegions&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Distributor  Received bytes / sec&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tooltip&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;shared&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;value_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;individual&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;graph&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;xaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;buckets&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;time&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxes&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:837&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Bps&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:838&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;align&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alignLevel&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;aliasColors&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;bars&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashes&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fill&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fillGradient&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">12</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">19</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hiddenSeries&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">17</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;legend&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;avg&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;current&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;total&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;lines&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;linewidth&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;nullPointMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;null&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alertThreshold&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;percentage&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pointradius&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;points&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;renderer&quot;</span><span class="punctuation">:</span> <span class="string">&quot;flot&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;seriesOverrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;spaceLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;stack&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;steppedLine&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;rate(loki_distributor_ingester_appends_total[5m])&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;successed&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;loki_distributor_ingester_append_failures_total&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;failed&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;B&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeRegions&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;batch appends sent to ingesters / sec&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tooltip&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;shared&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;value_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;individual&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;graph&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;xaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;buckets&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;time&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxes&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:1092&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:1093&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;align&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alignLevel&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;aliasColors&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;bars&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashes&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fieldConfig&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;defaults&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;links&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;unit&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;overrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fill&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fillGradient&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">18</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">19</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hiddenSeries&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">22</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;legend&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;avg&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;current&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;total&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;lines&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;linewidth&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;nullPointMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;null&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alertThreshold&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;percentage&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pointradius&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;points&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;renderer&quot;</span><span class="punctuation">:</span> <span class="string">&quot;flot&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;seriesOverrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;spaceLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;stack&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;steppedLine&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sum by (status) (rate(loki_store_series_total[5m]))&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;instant&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&#123;&#123;status&#125;&#125;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeRegions&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Store Series / sec&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tooltip&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;shared&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;value_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;individual&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;graph&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;xaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;buckets&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;time&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxes&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:88&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:89&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;align&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alignLevel&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;collapsed&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">24</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">25</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">66</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;panels&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Ingster&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;row&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;aliasColors&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;bars&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashes&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fieldConfig&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;defaults&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;links&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;overrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fill&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fillGradient&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">8</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">26</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hiddenSeries&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">71</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;legend&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alignAsTable&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;avg&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;current&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;rightSide&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="string">&quot;current&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sortDesc&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;total&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;lines&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;linewidth&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;nullPointMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;null as zero&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alertThreshold&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;percentage&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pointradius&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;points&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;renderer&quot;</span><span class="punctuation">:</span> <span class="string">&quot;flot&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;seriesOverrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;spaceLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;stack&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;steppedLine&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;histogram_quantile(0.95, sum(rate(loki_ingester_blocks_per_chunk_bucket[5m])) by (le))&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;blocks&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeRegions&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Blocks / Chunk&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tooltip&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;shared&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;value_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;individual&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;graph&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;xaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;buckets&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;time&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxes&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:155&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;none&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:156&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;align&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alignLevel&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;aliasColors&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;bars&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashes&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fieldConfig&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;defaults&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;links&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;overrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fill&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fillGradient&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">8</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">8</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">26</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hiddenSeries&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">68</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;legend&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alignAsTable&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;avg&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;current&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;rightSide&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="string">&quot;current&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sortDesc&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;total&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;lines&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;linewidth&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;nullPointMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;null as zero&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alertThreshold&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;percentage&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pointradius&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;points&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;renderer&quot;</span><span class="punctuation">:</span> <span class="string">&quot;flot&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;seriesOverrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;spaceLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;stack&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;steppedLine&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;histogram_quantile(0.95, sum(rate(loki_ingester_chunk_size_bytes_bucket[5m])) by (le))&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;chunk size&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeRegions&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Chunk Size&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tooltip&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;shared&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;value_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;individual&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;graph&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;xaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;buckets&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;time&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxes&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:155&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;decbytes&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:156&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;align&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alignLevel&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;aliasColors&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;bars&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashes&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fieldConfig&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;defaults&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;links&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;overrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fill&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fillGradient&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">8</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">16</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">26</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hiddenSeries&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">72</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;legend&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alignAsTable&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;avg&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;current&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;rightSide&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="string">&quot;current&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sortDesc&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;total&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;lines&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;linewidth&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;nullPointMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;null as zero&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alertThreshold&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;percentage&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pointradius&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;points&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;renderer&quot;</span><span class="punctuation">:</span> <span class="string">&quot;flot&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;seriesOverrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;spaceLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;stack&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;steppedLine&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;histogram_quantile(0.95, sum(rate(loki_ingester_chunk_age_seconds_bucket[5m])) by (le))&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;ages&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeRegions&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Chunk Age&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tooltip&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;shared&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;value_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;individual&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;graph&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;xaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;buckets&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;time&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxes&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:155&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;s&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:156&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;align&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alignLevel&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;aliasColors&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;bars&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashes&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fieldConfig&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;defaults&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;links&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;overrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fill&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fillGradient&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">8</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">32</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hiddenSeries&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">70</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;legend&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alignAsTable&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;avg&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;current&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;rightSide&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="string">&quot;current&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sortDesc&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;total&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;lines&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;linewidth&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;nullPointMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;null as zero&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alertThreshold&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;percentage&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pointradius&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;points&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;renderer&quot;</span><span class="punctuation">:</span> <span class="string">&quot;flot&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;seriesOverrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;spaceLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;stack&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;steppedLine&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;histogram_quantile(0.95, sum(rate(loki_ingester_chunk_compression_ratio_bucket[5m])) by (le))&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;ratio&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeRegions&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Chunk Compression Ratios&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tooltip&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;shared&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;value_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;individual&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;graph&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;xaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;buckets&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;time&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxes&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:155&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;percent&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:156&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;align&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alignLevel&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;aliasColors&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;bars&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashes&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fieldConfig&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;defaults&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;links&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;overrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fill&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fillGradient&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">8</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">8</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">32</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hiddenSeries&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">69</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;legend&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alignAsTable&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;avg&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;current&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;rightSide&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="string">&quot;current&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sortDesc&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;total&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;lines&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;linewidth&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;nullPointMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;null as zero&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alertThreshold&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;percentage&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pointradius&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;points&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;renderer&quot;</span><span class="punctuation">:</span> <span class="string">&quot;flot&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;seriesOverrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;spaceLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;stack&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;steppedLine&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;histogram_quantile(0.95, sum(rate(loki_ingester_chunk_encode_time_seconds_bucket[5m])) by (le))&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;durations.&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeRegions&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Chunk Encode Time&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tooltip&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;shared&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;value_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;individual&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;graph&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;xaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;buckets&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;time&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxes&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:155&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;s&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:156&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;align&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alignLevel&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;aliasColors&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;bars&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashes&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fieldConfig&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;defaults&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;links&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;overrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fill&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fillGradient&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">8</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">16</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">32</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hiddenSeries&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">73</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;legend&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alignAsTable&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;avg&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;current&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;rightSide&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="string">&quot;current&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sortDesc&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;total&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;lines&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;linewidth&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;nullPointMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;null as zero&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alertThreshold&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;percentage&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pointradius&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;points&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;renderer&quot;</span><span class="punctuation">:</span> <span class="string">&quot;flot&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;seriesOverrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;spaceLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;stack&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;steppedLine&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;histogram_quantile(0.95, sum(rate(loki_ingester_chunk_entries_bucket[5m])) by (le))&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;lines&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeRegions&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Lines / Chunk&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tooltip&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;shared&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;value_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;individual&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;graph&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;xaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;buckets&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;time&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxes&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:155&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;none&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:156&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;align&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alignLevel&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;aliasColors&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;bars&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashes&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fill&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fillGradient&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">8</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">38</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hiddenSeries&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">60</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;legend&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alignAsTable&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;avg&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;current&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;rightSide&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;total&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;lines&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;linewidth&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;nullPointMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;null&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alertThreshold&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;percentage&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pointradius&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;points&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;renderer&quot;</span><span class="punctuation">:</span> <span class="string">&quot;flot&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;seriesOverrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;spaceLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;stack&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;steppedLine&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;rate(loki_ingester_chunks_created_total[5m])&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;create&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sum by (reason) (rate(loki_ingester_chunks_flushed_total[5m]))&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;flush / &#123;&#123; reason &#125;&#125;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;B&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sum by (fake) (rate(loki_ingester_chunks_stored_total[5m]))&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;stored&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;C&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;D&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeRegions&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Chunk Status&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tooltip&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;shared&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;value_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;individual&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;graph&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;xaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;buckets&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;time&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxes&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:1092&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:1093&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;align&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alignLevel&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;aliasColors&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;bars&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashes&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fill&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fillGradient&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">8</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">8</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">38</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hiddenSeries&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">61</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;legend&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;avg&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;current&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;total&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;lines&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;linewidth&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;nullPointMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;null&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alertThreshold&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;percentage&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pointradius&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;points&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;renderer&quot;</span><span class="punctuation">:</span> <span class="string">&quot;flot&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;seriesOverrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;spaceLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;stack&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;steppedLine&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;loki_ingester_memory_chunks&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;chunks&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeRegions&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Chunks in Memory&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tooltip&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;shared&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;value_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;individual&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;graph&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;xaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;buckets&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;time&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxes&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:1092&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:1093&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;align&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alignLevel&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;aliasColors&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;bars&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashes&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fill&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fillGradient&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">8</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">16</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">38</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hiddenSeries&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">62</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;legend&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;avg&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;current&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;total&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;lines&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;linewidth&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;nullPointMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;null&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alertThreshold&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;percentage&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pointradius&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;points&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;renderer&quot;</span><span class="punctuation">:</span> <span class="string">&quot;flot&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;seriesOverrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;spaceLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;stack&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;steppedLine&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sum by (tenan) (loki_ingester_memory_streams)&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;streams&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeRegions&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Chunks in Streams&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tooltip&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;shared&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;value_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;individual&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;graph&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;xaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;buckets&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;time&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxes&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:1092&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:1093&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;align&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alignLevel&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;aliasColors&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;bars&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;dashes&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Prometheus&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fill&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fillGradient&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;gridPos&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;h&quot;</span><span class="punctuation">:</span> <span class="number">5</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;w&quot;</span><span class="punctuation">:</span> <span class="number">24</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;x&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;y&quot;</span><span class="punctuation">:</span> <span class="number">44</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hiddenSeries&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="number">67</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;legend&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alignAsTable&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;avg&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;current&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;rightSide&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;total&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;lines&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;linewidth&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;nullPointMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;null&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;options&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;alertThreshold&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;percentage&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pluginVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8.1.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pointradius&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;points&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;renderer&quot;</span><span class="punctuation">:</span> <span class="string">&quot;flot&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;seriesOverrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;spaceLength&quot;</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;stack&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;steppedLine&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;rate(loki_ingester_streams_created_total[5m])&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;create&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;expr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;rate(loki_ingester_streams_removed_total[5m])&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;legendFormat&quot;</span><span class="punctuation">:</span> <span class="string">&quot;delete&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;B&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;thresholds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeFrom&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeRegions&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeShift&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Strams Stats&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tooltip&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;shared&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sort&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;value_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;individual&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;graph&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;xaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;buckets&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;time&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;values&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxes&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:1092&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;$$hashKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;object:1093&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;short&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;logBase&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;max&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;min&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;show&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;yaxis&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;align&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alignLevel&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;schemaVersion&quot;</span><span class="punctuation">:</span> <span class="number">30</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;style&quot;</span><span class="punctuation">:</span> <span class="string">&quot;dark&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;tags&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="string">&quot;loki&quot;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;templating&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;list&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;time&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;from&quot;</span><span class="punctuation">:</span> <span class="string">&quot;now-1h&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;to&quot;</span><span class="punctuation">:</span> <span class="string">&quot;now&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;timepicker&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;refresh_intervals&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="string">&quot;5s&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;10s&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;30s&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;1m&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;5m&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;15m&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;30m&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;1h&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;2h&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;1d&quot;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;timezone&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Loki2.0 Global Metrics&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;uid&quot;</span><span class="punctuation">:</span> <span class="string">&quot;MQHVDmtWk&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;version&quot;</span><span class="punctuation">:</span> <span class="number">3</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;需要集中的日志系统的原因&quot;&gt;&lt;a href=&quot;#需要集中的日志系统的原因&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="Linux" scheme="https://chensir.ink/categories/Linux/"/>
    
    
    <category term="Grafana Loki" scheme="https://chensir.ink/tags/Grafana-Loki/"/>
    
  </entry>
  
  <entry>
    <title>从JDK源码剖析JVM类加载机制</title>
    <link href="https://chensir.ink/2022/06/20/JVM%E7%B1%BB%E5%8A%A0%E8%BD%BD%E6%9C%BA%E5%88%B6/"/>
    <id>https://chensir.ink/2022/06/20/JVM%E7%B1%BB%E5%8A%A0%E8%BD%BD%E6%9C%BA%E5%88%B6/</id>
    <published>2022-06-20T12:41:55.000Z</published>
    <updated>2025-11-26T14:04:32.750Z</updated>
    
    <content type="html"><![CDATA[<h1 id="JVM类加载机制"><a href="#JVM类加载机制" class="headerlink" title="JVM类加载机制"></a>JVM类加载机制</h1><h2 id="类加载运行全过程"><a href="#类加载运行全过程" class="headerlink" title="类加载运行全过程"></a>类加载运行全过程</h2><p>当用java命令运行某个类的main函数启动程序时，首先需要通过<strong>类加载器</strong>把主类加载到JVM。</p><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> ink.chensir.jvm;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@description</span>: Hello JVM</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span>: chensir</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@slogan</span>: 时间从来不语 却回答了所有问题</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SayHello</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">HELLO_STR</span> <span class="operator">=</span><span class="string">&quot;Hello Jvm !&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">helloJvm</span><span class="params">()</span>&#123;</span><br><span class="line">        System.out.println(HELLO_STR);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        <span class="type">SayHello</span> <span class="variable">sayHello</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SayHello</span>();</span><br><span class="line">        sayHello.helloJvm();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>通过java命令执行代码的大体流程如下：</strong></p><p><img src="https://img.chensir.ink/chensir-pics/202206161159663.png" alt="image-20220616115939628"></p><p><strong>loadClass的类加载过程</strong></p><p><strong>加载 &gt;&gt; 验证 &gt;&gt; 准备 &gt;&gt; 解析 &gt;&gt; 初始化</strong> &gt;&gt; 使用 &gt;&gt; 卸载</p><ul><li><strong>加载：<strong>在硬盘上查找并通过IO读入字节码文件，使用到类的时候才会加载，例如调用类的main()方法，new对象等等，在加载阶段会在内存中生成一个</strong>代表这个类的 java.lang.Class对象</strong>，作为方法区这个类的各种数据访问入口</li><li>**验证：**校验字节码文件的正确性</li><li>**准备：**给类的静态变量分配内存，并赋予默认值</li><li>**解析：**把静态方法的 <strong>符号</strong>(变量名)<strong>引用</strong> 替换为 直接引用(内存地址) &#x3D;&gt; **静态链接 ** ; <strong>动态链接</strong> (程序运行期间 符号引用 替换为 直接引用)；</li><li>**初始化：**对类的静态变量初始化为指定的值，执行静态代码块</li></ul><p>类被加载到方法区中后主要包含<strong>运行时常量池、类型信息、字段信息、方法信息、类加载器的引用、对应class实例的引用</strong>等信息。</p><p>**类加载器的引用：**这个类到类加载器实例的引用</p><p>**对应class实例的引用：**类加载器在加载类信息放到方法区中后，会创建一个对应的class类型的对象实例放到堆（Heap）中，作为开发人员访问方法区中类定义的入口和切入点。</p><p><strong>注意，<strong>主类在运行过程中如果</strong>使用其他类</strong>，会逐步加载这些类。jar包 或war包 里的类<strong>不是一次性全部加载的</strong>，是<strong>使用到时才加载</strong>。</p><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> ink.chensir.jvm;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">A</span> &#123;</span><br><span class="line">    <span class="keyword">static</span> &#123;</span><br><span class="line">        System.out.println(<span class="string">&quot;************* load A ************&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">A</span> <span class="params">()</span>&#123;</span><br><span class="line">        System.out.println(<span class="string">&quot;************* initial A ************&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">========================================================================================</span><br><span class="line">  </span><br><span class="line"><span class="keyword">package</span> ink.chensir.jvm;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">B</span> &#123;</span><br><span class="line">    <span class="keyword">static</span> &#123;</span><br><span class="line">        System.out.println(<span class="string">&quot;************* load B ************&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">B</span> <span class="params">()</span>&#123;</span><br><span class="line">        System.out.println(<span class="string">&quot;************* initial B ************&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">========================================================================================</span><br><span class="line">  </span><br><span class="line"><span class="keyword">package</span> ink.chensir.jvm;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span>: chensir</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@slogan</span>: 时间从来不语 却回答了所有问题</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">TestDynamicLoad</span> &#123;</span><br><span class="line">    <span class="keyword">static</span> &#123;</span><br><span class="line">        System.out.println(<span class="string">&quot;************* load TestDynamicLoad ************&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">A</span>();</span><br><span class="line">        System.out.println(<span class="string">&quot;************* load test ************&quot;</span>);</span><br><span class="line">        <span class="type">B</span> <span class="variable">b</span> <span class="operator">=</span> <span class="literal">null</span>; <span class="comment">// B不会加载，除非这里执行 new B()</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">========================================================================================</span><br><span class="line"></span><br><span class="line">运行结果：</span><br><span class="line">************* load TestDynamicLoad **********</span><br><span class="line">************* load A ************************</span><br><span class="line">************* initial A *********************</span><br><span class="line">************* load test *********************</span><br></pre></td></tr></table></figure><h2 id="类加载器和双亲委派机制"><a href="#类加载器和双亲委派机制" class="headerlink" title="类加载器和双亲委派机制"></a>类加载器和双亲委派机制</h2><p>上面的类加载过程主要是通过类加载器来实现的，java里有如下几种类加载器</p><h3 id="Java类加载器"><a href="#Java类加载器" class="headerlink" title="Java类加载器"></a>Java类加载器</h3><ul><li>**引导类加载器：**负责加载支撑JVM运行的位于JRE的lib目录下的核心类库，比如 rt.jar、charsets.jar等</li><li>**扩展类加载器：**负责加载支撑JVM运行的位于JRElib目录下的ext扩展目录中的jar类包</li><li>**应用程序类加载器：**负责加载ClassPath路径下的类包，主要就是加载你自己写的那些类</li><li>**自定义类加载器：**负责加载用户自定义路径下的类包</li></ul><h3 id="类加载器示例"><a href="#类加载器示例" class="headerlink" title="类加载器示例"></a>类加载器示例</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> ink.chensir.jvm;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> sun.misc.Launcher;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.net.URL;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@description</span>: test jdk classloader</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span>: chensir</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@slogan</span>: 时间从来不语 却回答了所有问题</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">TestJDKClassLoader</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        System.out.println(String.class.getClassLoader());</span><br><span class="line">        System.out.println(com.sun.crypto.provider.DESKeyFactory.class.getClassLoader().getClass().getName());</span><br><span class="line">        System.out.println(TestJDKClassLoader.class.getClassLoader().getClass().getName());</span><br><span class="line">        System.out.println(<span class="string">&quot;===========================================&quot;</span>);</span><br><span class="line"></span><br><span class="line">        <span class="type">ClassLoader</span> <span class="variable">appClassLoader</span> <span class="operator">=</span> ClassLoader.getSystemClassLoader();</span><br><span class="line">        <span class="type">ClassLoader</span> <span class="variable">extClassLoader</span> <span class="operator">=</span> appClassLoader.getParent();</span><br><span class="line">        <span class="type">ClassLoader</span> <span class="variable">bootStrapClassLoader</span> <span class="operator">=</span> extClassLoader.getParent();</span><br><span class="line"></span><br><span class="line">        System.out.println(<span class="string">&quot;引导类加载器：&quot;</span>+bootStrapClassLoader);</span><br><span class="line">        System.out.println(<span class="string">&quot;扩展类加载器：&quot;</span>+extClassLoader);</span><br><span class="line">        System.out.println(<span class="string">&quot;应用类加载器：&quot;</span>+appClassLoader);</span><br><span class="line">        System.out.println(<span class="string">&quot;===========================================&quot;</span>);</span><br><span class="line"></span><br><span class="line">        System.out.println(<span class="string">&quot;引导类加载器，加载以下文件:&quot;</span>);</span><br><span class="line">        URL[] urLs = Launcher.getBootstrapClassPath().getURLs();</span><br><span class="line">        <span class="keyword">for</span> (URL urL : urLs) &#123;</span><br><span class="line">            System.out.println(urL);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        System.out.println(<span class="string">&quot;扩展类加载器，加载以下文件:&quot;</span>);</span><br><span class="line">        System.out.println(System.getProperty(<span class="string">&quot;java.ext.dirs&quot;</span>));</span><br><span class="line">        System.out.println(<span class="string">&quot;===========================================&quot;</span>);</span><br><span class="line"></span><br><span class="line">        System.out.println(<span class="string">&quot;应用类加载器，加载以下文件:&quot;</span>);</span><br><span class="line">        System.out.println(System.getProperty(<span class="string">&quot;java.class.path&quot;</span>));</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">运行结果：</span><br><span class="line"><span class="literal">null</span></span><br><span class="line">sun.misc.Launcher$ExtClassLoader</span><br><span class="line">sun.misc.Launcher$AppClassLoader</span><br><span class="line">===========================================</span><br><span class="line">引导类加载器：<span class="literal">null</span></span><br><span class="line">扩展类加载器：sun.misc.Launcher$ExtClassLoader@5b480cf9</span><br><span class="line">应用类加载器：sun.misc.Launcher$AppClassLoader@18b4aac2</span><br><span class="line">===========================================</span><br><span class="line">引导类加载器，加载以下文件:</span><br><span class="line">file:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/resources.jar</span><br><span class="line">file:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/rt.jar</span><br><span class="line">file:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/sunrsasign.jar</span><br><span class="line">file:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/jsse.jar</span><br><span class="line">file:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/jce.jar</span><br><span class="line">file:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/charsets.jar</span><br><span class="line">file:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/jfr.jar</span><br><span class="line">file:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/classes</span><br><span class="line">扩展类加载器，加载以下文件:</span><br><span class="line">/Users/chensir/Library/Java/Extensions:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/ext:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java</span><br><span class="line">===========================================</span><br><span class="line">应用类加载器，加载以下文件:</span><br><span class="line">/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1<span class="number">.8</span><span class="number">.0_311</span>.jdk/Contents/Home/lib/tools.jar:/Users/chensir/Desktop/jvm/target/classes:/Users/chensir/Documents/MITR_Repository/Repository/org/springframework/boot/spring-boot-starter/<span class="number">2.7</span><span class="number">.0</span>/spring-boot-starter-<span class="number">2.7</span><span class="number">.0</span>.jar:/Users/chensir/Documents/MITR_Repository/Repository/org/springframework/boot/spring-boot/<span class="number">2.7</span><span class="number">.0</span>/spring-boot-<span class="number">2.7</span><span class="number">.0</span>.jar:/Users/chensir/Documents/MITR_Repository/Repository/org/springframework/spring-context/<span class="number">5.3</span><span class="number">.20</span>/spring-context-<span class="number">5.3</span><span class="number">.20</span>.jar:/Users/chensir/Documents/MITR_Repository/Repository/org/springframework/spring-aop/<span class="number">5.3</span><span class="number">.20</span>/spring-aop-<span class="number">5.3</span><span class="number">.20</span>.jar:/Users/chensir/Documents/MITR_Repository/Repository/org/springframework/spring-beans/<span class="number">5.3</span><span class="number">.20</span>/spring-beans-<span class="number">5.3</span><span class="number">.20</span>.jar:/Users/chensir/Documents/MITR_Repository/Repository/org/springframework/spring-expression/<span class="number">5.3</span><span class="number">.20</span>/spring-expression-<span class="number">5.3</span><span class="number">.20</span>.jar:/Users/chensir/Documents/MITR_Repository/Repository/org/springframework/boot/spring-boot-autoconfigure/<span class="number">2.7</span><span class="number">.0</span>/spring-boot-autoconfigure-<span class="number">2.7</span><span class="number">.0</span>.jar:/Users/chensir/Documents/MITR_Repository/Repository/org/springframework/boot/spring-boot-starter-logging/<span class="number">2.7</span><span class="number">.0</span>/spring-boot-starter-logging-<span class="number">2.7</span><span class="number">.0</span>.jar:/Users/chensir/Documents/MITR_Repository/Repository/ch/qos/logback/logback-classic/<span class="number">1.2</span><span class="number">.11</span>/logback-classic-<span class="number">1.2</span><span class="number">.11</span>.jar:/Users/chensir/Documents/MITR_Repository/Repository/ch/qos/logback/logback-core/<span class="number">1.2</span><span class="number">.11</span>/logback-core-<span class="number">1.2</span><span class="number">.11</span>.jar:/Users/chensir/Documents/MITR_Repository/Repository/org/apache/logging/log4j/log4j-to-slf4j/<span class="number">2.17</span><span class="number">.2</span>/log4j-to-slf4j-<span class="number">2.17</span><span class="number">.2</span>.jar:/Users/chensir/Documents/MITR_Repository/Repository/org/apache/logging/log4j/log4j-api/<span class="number">2.17</span><span class="number">.2</span>/log4j-api-<span class="number">2.17</span><span class="number">.2</span>.jar:/Users/chensir/Documents/MITR_Repository/Repository/org/slf4j/jul-to-slf4j/<span class="number">1.7</span><span class="number">.36</span>/jul-to-slf4j-<span class="number">1.7</span><span class="number">.36</span>.jar:/Users/chensir/Documents/MITR_Repository/Repository/jakarta/annotation/jakarta.annotation-api/<span class="number">1.3</span><span class="number">.5</span>/jakarta.annotation-api-<span class="number">1.3</span><span class="number">.5</span>.jar:/Users/chensir/Documents/MITR_Repository/Repository/org/springframework/spring-core/<span class="number">5.3</span><span class="number">.20</span>/spring-core-<span class="number">5.3</span><span class="number">.20</span>.jar:/Users/chensir/Documents/MITR_Repository/Repository/org/springframework/spring-jcl/<span class="number">5.3</span><span class="number">.20</span>/spring-jcl-<span class="number">5.3</span><span class="number">.20</span>.jar:/Users/chensir/Documents/MITR_Repository/Repository/org/yaml/snakeyaml/<span class="number">1.30</span>/snakeyaml-<span class="number">1.30</span>.jar:/Users/chensir/Documents/MITR_Repository/Repository/org/slf4j/slf4j-api/<span class="number">1.7</span><span class="number">.36</span>/slf4j-api-<span class="number">1.7</span><span class="number">.36</span>.jar:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar</span><br></pre></td></tr></table></figure><h3 id="类加载器初始化过程"><a href="#类加载器初始化过程" class="headerlink" title="类加载器初始化过程"></a>类加载器初始化过程</h3><p>见上面的java类加载过程的大体流程图可知其中会创建JVM启动器实例 sun.misc.Launcher。</p><p>sun.misc.Launcher初始化使用了单例模式，保证一个JVM虚拟机内只有一个sun.misc.Launcher实例。</p><p>在Launcher构造方法内部，其创建了两个类加载器，分别是 sun.misc.Launcher.ExtClassLoader（扩展类加载器）和 sun.misc.Launcher.AppClassLoader（应用类加载器）。</p><p>jvm默认使用Launcher的getClassLoader()方法返回的类加载器AppCLassLoader的实例加载我们的应用程序。</p><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">// Launcher的构造方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="title function_">Launcher</span><span class="params">()</span> &#123;</span><br><span class="line">    ExtClassLoader var1;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">      <span class="comment">// 构造扩展类加载器，在构造的过程中将其父加载器设置为null</span></span><br><span class="line">        var1 = Launcher.ExtClassLoader.getExtClassLoader();</span><br><span class="line">    &#125; <span class="keyword">catch</span> (IOException var10) &#123;</span><br><span class="line">        <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">InternalError</span>(<span class="string">&quot;Could not create extension class loader&quot;</span>, var10);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="comment">// 构造应用类加载器，在构造的过程中将其父加载器设置为ExtClassLoader</span></span><br><span class="line">        <span class="comment">// Launcher的loader属性值是AppClassLoader，我们一般是用这个类加载器来加载我们自己写的应用程序</span></span><br><span class="line">        <span class="built_in">this</span>.loader = Launcher.AppClassLoader.getAppClassLoader(var1);</span><br><span class="line">    &#125; <span class="keyword">catch</span> (IOException var9) &#123;</span><br><span class="line">        <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">InternalError</span>(<span class="string">&quot;Could not create application class loader&quot;</span>, var9);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    Thread.currentThread().setContextClassLoader(<span class="built_in">this</span>.loader);</span><br><span class="line">    <span class="type">String</span> <span class="variable">var2</span> <span class="operator">=</span> System.getProperty(<span class="string">&quot;java.security.manager&quot;</span>);</span><br><span class="line"></span><br><span class="line">  。。。。。。 <span class="comment">// 此处省略一些不需要关注的代码段</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="双亲委派机制"><a href="#双亲委派机制" class="headerlink" title="双亲委派机制"></a>双亲委派机制</h3><p>jvm类加载器是有亲子层级结构的，如下图</p><p><img src="https://img.chensir.ink/chensir-pics/202206201015602.png" alt="image-20220620101517522"></p><p>**双亲委派机制：**加载某个类时会先委托父加载器寻找目标类，找不到在委托上层父加载器加载，如果所有父加载器在自己的加载类路径下都找不到目标类，则在自己的类加载路径中查找并载入目标类。</p><p>比如SayHello这个类，最先会找应用程序类加载器加载，应用程序类加载器会先委托扩展类加载器加载，扩展类加载器再委托引导类加载器，顶层引导类加载器在自己的类加载路径里没有找到SayHello类，则向下退回加载SayHello类的请求，扩展类加载器收到回复就自己加载，在自己的类加载路径里也没找到SayHello类，又向下退回SayHello类的加载请求给应用程序类加载器，应用程序类加载器于是在自己的类加载路径里找SayHello类，结果找到了就自己加载。<strong>双亲委派机制简单说就是，先找父加载器加载，找不到再由儿子自己加载。</strong></p><h4 id="AppCLassLoader的双亲委派机制"><a href="#AppCLassLoader的双亲委派机制" class="headerlink" title="AppCLassLoader的双亲委派机制"></a>AppCLassLoader的双亲委派机制</h4><p>AppClassLoader的loadClass方法最终会调用其父类ClassLoader的loadClass方法，该方法大体逻辑如下：</p><p>1、先检查指定名称的类是否已经加载过，如果加载过了，就不需要加载，直接返回</p><p>2、如果此类没有加载过，再判断一下是否有父类加载器，如果有父类加载器，则由父类加载器加载（即调用parent.loadClass(name,false)）或者是调用bootstrap类加载器来加载</p><p>3、如果父加载器及bootstrap类加载器都没有找到指定的类，那么调用当前类加载器的findClass方法来完成类加载</p><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">// ClassLoader类的loadClass方法，里面实现了双亲委派机制</span></span><br><span class="line"><span class="keyword">protected</span> Class&lt;?&gt; loadClass(String name, <span class="type">boolean</span> resolve)</span><br><span class="line">    <span class="keyword">throws</span> ClassNotFoundException</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">synchronized</span> (getClassLoadingLock(name)) &#123;</span><br><span class="line">        <span class="comment">// First, check if the class has already been loaded</span></span><br><span class="line">        <span class="comment">// 检查当前类加载器是否已经加载了该类</span></span><br><span class="line">        Class&lt;?&gt; c = findLoadedClass(name);</span><br><span class="line">        <span class="keyword">if</span> (c == <span class="literal">null</span>) &#123;</span><br><span class="line">            <span class="type">long</span> <span class="variable">t0</span> <span class="operator">=</span> System.nanoTime();</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="keyword">if</span> (parent != <span class="literal">null</span>) &#123; <span class="comment">// 如果当前加载器父类加载器不为空则委托父加载器加载该类</span></span><br><span class="line">                    c = parent.loadClass(name, <span class="literal">false</span>);</span><br><span class="line">                &#125; <span class="keyword">else</span> &#123; <span class="comment">// 如果当前加载器父加载器为空则委托引导类加载器加载该类</span></span><br><span class="line">                    c = findBootstrapClassOrNull(name);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125; <span class="keyword">catch</span> (ClassNotFoundException e) &#123;</span><br><span class="line">                <span class="comment">// ClassNotFoundException thrown if class not found</span></span><br><span class="line">                <span class="comment">// from the non-null parent class loader</span></span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (c == <span class="literal">null</span>) &#123;</span><br><span class="line">                <span class="comment">// If still not found, then invoke findClass in order</span></span><br><span class="line">                <span class="comment">// to find the class.</span></span><br><span class="line">                <span class="type">long</span> <span class="variable">t1</span> <span class="operator">=</span> System.nanoTime();</span><br><span class="line">                <span class="comment">// 都会调用URLClassLoader的findClass方法在加载器类路径里查找并加载该类</span></span><br><span class="line">                c = findClass(name);</span><br><span class="line"></span><br><span class="line">                <span class="comment">// this is the defining class loader; record the stats</span></span><br><span class="line">                sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);</span><br><span class="line">                sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);</span><br><span class="line">                sun.misc.PerfCounter.getFindClasses().increment();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (resolve) &#123; <span class="comment">// 不会执行</span></span><br><span class="line">            resolveClass(c);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> c;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="为什么要设计双亲委派机制"><a href="#为什么要设计双亲委派机制" class="headerlink" title="为什么要设计双亲委派机制"></a>为什么要设计双亲委派机制</h4><ul><li>沙箱安全机制：自己写的java.lang.String.class类不会被加载，这样可以防止核心API库被随意篡改</li><li>避免类的重复加载：当父亲已经加载了该类时，就没有必要让子类加载器ClassLoader再加载一次，保证<strong>被加载类的唯一性</strong></li></ul><p><strong>类加载示例：</strong></p><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> java.lang;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span>: chensir</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@slogan</span>: 时间从来不语 却回答了所有问题</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">String</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        System.out.println(<span class="string">&quot;My String Class&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">运行结果：</span><br><span class="line">错误: 在类 java.lang.String 中找不到 main 方法, 请将 main 方法定义为:</span><br><span class="line">   <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span></span><br><span class="line">否则 JavaFX 应用程序类必须扩展javafx.application.Application</span><br></pre></td></tr></table></figure><h4 id="全盘负责委托机制"><a href="#全盘负责委托机制" class="headerlink" title="全盘负责委托机制"></a>全盘负责委托机制</h4><p>**“全盘负责”**是指当一个ClassLoader装载一个类时，除非显示的使用另一个ClassLoader，该类所依赖及引用的类也由这个ClassLoader载入</p><h4 id="自定义类加载器示例"><a href="#自定义类加载器示例" class="headerlink" title="自定义类加载器示例"></a>自定义类加载器示例</h4><p>自定义类加载器只需要继承java.lang.ClassLoader类</p><p>ClassLoader类有两个核心方法，一个是<strong>loadClass(String name, boolean resolve)</strong>，实现了<strong>双亲委派机制</strong>，还有一个方法是<strong>findClass(String name)</strong>，<strong>默认实现是空方法</strong>，所以我们自定义类加载器主要是<strong>重写 findClass方法</strong></p><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> ink.chensir.jvm;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.FileInputStream;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Method;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@description</span>: 自定义类加载器</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span>: chensir</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@slogan</span>: 时间从来不语 却回答了所有问题</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyClassLoaderTest</span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">MyClassLoader</span> <span class="keyword">extends</span> <span class="title class_">ClassLoader</span>&#123;</span><br><span class="line">        <span class="keyword">private</span> String classPath;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">public</span>  <span class="title function_">MyClassLoader</span><span class="params">(String classPath)</span> &#123;</span><br><span class="line">            <span class="built_in">this</span>.classPath = classPath;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">private</span> <span class="type">byte</span>[] loadByte(String name) <span class="keyword">throws</span> Exception&#123;</span><br><span class="line">            name = name.replaceAll(<span class="string">&quot;\\.&quot;</span>, <span class="string">&quot;/&quot;</span>);</span><br><span class="line">            <span class="type">FileInputStream</span> <span class="variable">fis</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">FileInputStream</span>(classPath + <span class="string">&quot;/&quot;</span> + name + <span class="string">&quot;.class&quot;</span>);</span><br><span class="line">            <span class="type">int</span> <span class="variable">len</span> <span class="operator">=</span> fis.available();</span><br><span class="line">            <span class="type">byte</span>[] data = <span class="keyword">new</span> <span class="title class_">byte</span>[len];</span><br><span class="line">            fis.read(data);</span><br><span class="line">            fis.close();</span><br><span class="line">            <span class="keyword">return</span> data;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="meta">@Override</span></span><br><span class="line">        <span class="keyword">protected</span> Class&lt;?&gt; findClass(String name) <span class="keyword">throws</span> ClassNotFoundException &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="type">byte</span>[] data = loadByte(name);</span><br><span class="line">                <span class="comment">//defineClass将一个字节数组转为Class对象，这个字节数组是class文件读取后最终的字节 数组。</span></span><br><span class="line">                <span class="keyword">return</span> defineClass(name,data,<span class="number">0</span>,data.length);</span><br><span class="line">            &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(e);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="comment">//初始化自定义类加载器，会先初始化父类ClassLoader，其中会把自定义类加载器的父加载器设置为应用程序类加载器AppClassLoader</span></span><br><span class="line">        <span class="type">MyClassLoader</span> <span class="variable">classLoader</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">MyClassLoader</span>(<span class="string">&quot;/Users/chensir/Desktop/test&quot;</span>);</span><br><span class="line">        <span class="comment">//创建 /Users/chensir/Desktop/test/ink/chensir/jvm 几级目录，将SayHello类的复制类SayHello1.class丢入该目录</span></span><br><span class="line">        <span class="type">Class</span> <span class="variable">clazz</span> <span class="operator">=</span> classLoader.loadClass(<span class="string">&quot;ink.chensir.jvm.SayHello1&quot;</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">obj</span> <span class="operator">=</span> clazz.newInstance();</span><br><span class="line">        <span class="type">Method</span> <span class="variable">method</span> <span class="operator">=</span> clazz.getDeclaredMethod(<span class="string">&quot;helloJvm&quot;</span>, <span class="literal">null</span>);</span><br><span class="line">        method.invoke(obj);</span><br><span class="line">        System.out.println(clazz.getClassLoader().getClass().getName());</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">运行结果：</span><br><span class="line">Hello Jvm1 !</span><br><span class="line">=======自己的加载器加载类调用方法=======</span><br><span class="line">ink.chensir.jvm.MyClassLoaderTest$MyClassLoader</span><br></pre></td></tr></table></figure><h4 id="打破双亲委派机制"><a href="#打破双亲委派机制" class="headerlink" title="打破双亲委派机制"></a>打破双亲委派机制</h4><p>沙箱安全机制（自定义类加载器无法加载核心API）示例；</p><p>尝试打破双亲委派机制，用自定义的类加载器加载自己实现的 java.lang.String.class</p><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> ink.chensir.jvm;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.FileInputStream;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Method;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@description</span>: 自定义类加载器</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span>: chensir</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@slogan</span>: 时间从来不语 却回答了所有问题</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyClassLoaderTest</span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">MyClassLoader</span> <span class="keyword">extends</span> <span class="title class_">ClassLoader</span>&#123;</span><br><span class="line">        <span class="keyword">private</span> String classPath;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">public</span>  <span class="title function_">MyClassLoader</span><span class="params">(String classPath)</span> &#123;</span><br><span class="line">            <span class="built_in">this</span>.classPath = classPath;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">private</span> <span class="type">byte</span>[] loadByte(String name) <span class="keyword">throws</span> Exception&#123;</span><br><span class="line">            name = name.replaceAll(<span class="string">&quot;\\.&quot;</span>, <span class="string">&quot;/&quot;</span>);</span><br><span class="line">            <span class="type">FileInputStream</span> <span class="variable">fis</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">FileInputStream</span>(classPath + <span class="string">&quot;/&quot;</span> + name + <span class="string">&quot;.class&quot;</span>);</span><br><span class="line">            <span class="type">int</span> <span class="variable">len</span> <span class="operator">=</span> fis.available();</span><br><span class="line">            <span class="type">byte</span>[] data = <span class="keyword">new</span> <span class="title class_">byte</span>[len];</span><br><span class="line">            fis.read(data);</span><br><span class="line">            fis.close();</span><br><span class="line">            <span class="keyword">return</span> data;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="meta">@Override</span></span><br><span class="line">        <span class="keyword">protected</span> Class&lt;?&gt; findClass(String name) <span class="keyword">throws</span> ClassNotFoundException &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="type">byte</span>[] data = loadByte(name);</span><br><span class="line">                <span class="comment">//defineClass将一个字节数组转为Class对象，这个字节数组是class文件读取后最终的字节 数组。</span></span><br><span class="line">                <span class="keyword">return</span> defineClass(name,data,<span class="number">0</span>,data.length);</span><br><span class="line">            &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(e);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">/**</span></span><br><span class="line"><span class="comment">         * 重写类加载方法，实现自己的加载逻辑，不委派给双亲加载</span></span><br><span class="line"><span class="comment">         */</span></span><br><span class="line">        <span class="meta">@Override</span></span><br><span class="line">        <span class="keyword">protected</span> Class&lt;?&gt; loadClass(String name, <span class="type">boolean</span> resolve) <span class="keyword">throws</span> ClassNotFoundException &#123;</span><br><span class="line">            <span class="keyword">synchronized</span> (getClassLoadingLock(name)) &#123;</span><br><span class="line">                <span class="comment">// First, check if the class has already been loaded</span></span><br><span class="line">                Class&lt;?&gt; c = findLoadedClass(name);</span><br><span class="line">                <span class="keyword">if</span> (c == <span class="literal">null</span>) &#123;</span><br><span class="line">                    <span class="type">long</span> <span class="variable">t0</span> <span class="operator">=</span> System.nanoTime();</span><br><span class="line">                    <span class="comment">// If still not found, then invoke findClass in order</span></span><br><span class="line">                    <span class="comment">// to find the class.</span></span><br><span class="line">                    <span class="comment">//非自定义的类还是走双亲委派加载</span></span><br><span class="line">                    <span class="keyword">if</span> (!name.startsWith(<span class="string">&quot;ink.chensir.jvm&quot;</span>)) &#123;</span><br><span class="line">                        c = <span class="built_in">this</span>.getParent().loadClass(name);</span><br><span class="line">                    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                        c = findClass(name);</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="type">long</span> <span class="variable">t1</span> <span class="operator">=</span> System.nanoTime();</span><br><span class="line">                    <span class="comment">// this is the defining class loader; record the stats</span></span><br><span class="line">                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);</span><br><span class="line">                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);</span><br><span class="line">                    sun.misc.PerfCounter.getFindClasses().increment();</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">if</span> (resolve) &#123;</span><br><span class="line">                    resolveClass(c);</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">return</span> c;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="comment">//初始化自定义类加载器，会先初始化父类ClassLoader，其中会把自定义类加载器的父加载器设置为应用程序类加载器AppClassLoader</span></span><br><span class="line">        <span class="type">MyClassLoader</span> <span class="variable">classLoader</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">MyClassLoader</span>(<span class="string">&quot;/Users/chensir/Desktop/test&quot;</span>);</span><br><span class="line">        <span class="comment">//创建 /Users/chensir/Desktop/test/java/lang 几级目录，将自己写的String.class丢入该目录</span></span><br><span class="line">        <span class="type">Class</span> <span class="variable">clazz</span> <span class="operator">=</span> classLoader.loadClass(<span class="string">&quot;java.lang.String&quot;</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">obj</span> <span class="operator">=</span> clazz.newInstance();</span><br><span class="line">        <span class="type">Method</span> <span class="variable">method</span> <span class="operator">=</span> clazz.getDeclaredMethod(<span class="string">&quot;sayHello&quot;</span>, <span class="literal">null</span>);</span><br><span class="line">        method.invoke(obj);</span><br><span class="line">        System.out.println(clazz.getClassLoader().getClass().getName());</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">运行结果</span><br><span class="line">Exception in thread <span class="string">&quot;main&quot;</span> java.lang.RuntimeException: java.lang.SecurityException: Prohibited <span class="keyword">package</span> name: java.lang</span><br><span class="line">at ink.chensir.jvm.MyClassLoaderTest$MyClassLoader.findClass(MyClassLoaderTest.java:<span class="number">37</span>)</span><br><span class="line">at ink.chensir.jvm.MyClassLoaderTest$MyClassLoader.loadClass(MyClassLoaderTest.java:<span class="number">51</span>)</span><br><span class="line">at java.lang.ClassLoader.loadClass(ClassLoader.java:<span class="number">351</span>)</span><br><span class="line">at ink.chensir.jvm.MyClassLoaderTest.main(MyClassLoaderTest.java:<span class="number">70</span>)</span><br><span class="line">Caused by: java.lang.SecurityException: Prohibited <span class="keyword">package</span> name: java.lang</span><br><span class="line">at java.lang.ClassLoader.preDefineClass(ClassLoader.java:<span class="number">655</span>)</span><br><span class="line">at java.lang.ClassLoader.defineClass(ClassLoader.java:<span class="number">754</span>)</span><br><span class="line">at java.lang.ClassLoader.defineClass(ClassLoader.java:<span class="number">635</span>)</span><br><span class="line">at ink.chensir.jvm.MyClassLoaderTest$MyClassLoader.findClass(MyClassLoaderTest.java:<span class="number">35</span>)</span><br><span class="line">... <span class="number">3</span> more</span><br></pre></td></tr></table></figure><h4 id="Tomcat打破双亲委派机制"><a href="#Tomcat打破双亲委派机制" class="headerlink" title="Tomcat打破双亲委派机制"></a>Tomcat打破双亲委派机制</h4><p><strong>问题：</strong> Tomcat如果使用默认的双亲委派类加载机制行不行？</p><p>思考：Tomcat是web容器，那么它需要解决什么问题？</p><p>1、一个web容器可能需要部署两个应用程序，不同的应用程序可能会<strong>依赖同一个第三方类库的不同版本</strong>，不能要求同一个类库在同一个服务器只有一份，因此要保证每个应用程序的类库都是独立的，保证相互隔离。</p><p>2、部署在同一个web容器中<strong>相同的类库相同的版本可以共享</strong>。否则，如果服务器有10个应用程序，那么要有10份相同的类库加载进虚拟机。</p><p>3、**web容器也有自己的依赖库，不能与应用程序的类库混淆。**基于安全考虑，应该让容器的类库和程序的类库隔离开来。</p><p>4、web容器要支持jsp的修改，jsp文件最终也是要编译成class文件才能在虚拟机中运行，但程序运行后修改jsp已经是司空见惯的事情，web容器需要支持jsp修改后不用重启。</p><p>所以，<strong>Tomcat使用默认的双亲委派类加载机制是不行的</strong></p><p>原因：1、如果使用默认类的加载机制，那么无法加载两个相同类库的不同版本，默认的类加载器是不管你是什么版本的，只在乎你的全限定类名，并且只有一份。</p><p>​2、默认的类加载器是能够实现的，因为它的职责就是<strong>保证唯一性</strong>。</p><p>​3、与1一样</p><p>​4、jsp文件其实也就是class文件，如果修改了，但类名还是一样，类加载器会直接去方法区中已经存在的，修改后的jsp是不会重新加载的。我们可以直接卸载掉这个jsp文件的类加载器，就是每个jsp文件对应一个唯一的类加载器，当一个jsp文件修改了，就直接卸载这个jsp类加载器。重新创建类加载器，重新加载jsp文件。</p><p>Tomcat类加载机制违背了java推荐的双亲委派模型，Tomcat为了实现隔离性，没有遵守约定，<strong>每个webAppClass加载自己的目录下的class文件，不会传递给父类加载器，打破了双亲委派机制</strong></p><p><strong>注意：同一个JVM，两个相同包名和类名的类对象可以共存，因为他们的类加载器可以不一样，所以看两个类对象是否是同一个，除了看类的包名和类名是否相同之外，还需要他们的类加载器也是同一个才能认为他们是同一个。</strong></p><h4 id="手写模拟简易Tomcat类加载"><a href="#手写模拟简易Tomcat类加载" class="headerlink" title="手写模拟简易Tomcat类加载"></a>手写模拟简易Tomcat类加载</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> ink.chensir.jvm;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.FileInputStream;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Method;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@description</span>: 自定义类加载器</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span>: chensir</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@slogan</span>: 时间从来不语 却回答了所有问题</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyClassLoaderTest</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">MyClassLoader</span> <span class="keyword">extends</span> <span class="title class_">ClassLoader</span> &#123;</span><br><span class="line">        <span class="keyword">private</span> String classPath;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">public</span> <span class="title function_">MyClassLoader</span><span class="params">(String classPath)</span> &#123;</span><br><span class="line">            <span class="built_in">this</span>.classPath = classPath;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">private</span> <span class="type">byte</span>[] loadByte(String name) <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">            name = name.replaceAll(<span class="string">&quot;\\.&quot;</span>, <span class="string">&quot;/&quot;</span>);</span><br><span class="line">            <span class="type">FileInputStream</span> <span class="variable">fis</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">FileInputStream</span>(classPath + <span class="string">&quot;/&quot;</span> + name + <span class="string">&quot;.class&quot;</span>);</span><br><span class="line">            <span class="type">int</span> <span class="variable">len</span> <span class="operator">=</span> fis.available();</span><br><span class="line">            <span class="type">byte</span>[] data = <span class="keyword">new</span> <span class="title class_">byte</span>[len];</span><br><span class="line">            fis.read(data);</span><br><span class="line">            fis.close();</span><br><span class="line">            <span class="keyword">return</span> data;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="meta">@Override</span></span><br><span class="line">        <span class="keyword">protected</span> Class&lt;?&gt; findClass(String name) <span class="keyword">throws</span> ClassNotFoundException &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="type">byte</span>[] data = loadByte(name);</span><br><span class="line">                <span class="comment">//defineClass将一个字节数组转为Class对象，这个字节数组是class文件读取后最终的字节 数组。</span></span><br><span class="line">                <span class="keyword">return</span> defineClass(name, data, <span class="number">0</span>, data.length);</span><br><span class="line">            &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(e);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">/**</span></span><br><span class="line"><span class="comment">         * 重写类加载方法，实现自己的加载逻辑，不委派给双亲加载</span></span><br><span class="line"><span class="comment">         */</span></span><br><span class="line">        <span class="meta">@Override</span></span><br><span class="line">        <span class="keyword">protected</span> Class&lt;?&gt; loadClass(String name, <span class="type">boolean</span> resolve) <span class="keyword">throws</span> ClassNotFoundException &#123;</span><br><span class="line">            <span class="keyword">synchronized</span> (getClassLoadingLock(name)) &#123;</span><br><span class="line">                <span class="comment">// First, check if the class has already been loaded</span></span><br><span class="line">                Class&lt;?&gt; c = findLoadedClass(name);</span><br><span class="line">                <span class="keyword">if</span> (c == <span class="literal">null</span>) &#123;</span><br><span class="line">                    <span class="type">long</span> <span class="variable">t0</span> <span class="operator">=</span> System.nanoTime();</span><br><span class="line">                    <span class="comment">// If still not found, then invoke findClass in order</span></span><br><span class="line">                    <span class="comment">// to find the class.</span></span><br><span class="line">                    <span class="comment">//非自定义的类还是走双亲委派加载</span></span><br><span class="line">                    <span class="keyword">if</span> (!name.startsWith(<span class="string">&quot;ink.chensir.jvm&quot;</span>)) &#123;</span><br><span class="line">                        c = <span class="built_in">this</span>.getParent().loadClass(name);</span><br><span class="line">                    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                        c = findClass(name);</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="type">long</span> <span class="variable">t1</span> <span class="operator">=</span> System.nanoTime();</span><br><span class="line">                    <span class="comment">// this is the defining class loader; record the stats</span></span><br><span class="line">                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);</span><br><span class="line">                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);</span><br><span class="line">                    sun.misc.PerfCounter.getFindClasses().increment();</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">if</span> (resolve) &#123;</span><br><span class="line">                    resolveClass(c);</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">return</span> c;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">MyClassLoader</span> <span class="variable">classLoader1</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">MyClassLoader</span>(<span class="string">&quot;/Users/chensir/Desktop/test1&quot;</span>);</span><br><span class="line">        <span class="comment">//创建 /Users/chensir/Desktop/test/ink/chensir/jvm 几级目录，SayHello1.class丢入该目录</span></span><br><span class="line">        <span class="type">Class</span> <span class="variable">clazz1</span> <span class="operator">=</span> classLoader1.loadClass(<span class="string">&quot;ink.chensir.jvm.SayHello1&quot;</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">obj1</span> <span class="operator">=</span> clazz1.newInstance();</span><br><span class="line">        <span class="type">Method</span> <span class="variable">method1</span> <span class="operator">=</span> clazz1.getDeclaredMethod(<span class="string">&quot;helloJvm&quot;</span>, <span class="literal">null</span>);</span><br><span class="line">        method1.invoke(obj1);</span><br><span class="line">        System.out.println(clazz1.getClassLoader().getClass().getName());</span><br><span class="line"></span><br><span class="line">        <span class="type">MyClassLoader</span> <span class="variable">classLoader2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">MyClassLoader</span>(<span class="string">&quot;/Users/chensir/Desktop/test2&quot;</span>);</span><br><span class="line">        <span class="type">Class</span> <span class="variable">clazz2</span> <span class="operator">=</span> classLoader2.loadClass(<span class="string">&quot;ink.chensir.jvm.SayHello1&quot;</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">obj2</span> <span class="operator">=</span> clazz2.newInstance();</span><br><span class="line">        <span class="type">Method</span> <span class="variable">method2</span> <span class="operator">=</span> clazz2.getDeclaredMethod(<span class="string">&quot;helloJvm&quot;</span>, <span class="literal">null</span>);</span><br><span class="line">        method2.invoke(obj2);</span><br><span class="line">        System.out.println(clazz2.getClassLoader().getClass().getName());</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;JVM类加载机制&quot;&gt;&lt;a href=&quot;#JVM类加载机制&quot; class=&quot;headerlink&quot; title=&quot;JVM类加载机制&quot;&gt;&lt;/a&gt;JVM类加载机制&lt;/h1&gt;&lt;h2 id=&quot;类加载运行全过程&quot;&gt;&lt;a href=&quot;#类加载运行全过程&quot;</summary>
        
      
    
    
    
    <category term="JVM调优" scheme="https://chensir.ink/categories/JVM%E8%B0%83%E4%BC%98/"/>
    
    
    <category term="JVM类加载机制" scheme="https://chensir.ink/tags/JVM%E7%B1%BB%E5%8A%A0%E8%BD%BD%E6%9C%BA%E5%88%B6/"/>
    
  </entry>
  
  <entry>
    <title>企业级反向代理HAProxy</title>
    <link href="https://chensir.ink/2021/09/02/%E4%BC%81%E4%B8%9A%E7%BA%A7%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86HAProxy/"/>
    <id>https://chensir.ink/2021/09/02/%E4%BC%81%E4%B8%9A%E7%BA%A7%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86HAProxy/</id>
    <published>2021-09-02T09:06:54.000Z</published>
    <updated>2025-11-26T14:04:32.780Z</updated>
    
    <content type="html"><![CDATA[<h2 id="HAProxy简介"><a href="#HAProxy简介" class="headerlink" title="HAProxy简介"></a>HAProxy简介</h2><p>HAProxy是法国开发者Willy Tarreau在2000年使用C语言开发的一个开源软件，是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器，支持基于cookie的持久性，自动故障切换，支持正则表达式及web状态统计。从2013年HAProxy分为社区版和企业版，企业版将提供更多的特性和功能以及全天24小时的技术支持等服务。</p><h3 id="企业版"><a href="#企业版" class="headerlink" title="企业版"></a>企业版</h3><p><a href="https://www.haproxy.com/">https://www.haproxy.com</a></p><h3 id="社区版"><a href="#社区版" class="headerlink" title="社区版"></a>社区版</h3><p><a href="http://www.haproxy.org/">http://www.haproxy.org</a></p><p><a href="https://github.com/haproxy">https://github.com/haproxy</a></p><h3 id="HAProxy功能"><a href="#HAProxy功能" class="headerlink" title="HAProxy功能"></a>HAProxy功能</h3><h4 id="支持功能"><a href="#支持功能" class="headerlink" title="支持功能"></a>支持功能</h4><ul><li>TCP 和 HTTP反向代理</li><li>SSL&#x2F;TSL服务器</li><li>可以针对HTTP请求添加cookie，进行路由后端服务器</li><li>可平衡负载至后端服务器，并支持持久性连接</li><li>支持所有主服务器故障切换至备用服务器 </li><li>支持专用端口实现监控服务</li><li>支持停止接收新连接请求，而不影响现有连接</li><li>可以双向添加，修改或删除HTTP报文首部</li><li>响应报文压缩</li><li>支持基于pattern实现连接请求的访问控制</li><li>通过特定的URI为授权用户提供详细的状态信息</li><li>支持HTTP反向代理</li><li>支持动态程序的反向代理</li><li>支持基于数据库的反向代理</li></ul><h4 id="不具备的功能"><a href="#不具备的功能" class="headerlink" title="不具备的功能"></a>不具备的功能</h4><ul><li>正向代理 squid，nginx</li><li>缓存代理 varnish</li><li>web服务 nginx，tengine，apache，PHP，Tomcat</li><li>UDP 目前不支持UDP协议</li><li>单机性能 相比LVS性能较差</li></ul><h2 id="HAProxy编译安装"><a href="#HAProxy编译安装" class="headerlink" title="HAProxy编译安装"></a>HAProxy编译安装</h2><p>编译安装haproxy-2.4.3LTS版本，更多源码包下载地址 <a href="http://www.haproxy.org/#down">http://www.haproxy.org/#down</a></p><h3 id="准备lua环境"><a href="#准备lua环境" class="headerlink" title="准备lua环境"></a>准备lua环境</h3><p>HAProxy支持基于lua实现功能扩展，lua是一种小巧的脚本语言，与1993年由巴西里约热内卢天主教大学里的一个研究小组开发，其设计目的是为了嵌入应用程序中，从而为应用程序提供灵活的扩展和定制功能。</p><p>Lua官网：<a href="http://www.lua.org/">www.lua.org</a></p><p>Lua应用场景</p><ul><li>游戏开发</li><li>独立应用脚本</li><li>web应用脚本</li><li>扩展和数据库插件，如mysql proxy</li><li>安全系统，如入侵检测系统</li></ul><h4 id="centos基础环境"><a href="#centos基础环境" class="headerlink" title="centos基础环境"></a>centos基础环境</h4><p>参考：<a href="http://www.lua.org/start.html">http://www.lua.org/start.html</a></p><p>由于centos7之前版本自带的lua版本比较低，不符合HAProxy要求的lua最低版本(5.3)的要求，因此需要编译安装较新版本的lua环境，然后才能编译安装HAProxy，过程如下</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 查看当前版本</span></span><br><span class="line">lua -v</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装基础命令及编译依赖环境</span></span><br><span class="line">yum install -y gcc redline-devel</span><br><span class="line">curl -R -O http://www.lua.org/ftp/lua-5.4.3.tar.gz</span><br><span class="line">tar zxf lua-5.4.3.tar.gz</span><br><span class="line"><span class="built_in">cd</span> lua-5.4.3</span><br><span class="line">make all</span><br><span class="line"></span><br><span class="line"><span class="comment"># 删除原有的链接</span></span><br><span class="line"><span class="built_in">rm</span> -rf /usr/bin/lua /usr/bin/luac</span><br><span class="line"></span><br><span class="line"><span class="comment"># 新建链接</span></span><br><span class="line"><span class="built_in">ln</span> -s /software/lua-5.4.3/src/lua /usr/bin/</span><br><span class="line"><span class="built_in">ln</span> -s /software/lua-5.4.3/src/luac /usr/bin/</span><br></pre></td></tr></table></figure><h3 id="开始编译安装HAProxy"><a href="#开始编译安装HAProxy" class="headerlink" title="开始编译安装HAProxy"></a>开始编译安装HAProxy</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 安装依赖</span></span><br><span class="line">yum install -y gcc openssl-devel pcre-devel systemd-devel</span><br><span class="line"></span><br><span class="line"><span class="comment"># 上传并解压 haproxy-2.4.3</span></span><br><span class="line">tar -zxvf haproxy-2.4.3.tar.gz</span><br><span class="line"><span class="built_in">cd</span> haproxy-2.4.3</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看安装方法</span></span><br><span class="line"><span class="built_in">cat</span> README</span><br><span class="line"><span class="built_in">cat</span> INSTALL</span><br><span class="line"></span><br><span class="line"><span class="comment"># 参考INSTALL文件进行编译安装</span></span><br><span class="line">make clean</span><br><span class="line">make -j $(<span class="built_in">nproc</span>) TARGET=linux-glibc USE_OPENSSL=1 USE_LUA=1 USE_PCRE=1 USE_SYSTEMD=1 USE_ZLIB=1 LUA_INC=/mitr/software/lua-5.4.3/src LUA_LIB=/mitr/software/lua-5.4.3/src PREFIX=/usr/haproxy</span><br><span class="line">make install PREFIX=/usr/haproxy</span><br><span class="line"></span><br><span class="line">！！！！！<span class="built_in">ln</span> -s /usr/haproxy/sbin/haproxy /usr/bin/</span><br><span class="line">！！！！！<span class="built_in">cp</span> /usr/haproxy/sbin/haproxy /usr/bin/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看生成的文件</span></span><br><span class="line">yum install -y tree</span><br><span class="line">tree /usr/haproxy/</span><br><span class="line"></span><br><span class="line">/usr/haproxy/</span><br><span class="line">├── doc</span><br><span class="line">│   └── haproxy</span><br><span class="line">│       ├── 51Degrees-device-detection.txt</span><br><span class="line">│       ├── architecture.txt</span><br><span class="line">│       ├── close-options.txt</span><br><span class="line">│       ├── configuration.txt</span><br><span class="line">│       ├── cookie-options.txt</span><br><span class="line">│       ├── DeviceAtlas-device-detection.txt</span><br><span class="line">│       ├── intro.txt</span><br><span class="line">│       ├── linux-syn-cookies.txt</span><br><span class="line">│       ├── lua.txt</span><br><span class="line">│       ├── management.txt</span><br><span class="line">│       ├── netscaler-client-ip-insertion-protocol.txt</span><br><span class="line">│       ├── network-namespaces.txt</span><br><span class="line">│       ├── peers.txt</span><br><span class="line">│       ├── peers-v2.0.txt</span><br><span class="line">│       ├── proxy-protocol.txt</span><br><span class="line">│       ├── regression-testing.txt</span><br><span class="line">│       ├── seamless_reload.txt</span><br><span class="line">│       ├── SOCKS4.protocol.txt</span><br><span class="line">│       ├── SPOE.txt</span><br><span class="line">│       └── WURFL-device-detection.txt</span><br><span class="line">├── sbin</span><br><span class="line">│   └── haproxy</span><br><span class="line">└── share</span><br><span class="line">    └── man</span><br><span class="line">        └── man1</span><br><span class="line">            └── haproxy.1</span><br><span class="line">6 directories, 22 files</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证HAProxy并查看版本及用法</span></span><br><span class="line">haproxy -V</span><br><span class="line">haproxy -vv</span><br></pre></td></tr></table></figure><h4 id="HAProxy配置文件"><a href="#HAProxy配置文件" class="headerlink" title="HAProxy配置文件"></a>HAProxy配置文件</h4><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 查看配置文件范例</span></span><br><span class="line">tree haproxy-2.4.3/examples/</span><br><span class="line"></span><br><span class="line">haproxy-2.4.3/examples/</span><br><span class="line">├── acl-content-sw.cfg</span><br><span class="line">├── basic-config-edge.cfg</span><br><span class="line">├── content-sw-sample.cfg</span><br><span class="line">├── errorfiles</span><br><span class="line">│   ├── 400.http</span><br><span class="line">│   ├── 403.http</span><br><span class="line">│   ├── 408.http</span><br><span class="line">│   ├── 500.http</span><br><span class="line">│   ├── 502.http</span><br><span class="line">│   ├── 503.http</span><br><span class="line">│   ├── 504.http</span><br><span class="line">│   └── README</span><br><span class="line">├── haproxy.init</span><br><span class="line">├── option-http_proxy.cfg</span><br><span class="line">├── quick-test.cfg</span><br><span class="line">├── socks4.cfg</span><br><span class="line">├── transparent_proxy.cfg</span><br><span class="line">└── wurfl-example.cfg</span><br><span class="line"></span><br><span class="line">1 directory, 17 files</span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建自定义文件夹</span></span><br><span class="line"><span class="built_in">mkdir</span> /etc/haproxy</span><br><span class="line"></span><br><span class="line"><span class="comment"># 编辑配置文件</span></span><br><span class="line">vim /etc/haproxy/haproxy.cfg</span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加内容如下</span></span><br><span class="line">global</span><br><span class="line">   <span class="built_in">chroot</span> /usr/haproxy</span><br><span class="line">   daemon</span><br><span class="line">   stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin </span><br><span class="line">   user root</span><br><span class="line">   group root</span><br><span class="line">   maxconn 100000</span><br><span class="line">   pidfile /var/lib/haproxy/haproxy.pid</span><br><span class="line">   <span class="built_in">log</span> 127.0.0.1 local3 info</span><br><span class="line"></span><br><span class="line">defaults</span><br><span class="line">   option http-keep-alive</span><br><span class="line">   option forwardfor</span><br><span class="line">   maxconn 100000</span><br><span class="line">   mode http</span><br><span class="line">   <span class="built_in">timeout</span> client 300000ms</span><br><span class="line">   <span class="built_in">timeout</span> server 300000ms</span><br><span class="line">   <span class="built_in">timeout</span> connect 300000ms</span><br><span class="line"></span><br><span class="line">listen stats</span><br><span class="line">   mode http</span><br><span class="line">   <span class="built_in">bind</span> 0.0.0.0:9999</span><br><span class="line">   stats <span class="built_in">enable</span></span><br><span class="line">   <span class="built_in">log</span> global</span><br><span class="line">   stats uri /haproxy-status</span><br><span class="line">   stats auth admin:123456</span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="HAProxy启动文件"><a href="#HAProxy启动文件" class="headerlink" title="HAProxy启动文件"></a>HAProxy启动文件</h4><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 新建启动文件</span></span><br><span class="line">vim /etc/systemd/system/haproxy.service</span><br><span class="line"></span><br><span class="line"><span class="comment"># 内容如下</span></span><br><span class="line">[Unit]</span><br><span class="line">Description=HAProxy Load Balancer</span><br><span class="line">After=network-online.target</span><br><span class="line">[Service]</span><br><span class="line">ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q</span><br><span class="line">ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid</span><br><span class="line">ExecReload=/bin/kill -USR2 <span class="variable">$MAINPID</span></span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br><span class="line"></span><br><span class="line"><span class="comment"># 新建存放haproxy.pid的目录</span></span><br><span class="line"><span class="built_in">mkdir</span> /var/lib/haproxy/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置开机自启并启动</span></span><br><span class="line">systemctl <span class="built_in">enable</span> --now haproxy</span><br></pre></td></tr></table></figure><h4 id="HAProxy基础配置详解"><a href="#HAProxy基础配置详解" class="headerlink" title="HAProxy基础配置详解"></a>HAProxy基础配置详解</h4><p>HAProxy的配置文件haproxy.cfg由两大部分组成，分别是global和proxies</p><ul><li>global 全局配置段：<ul><li>进程及安全配置相关的参数</li><li>性能调整相关参数</li><li>Debug参数</li></ul></li><li>proxies 代理配置段<ul><li>defaults：为frontend，backend，listen提供默认配置</li><li>frontend：前端，相当于nginx中的server {}</li><li>backend：后端，相当于nginx中的upstream {}</li><li>listen：同时拥有前端和后端配置，配置简单，生产推荐使用</li></ul></li></ul><h5 id="global配置参数说明"><a href="#global配置参数说明" class="headerlink" title="global配置参数说明"></a>global配置参数说明</h5><p>官方文档：<a href="http://cbonte.github.io/haproxy-dconv/2.1/configuration.html#3">http://cbonte.github.io/haproxy-dconv/2.1/configuration.html#3</a></p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 锁定运行目录</span></span><br><span class="line"><span class="built_in">chroot</span> </span><br><span class="line"></span><br><span class="line"><span class="comment"># 以守护进程运行</span></span><br><span class="line">deamon </span><br><span class="line"></span><br><span class="line"><span class="comment"># socket文件</span></span><br><span class="line">stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin process 1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 运行HAProxy的用户身份</span></span><br><span class="line">user,group,uid,gid</span><br><span class="line"></span><br><span class="line"><span class="comment"># 开启的haproxy work进程数，默认进程数是1</span></span><br><span class="line">nbproc n</span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定每个haproxy进程开启的线程数，默认为每个进程一个线程</span></span><br><span class="line">nbthread 1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 绑定haproxy worker进程至指定CPU，将第2个work进程绑定至0号CPU</span></span><br><span class="line">cpu-map 1 0</span><br><span class="line"><span class="comment"># 绑定haproxy worker进程至指定CPU，将第2个work进程绑定至1号CPU</span></span><br><span class="line">cpu-map 2 1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 每个haproxy进程的最大并发连接数</span></span><br><span class="line">maxconn n</span><br><span class="line"></span><br><span class="line"><span class="comment"># 每个haproxy进程ssl最大连接数，用于haproxy配置了证书的场景下</span></span><br><span class="line">maxsslconn n</span><br><span class="line"></span><br><span class="line"><span class="comment"># 每个进程每秒创建的最大连接数</span></span><br><span class="line">maxconnrate n</span><br><span class="line"></span><br><span class="line"><span class="comment"># 后端server状态check随机提前或延迟百分比时间，建议2-5（20%-50%）之间，默认0</span></span><br><span class="line">spread-checks n</span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定pid文件路径</span></span><br><span class="line">pidfile</span><br><span class="line"></span><br><span class="line"><span class="comment"># 定义全局的syslog服务器：日志服务器需要开启UDP协议，最多可以定义两个</span></span><br><span class="line"><span class="built_in">log</span> 127.0.0.1 local2 info</span><br><span class="line"></span><br></pre></td></tr></table></figure><h5 id="多进程和线程"><a href="#多进程和线程" class="headerlink" title="多进程和线程"></a>多进程和线程</h5><p>范例：多进程和socket文件</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">vim /etc/haproxy/haproxy.cfg</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置如下</span></span><br><span class="line">global</span><br><span class="line"> maxconn 100000</span><br><span class="line"> <span class="built_in">chroot</span> /usr/haproxy</span><br><span class="line"> stats socket /var/lib/haproxy/haproxy.sock1 mode 600 level admin process 1</span><br><span class="line"> stats socket /var/lib/haproxy/haproxy.sock2 mode 600 level admin    process 2</span><br><span class="line"> uid 99</span><br><span class="line"> gid 99</span><br><span class="line"> daemon</span><br><span class="line"> nbproc 2</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重启haproxy</span></span><br><span class="line">systemctl restart haproxy</span><br></pre></td></tr></table></figure><h4 id="HAProxy日志配置"><a href="#HAProxy日志配置" class="headerlink" title="HAProxy日志配置"></a>HAProxy日志配置</h4><p>HAProxy本身不记录客户端的访问日志，此外为减少服务器负载，一般生产中HAProxy不记录日志，也可以配置HAProxy利用rsyslog服务记录日志到指定文件中</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 在global配置项定义 </span></span><br><span class="line"><span class="comment"># 基于syslog记录日志到指定设备，级别（err、warning、info、debug）</span></span><br><span class="line"><span class="comment"># log 127.0.0.1 local&#123;1-7&#125; info</span></span><br><span class="line"><span class="built_in">log</span> 127.0.0.1 local3 info</span><br><span class="line"></span><br><span class="line">listen web_port</span><br><span class="line">    <span class="built_in">bind</span> 127.0.0.1:80</span><br><span class="line">    mode http</span><br><span class="line">    <span class="comment"># 开启当前web_port的日志功能，默认不记录日志</span></span><br><span class="line">    <span class="built_in">log</span> global</span><br><span class="line">    server web1 127.0.0.1:8080 check inter 3000 fall 2 rise 5</span><br><span class="line">    </span><br><span class="line"><span class="comment"># 重启haproxy</span></span><br><span class="line">systemctl restart haproxy</span><br></pre></td></tr></table></figure><h5 id="Rsyslog配置"><a href="#Rsyslog配置" class="headerlink" title="Rsyslog配置"></a>Rsyslog配置</h5><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 修改rsyslog.conf</span></span><br><span class="line">vim /etc/rsyslog.conf</span><br><span class="line"></span><br><span class="line"><span class="comment"># 编辑内容如下</span></span><br><span class="line"><span class="variable">$ModLoad</span> imudp</span><br><span class="line"><span class="variable">$UDPServerRun</span> 514</span><br><span class="line">local3.* /var/log/haproxy.log</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重启rsyslog</span></span><br><span class="line">systemctl restart rsyslog</span><br><span class="line"></span><br><span class="line"><span class="comment"># rsyslog日志级别说明：</span></span><br><span class="line">emerg 0       系统不可用</span><br><span class="line">alert 1       必须马上采取行动的事件</span><br><span class="line">crit 2        关键的事件</span><br><span class="line">err 3        错误事件</span><br><span class="line">warning 4      警告事件</span><br><span class="line">notice 5      普通但重要的事件</span><br><span class="line">info 6       有用的信息</span><br><span class="line">debug 7      调试信息</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;HAProxy简介&quot;&gt;&lt;a href=&quot;#HAProxy简介&quot; class=&quot;headerlink&quot; title=&quot;HAProxy简介&quot;&gt;&lt;/a&gt;HAProxy简介&lt;/h2&gt;&lt;p&gt;HAProxy是法国开发者Willy</summary>
        
      
    
    
    
    <category term="Linux" scheme="https://chensir.ink/categories/Linux/"/>
    
    
    <category term="HAProxy" scheme="https://chensir.ink/tags/HAProxy/"/>
    
  </entry>
  
  <entry>
    <title>Centos7磁盘IOPS压力测试</title>
    <link href="https://chensir.ink/2021/08/30/Centos7%E7%A3%81%E7%9B%98IOPS%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95/"/>
    <id>https://chensir.ink/2021/08/30/Centos7%E7%A3%81%E7%9B%98IOPS%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95/</id>
    <published>2021-08-30T06:15:33.000Z</published>
    <updated>2025-11-26T14:04:32.793Z</updated>
    
    <content type="html"><![CDATA[<h2 id="什么是IOPS"><a href="#什么是IOPS" class="headerlink" title="什么是IOPS"></a>什么是IOPS</h2><p>IOPS（Input&#x2F;Output Per Second）即每秒的输入输出量（或读写次数），是衡量磁盘性能的主要指标之一。</p><p>IOPS是指单位时间内系统能处理的I&#x2F;O请求数量，一般以每秒处理的I&#x2F;O请求数量为单位，I&#x2F;O请求通常为读或写数据操作请求。</p><p><strong>随机读写频繁的应用</strong>：小文件存储（图片）、OLTP数据库、邮件服务器，关注随机写性能，IOPS是关键衡量指标。</p><p><strong>顺序读写频繁的应用</strong>：传输大量连续数据、电视台的视频编辑、视频点播VOD（Video On Demand），关注连续读写性能。数据吞吐量是关键衡量指标。</p><p><strong>IOPS和数据吞吐量适用于不同的场合</strong>：</p><p>读取10000个1KB文件，用时10秒 Throught（吞吐量）&#x3D;1MB&#x2F;s，IOPS&#x3D;1000 追求IOPS</p><p>读取1个10MB文件，用时0.2秒 Throught（吞吐量）&#x3D;50MB&#x2F;s，追求吞吐量</p><p><strong>简而言之：</strong></p><p>磁盘的IOPS，也就是在一秒内，磁盘进行多少次I&#x2F;O读写。</p><p>磁盘的吞吐量，也就是每秒磁盘I&#x2F;O的流量，即磁盘写入加上读出的数据的大小。</p><h2 id="IOPS计算公式"><a href="#IOPS计算公式" class="headerlink" title="IOPS计算公式"></a>IOPS计算公式</h2><p>对于磁盘来说一个完整的IO操作是这样进行的：</p><p>当控制器对磁盘发出一个IO操作命令的时候，磁盘的驱动臂（Actuator Arm）带读写磁头（Head）离开着陆区（Landing Zone，位于内圈没有数据的区域），移动到要操作的初始数据块所在的磁道（Track）的正上方，这个过程被称为<strong>寻址</strong>（Seeking），对应消耗的时间被称为<strong>寻址时间</strong>（Seek Time）；但是找到对应磁道还不能马上读取数据，这时候磁头要等到磁盘盘片（Platter）旋转到初始数据块所在的扇区（Sector）落在读写磁头正上方的之后才能开始读取数据，在这个等待盘片的旋转到可操作性扇区的过程中消耗的时间称为<strong>旋转延时</strong>（Rotational Delay），接下来就随着盘片的旋转，磁头不断的读&#x2F;写相应的数据块，直到完成这次IO所需要操作的全部数据，这个过程称为<strong>数据传送</strong>（Data Transfer），对应的时间称为传送时间（Transfer Time）。完成这三个步骤之后一次IO操作也就完成了。</p><p>硬盘IOPS：是指硬盘每秒的读写次数</p><p>IO时间（读写时间） &#x3D; 磁头移动时间 + 磁盘转动时间 +数据处理时间</p><p>IO时间（读写时间） &#x3D; (磁头移动时间 + 60s&#x2F;转速&#x2F;2 + IOChunkSize&#x2F;传输速度)</p><p>IOPS &#x3D; 1000&#x2F;IO时间</p><p>带宽&#x3D;IOPS*IO大小</p><h2 id="常见磁盘平均物理寻道时间"><a href="#常见磁盘平均物理寻道时间" class="headerlink" title="常见磁盘平均物理寻道时间"></a>常见磁盘平均物理寻道时间</h2><ul><li>7200转&#x2F;分的STAT硬盘平均物理寻道时间是9ms</li><li>10000转&#x2F;分的STAT硬盘平均物理寻道时间是6ms</li><li>15000转&#x2F;分的SAS硬盘平均物理寻道时间是4ms</li></ul><h2 id="常见硬盘的旋转延迟时间"><a href="#常见硬盘的旋转延迟时间" class="headerlink" title="常见硬盘的旋转延迟时间"></a>常见硬盘的旋转延迟时间</h2><ul><li>7200 rpm的磁盘平均旋转延迟大约为60<em>1000&#x2F;7200&#x2F;2 &#x3D; 4.17m</em></li><li>10000 rpm的磁盘平均旋转延迟大约为60<em>1000&#x2F;10000&#x2F;2 &#x3D; 3ms</em></li><li>15000 rpm的磁盘其平均旋转延迟约为60*1000&#x2F;15000&#x2F;2 &#x3D; 2ms</li></ul><h2 id="最大IOPS的理论计算方法"><a href="#最大IOPS的理论计算方法" class="headerlink" title="最大IOPS的理论计算方法"></a>最大IOPS的理论计算方法</h2><p>IOPS &#x3D; 1000 ms&#x2F; (寻道时间 + 旋转延迟)。可以忽略数据传输时间。</p><ul><li>7200 rpm的磁盘IOPS &#x3D; 1000 &#x2F; (9 + 4.17) &#x3D; 76 IOPS</li><li>10000 rpm的磁盘IOPS &#x3D; 1000 &#x2F; (6+ 3) &#x3D; 111 IOPS</li><li>15000 rpm的磁盘IOPS &#x3D; 1000 &#x2F; (4 + 2) &#x3D; 166 IOPS</li></ul><h2 id="Centos7-测试IOPS方法"><a href="#Centos7-测试IOPS方法" class="headerlink" title="Centos7 测试IOPS方法"></a>Centos7 测试IOPS方法</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 安装 FIO压测工具</span></span><br><span class="line">wget http://brick.kernel.dk/snaps/fio-2.0.7.tar.gz</span><br><span class="line"><span class="comment"># 若系统无法上网可配置离线yum仓库</span></span><br><span class="line"><span class="comment"># https://chensir.ink/0abec7f652b7/#配置离线yum仓库</span></span><br><span class="line">yum -y install libaio-devel </span><br><span class="line">tar -zxvf fio-2.0.7.tar.gz</span><br><span class="line"><span class="built_in">cd</span> fio-2.0.7</span><br><span class="line">make  &amp;&amp; make install</span><br></pre></td></tr></table></figure><h3 id="随机读写测试"><a href="#随机读写测试" class="headerlink" title="随机读写测试"></a>随机读写测试</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 4k顺序读</span></span><br><span class="line">fio -filename=/tmp/fiotest  -direct=1 -iodepth 1 -thread -rw=<span class="built_in">read</span> -rwmixread=70 -ioengine=psync -bs=4k -size=5G -numjobs=20 -runtime=60 -group_reporting -name=sqe_100read_4k</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4k顺序写</span></span><br><span class="line">fio -filename=/tmp/fiotest  -direct=1 -iodepth 1 -thread -rw=write -rwmixread=70 -ioengine=psync -bs=4k -size=5G -numjobs=20 -runtime=60 -group_reporting -name=sqe_100write_4k</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4k顺序混合读写</span></span><br><span class="line">fio -filename=/tmp/fiotest  -direct=1 -iodepth 1 -thread -rw=rw -rwmixread=70 -ioengine=psync -bs=4k -size=5G -numjobs=20 -runtime=60 -group_reporting -name=sqe_70read_4k</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4k随机读</span></span><br><span class="line">fio -filename=/tmp/fiotest  -direct=1 -iodepth 1 -thread -rw=randread -rwmixread=70 -ioengine=psync -bs=4k -size=5G -numjobs=20 -runtime=60 -group_reporting -name=rand_100read_4k</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4k随机写</span></span><br><span class="line">fio -filename=/tmp/fiotest  -direct=1 -iodepth 1 -thread -rw=randwrite -rwmixread=70 -ioengine=psync -bs=4k -size=5G -numjobs=20 -runtime=60 -group_reporting -name=rand_100write_4k</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4k随机混合读写</span></span><br><span class="line">fio -filename=/tmp/fiotest  -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=4k -size=5G -numjobs=20 -runtime=60 -group_reporting -name=rand_70read_4k</span><br></pre></td></tr></table></figure><h3 id="测试脚本"><a href="#测试脚本" class="headerlink" title="测试脚本"></a>测试脚本</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># fiopressure.sh</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line">filename=/tmp/fiotest</span><br><span class="line">size=5G</span><br><span class="line">runtime=60</span><br><span class="line">report_path=/var/log/fio.report</span><br><span class="line"><span class="comment"># 4k顺序读</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;&gt;&gt;&gt;正在进行4k顺序读测试&quot;</span></span><br><span class="line">fio -filename=<span class="variable">$filename</span>  -direct=1 -iodepth 1 -thread -rw=<span class="built_in">read</span> -rwmixread=70 -ioengine=psync -bs=4k -size=<span class="variable">$size</span> -numjobs=20 -runtime=<span class="variable">$runtime</span> -group_reporting -name=4k顺序读 &gt; <span class="variable">$report_path</span></span><br><span class="line"><span class="comment"># 4k顺序写</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;&gt;&gt;&gt;正在进行4k顺序写测试&quot;</span></span><br><span class="line">fio -filename=<span class="variable">$filename</span>  -direct=1 -iodepth 1 -thread -rw=write -rwmixread=70 -ioengine=psync -bs=4k -size=<span class="variable">$size</span> -numjobs=20 -runtime=<span class="variable">$runtime</span> -group_reporting -name=4k顺序写 &gt;&gt; <span class="variable">$report_path</span></span><br><span class="line"><span class="comment"># 4k顺序混合读写</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;&gt;&gt;&gt;正在进行4k顺序混合读写测试&quot;</span></span><br><span class="line">fio -filename=<span class="variable">$filename</span>  -direct=1 -iodepth 1 -thread -rw=rw -rwmixread=70 -ioengine=psync -bs=4k -size=<span class="variable">$size</span> -numjobs=20 -runtime=<span class="variable">$runtime</span> -group_reporting -name=4k顺序混合读写 &gt;&gt; <span class="variable">$report_path</span></span><br><span class="line"><span class="comment"># 4k随机读</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;&gt;&gt;&gt;正在进行4k随机读测试&quot;</span></span><br><span class="line">fio -filename=<span class="variable">$filename</span>  -direct=1 -iodepth 1 -thread -rw=randread -rwmixread=70 -ioengine=psync -bs=4k -size=<span class="variable">$size</span> -numjobs=20 -runtime=<span class="variable">$runtime</span> -group_reporting -name=4k随机读 &gt;&gt; <span class="variable">$report_path</span></span><br><span class="line"><span class="comment"># 4k随机写</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;&gt;&gt;&gt;正在进行4k随机写测试&quot;</span></span><br><span class="line">fio -filename=<span class="variable">$filename</span>  -direct=1 -iodepth 1 -thread -rw=randwrite -rwmixread=70 -ioengine=psync -bs=4k -size=<span class="variable">$size</span> -numjobs=20 -runtime=<span class="variable">$runtime</span> -group_reporting -name=4k随机写 &gt;&gt; <span class="variable">$report_path</span></span><br><span class="line"><span class="comment"># 4k随机混合读写</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;&gt;&gt;&gt;正在进行4k随机混合读写测试&quot;</span></span><br><span class="line">fio -filename=<span class="variable">$filename</span>  -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=4k -size=<span class="variable">$size</span> -numjobs=20 -runtime=<span class="variable">$runtime</span> -group_reporting -name=4k随机混合读写 &gt;&gt; <span class="variable">$report_path</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;&gt;&gt;&gt;FIO测试完毕,测试报告位于<span class="variable">$report_path</span>&quot;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="参数说明"><a href="#参数说明" class="headerlink" title="参数说明"></a>参数说明</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 测试文件名称,通常选择需要测试的盘的data目录</span></span><br><span class="line">-filename=/tmp/fiotest</span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试绕过机器自带的buffer，是测试结果更真实</span></span><br><span class="line">-direct=1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试顺序读的I/O</span></span><br><span class="line">-rw=<span class="built_in">read</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试顺序写的I/O</span></span><br><span class="line">-rw=write</span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试顺序混合写和读的I/O</span></span><br><span class="line">-rw=rw</span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试随机读的I/O</span></span><br><span class="line">-rw=randread</span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试随机写的I/O</span></span><br><span class="line">-rw=randwrite</span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试混合随机读和写的I/O</span></span><br><span class="line">-rw=randrw</span><br><span class="line"></span><br><span class="line"><span class="comment"># 单次I/O的块文件大小</span></span><br><span class="line">-bs=4k</span><br><span class="line"></span><br><span class="line"><span class="comment"># 同上，提定数据块的大小范围</span></span><br><span class="line">-bsrange=512-2048</span><br><span class="line"></span><br><span class="line"><span class="comment"># 本次的测试文件大小为5g，以每次4k的io进行测试</span></span><br><span class="line">-size=5g</span><br><span class="line"></span><br><span class="line"><span class="comment"># 本次的测试线程为20</span></span><br><span class="line">-numjobs=20</span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试时间为60秒，如果不写则一直将5g文件分4k每次写完为止</span></span><br><span class="line">-runtime=60</span><br><span class="line"></span><br><span class="line"><span class="comment"># io引擎使用pync方式，如果要使用libaio引擎，需要 yum install libaio-devel包</span></span><br><span class="line">-ioengine=psync</span><br><span class="line"></span><br><span class="line"><span class="comment"># 在混合读写的模式下，写占30%</span></span><br><span class="line">-rwmixwrite=30</span><br><span class="line"></span><br><span class="line"><span class="comment"># 关于显示结果的，汇总每个进程的信息</span></span><br><span class="line">-group_reporting</span><br><span class="line"></span><br><span class="line"><span class="comment"># 此外</span></span><br><span class="line"><span class="comment"># 只使用1g内存进行测试</span></span><br><span class="line">-lockmem=1g</span><br><span class="line"></span><br><span class="line"><span class="comment"># 用0初始化系统buffer</span></span><br><span class="line">-zero_buffers</span><br><span class="line"></span><br><span class="line"><span class="comment"># 每个进程生成文件的数量</span></span><br><span class="line">-nrfiles=8</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="查看测试结果"><a href="#查看测试结果" class="headerlink" title="查看测试结果"></a>查看测试结果</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">io=执行了多少M的IO</span><br><span class="line"></span><br><span class="line">bw=平均IO带宽</span><br><span class="line">iops=IOPS</span><br><span class="line">runt=线程运行时间</span><br><span class="line">slat=提交延迟</span><br><span class="line">clat=完成延迟</span><br><span class="line">lat=响应时间</span><br><span class="line">bw=带宽</span><br><span class="line">cpu=利用率</span><br><span class="line">IO depths=io队列</span><br><span class="line">IO submit=单个IO提交要提交的IO数</span><br><span class="line">IO complete=Like the above submit number, but <span class="keyword">for</span> completions instead.</span><br><span class="line">IO issued=The number of <span class="built_in">read</span>/write requests issued, and how many of them were short.</span><br><span class="line">IO latencies=IO完延迟的分布</span><br><span class="line"></span><br><span class="line">io=总共执行了多少size的IO</span><br><span class="line">aggrb=group总带宽</span><br><span class="line">minb=最小.平均带宽.</span><br><span class="line">maxb=最大平均带宽.</span><br><span class="line">mint=group中线程的最短运行时间.</span><br><span class="line">maxt=group中线程的最长运行时间.</span><br><span class="line"></span><br><span class="line">ios=所有group总共执行的IO数.</span><br><span class="line">merge=总共发生的IO合并数.</span><br><span class="line">ticks=Number of ticks we kept the disk busy.</span><br><span class="line">io_queue=花费在队列上的总共时间.</span><br><span class="line">util=磁盘利用率</span><br></pre></td></tr></table></figure><h2 id="测试吞吐量"><a href="#测试吞吐量" class="headerlink" title="测试吞吐量"></a>测试吞吐量</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">yum -y install hdparm</span><br><span class="line"></span><br><span class="line"><span class="comment"># /dev/sdb1 可修改</span></span><br><span class="line">hdparm -Tt --direct /dev/sdb1</span><br><span class="line"></span><br><span class="line"><span class="comment">#参数说明</span></span><br><span class="line">-t 评估硬盘的读取效率。</span><br><span class="line">-T 评估硬盘快取的读取效率。</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;什么是IOPS&quot;&gt;&lt;a href=&quot;#什么是IOPS&quot; class=&quot;headerlink&quot; title=&quot;什么是IOPS&quot;&gt;&lt;/a&gt;什么是IOPS&lt;/h2&gt;&lt;p&gt;IOPS（Input&amp;#x2F;Output Per</summary>
        
      
    
    
    
    <category term="Linux" scheme="https://chensir.ink/categories/Linux/"/>
    
    
    <category term="磁盘IOPS压测" scheme="https://chensir.ink/tags/%E7%A3%81%E7%9B%98IOPS%E5%8E%8B%E6%B5%8B/"/>
    
    <category term="FIO" scheme="https://chensir.ink/tags/FIO/"/>
    
    <category term="IOPS" scheme="https://chensir.ink/tags/IOPS/"/>
    
  </entry>
  
  <entry>
    <title>MySQL基准测试及性能优化</title>
    <link href="https://chensir.ink/2021/08/25/MySQL%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/"/>
    <id>https://chensir.ink/2021/08/25/MySQL%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/</id>
    <published>2021-08-25T13:49:06.000Z</published>
    <updated>2025-11-26T14:04:32.736Z</updated>
    
    <content type="html"><![CDATA[<h2 id="mysql基准测试"><a href="#mysql基准测试" class="headerlink" title="mysql基准测试"></a>mysql基准测试</h2><h3 id="什么是基准测试"><a href="#什么是基准测试" class="headerlink" title="什么是基准测试"></a>什么是基准测试</h3><p>数据库的基准测试是对数据库的性能指标进行定量的、可复现的、可对比的测试。</p><p><strong>基准测试与压力测试</strong></p><ul><li><strong>基准测试</strong>可以理解为针对系统的一种压力测试。但基准测试不关心业务逻辑，更加简单、直接、易于测试，数据可以由工具生成，不要求真实；</li><li><strong>压力测试</strong>一般考虑业务逻辑(如购物车业务)，要求真实的数据。</li></ul><h3 id="基准测试的作用"><a href="#基准测试的作用" class="headerlink" title="基准测试的作用"></a>基准测试的作用</h3><p>对于多数Web应用，整个系统的瓶颈在于数据库；原因很简单：Web应用中的其他因素，例如网络带宽、负载均衡节点、应用服务器（包括CPU、内存、硬盘灯、连接数等）、缓存，都很容易通过水平的扩展（俗称加机器）来实现性能的提高。而对于MySQL，由于数据一致性的要求，无法通过增加机器来分散向数据库写数据带来的压力；虽然可以通过前置缓存（Redis等）、读写分离、分库分表来减轻压力，但是与系统其它组件的水平扩展相比，受到了太多的限制。</p><p>而对数据库的基准测试的作用，就是分析在当前的配置下（包括硬件配置、OS、数据库设置等），数据库的性能表现，从而找出MySQL的性能阈值，并根据实际系统的要求调整配置。</p><h3 id="基准测试的指标"><a href="#基准测试的指标" class="headerlink" title="基准测试的指标"></a>基准测试的指标</h3><p>常见的数据库指标包括：</p><ul><li>TPS&#x2F;QPS：衡量吞吐量。</li><li>响应时间：包括平均响应时间、最小响应时间、最大响应时间、时间百分比等，其中时间百分比参考意义较大，如前95%的请求的最大响应时间。。</li><li>并发量：同时处理的查询请求的数量。</li></ul><h3 id="基准测试的分类"><a href="#基准测试的分类" class="headerlink" title="基准测试的分类"></a>基准测试的分类</h3><p>对MySQL的基准测试，有如下两种思路：</p><ul><li><p>针对整个系统的基准测试：通过http请求进行测试，如通过浏览器、APP或postman等测试工具。该方案的优点是能够更好的针对整个系统，测试结果更加准确；缺点是设计复杂实现困难。</p></li><li><p>只针对MySQL的基准测试：优点和缺点与针对整个系统的测试恰好相反。在针对MySQL进行基准测试时，一般使用专门的工具进行，例如mysqlslap、sysbench等。其中，sysbench比mysqlslap更通用、更强大，且更适合Innodb（因为模拟了许多Innodb的IO特性）</p></li></ul><h2 id="常见的MySQL压力测试工具"><a href="#常见的MySQL压力测试工具" class="headerlink" title="常见的MySQL压力测试工具"></a>常见的MySQL压力测试工具</h2><ul><li><p>mysqlslap</p></li><li><p>Sysbench</p><p>功能强大，官网：<a href="https://github.com/akopytov/sysbench">https://github.com/akopytov/sysbench</a></p></li><li><p>tpcc-mysql</p></li><li><p>MySQL Benchmark Suite</p></li><li><p>MySQL super-smack</p></li><li><p>MyBench</p></li></ul><h2 id="mysqlslap-压测"><a href="#mysqlslap-压测" class="headerlink" title="mysqlslap(压测)"></a>mysqlslap(压测)</h2><p>官方介绍：<a href="https://dev.mysql.com/doc/refman/5.7/en/mysqlslap.html">https://dev.mysql.com/doc/refman/5.7/en/mysqlslap.html</a></p><p>mysqlslap，mysqlslap是MySQL5.1.4之后自带的benchmark基准测试工具，该工具可以模拟多个客户端同时并发的向服务器发出查询更新，给出了性能测试数据而且提供了多种引擎的性能比较。测试的过程默认生成一个mysqlslap的schema，生成测试表T1，查询和插入测试数据，mysqlslap库自动生成，如果已经存在则先删除。用–only-print来打印实际的测试过程，整个测试完成后不会在数据库中留下痕迹。</p><p>使用格式：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">mysqlslap [options]</span><br></pre></td></tr></table></figure><h3 id="常用参数-options-说明"><a href="#常用参数-options-说明" class="headerlink" title="常用参数[options]说明"></a>常用参数[options]说明</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 自动生成测试表和测试数据，表示用mysqlslap工具自己生成的SQL脚本来测试并发压力</span></span><br><span class="line">--auto-generate-sql, -a </span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试语句的类型。代表要测试的环境是读操作还是写操作 还是两者混合。取值包括：read，key，write，update和mixed（默认）</span></span><br><span class="line">--auto-generate-sql-load-type=<span class="built_in">type</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 代表对生成的表自动添加auto_increment列，从5.1.18版开始支持</span></span><br><span class="line">--auto-generate-sql-add-autoincrement</span><br><span class="line"></span><br><span class="line"><span class="comment"># 自动生成的测试表中包含多少个字符类型的列，默认1</span></span><br><span class="line">--number-char-cols=N, -x N</span><br><span class="line"></span><br><span class="line"><span class="comment"># 自动生成的测试表中包含多少个数据类型的列，默认1</span></span><br><span class="line">--number-int-cols=N, -y N</span><br><span class="line"></span><br><span class="line"><span class="comment"># 总的测试查询次数（并发客户数*每客户查询次数）</span></span><br><span class="line">--number-of-queries=N</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用自定义脚本执行测试，例如可以调用自定义的存储过程或SQL语句来执行测试</span></span><br><span class="line">--query=name， -q</span><br><span class="line"></span><br><span class="line"><span class="comment"># 代表自定义的测试库名，测试的schema</span></span><br><span class="line">--create-schema</span><br><span class="line"></span><br><span class="line"><span class="comment"># 多少条DML提交一次</span></span><br><span class="line">--commit=N</span><br><span class="line"></span><br><span class="line"><span class="comment"># 如服务器和客户端都支持压缩，则压缩信息</span></span><br><span class="line">--compress, -C</span><br><span class="line"></span><br><span class="line"><span class="comment"># 表示并发量，即模拟多少个客户端同时执行select，可指定多个值，以逗号或 --delimiter参数指定值作为分隔符，如：--concurrency=100,200,500</span></span><br><span class="line">--concurrency=N, -c N</span><br><span class="line"></span><br><span class="line"><span class="comment"># 代表要测试的引擎，可以有多个，用分隔符隔开。如：--engines=myisam，Innodb</span></span><br><span class="line">--engine=engine_name, -e engine_name</span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试执行的迭代次数，代表要在不同并发环境下，各自运行测试多少次</span></span><br><span class="line">--iterations=N, -i N</span><br><span class="line"></span><br><span class="line"><span class="comment"># 只打印测试语句而不实际执行</span></span><br><span class="line">--only-print</span><br><span class="line"></span><br><span class="line"><span class="comment"># 执行N条语句后断开重连</span></span><br><span class="line">--detach=N</span><br><span class="line"></span><br><span class="line"><span class="comment"># 打印内存和CPU的相关信息</span></span><br><span class="line">--debug-info, -T</span><br></pre></td></tr></table></figure><h3 id="运行结果各项含义"><a href="#运行结果各项含义" class="headerlink" title="运行结果各项含义"></a>运行结果各项含义</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 运行所有语句的平均秒数</span></span><br><span class="line">Average number of …</span><br><span class="line"></span><br><span class="line"><span class="comment"># 运行所有语句的最小秒数</span></span><br><span class="line">Minimum number of …</span><br><span class="line"></span><br><span class="line"><span class="comment"># 运行所有语句的最大秒数</span></span><br><span class="line">Maximum number of …</span><br><span class="line"></span><br><span class="line"><span class="comment"># 客户端数量</span></span><br><span class="line">Number of clients …</span><br><span class="line"></span><br><span class="line"><span class="comment"># 每个客户端运行查询的平均数</span></span><br><span class="line">Average number of queries per client</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="mysqslap示例"><a href="#mysqslap示例" class="headerlink" title="mysqslap示例"></a>mysqslap示例</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 单线程测试</span></span><br><span class="line">mysqlslap -a -uroot -p123456</span><br><span class="line"></span><br><span class="line"><span class="comment"># 多线程测试 使用 --concurrency来模拟并发连接</span></span><br><span class="line">mysqlslap -a -c 100 -uroot -p123456</span><br><span class="line"></span><br><span class="line"><span class="comment"># 迭代测试 用于需要多次执行测试得到平均值</span></span><br><span class="line">mysqlslap -a -i 10 -uroot -p123456</span><br><span class="line">mysqlslap --auto-generate-sql-add-autoincrement -a -uroot -p123456</span><br><span class="line">mysqlslap -a --auto-generate-sql-load-type=<span class="built_in">read</span> -uroot -p123456</span><br><span class="line">mysqlslap -a --auto-generate-sql-secondary-indexes=3 -uroot -p123456</span><br><span class="line">mysqlslap -a --auto-generate-sql-write-number=1000 -uroot -p123456</span><br><span class="line">mysqlslap --create-schema world -q <span class="string">&quot;select count(*) from city&quot;</span> -uroot -p123456</span><br><span class="line">mysqlslap -a -e innodb -uroot -p123456</span><br><span class="line">mysqlslap -a --number-of-queries=10 -uroot -p123456</span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试同时不同的存储引擎的性能进行对比</span></span><br><span class="line">mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --engine=myisam,innodb -uroot -p123456</span><br><span class="line"></span><br><span class="line"><span class="comment"># 执行一次测试，分别50，100个并发，执行1000次总查询</span></span><br><span class="line">mysqlslap -a --concurrency=50,100 --number-of-queries 1000 -uroot -p123456</span><br><span class="line"></span><br><span class="line"><span class="comment"># 50和100个并发分别得到一次测试结果（Benchmark），并发数越多，执行完所有查询的时间越长。为了准确起见，可以多迭代测试几次</span></span><br><span class="line">mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 -uroot -p123456</span><br></pre></td></tr></table></figure><h2 id="Sysbench-压测"><a href="#Sysbench-压测" class="headerlink" title="Sysbench(压测)"></a>Sysbench(压测)</h2><p>sysbench是跨平台的基准测试工具，支持多线程，支持多种数据库；主要包括以下几种测试</p><ul><li>cpu性能</li><li>磁盘io性能</li><li>调度程序性能</li><li>内存分配及传输速度</li><li>POSIX线程性能</li><li>数据库性能(OLTP基准测试)</li></ul><p>本文主要介绍对数据库性能的测试</p><h3 id="安装Sysbench"><a href="#安装Sysbench" class="headerlink" title="安装Sysbench"></a>安装Sysbench</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 下载并解压</span></span><br><span class="line">wget https://github.com/akopytov/sysbench/archive/refs/tags/1.0.20.tar.gz -O <span class="string">&quot;sysbench-1.0.20.tar.gz&quot;</span></span><br><span class="line">tar -zxvf sysbench-1.0.20.tar.gz</span><br><span class="line"><span class="built_in">cd</span> sysbench-1.0.20</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装依赖</span></span><br><span class="line">yum install -y automake libtool</span><br><span class="line"></span><br><span class="line"><span class="comment"># 开始编译安装（安装前确认在sysbench-1.0.20目录下）</span></span><br><span class="line">./autogen.sh</span><br><span class="line">./configure</span><br><span class="line"></span><br><span class="line"><span class="comment"># 这里换成服务器中mysql路径下的include</span></span><br><span class="line"><span class="built_in">export</span> LD_LIBRARY_PATH=/mitr/baseProgram/mysql/include</span><br><span class="line">make &amp;&amp; make install</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看版本确认是否安装成功</span></span><br><span class="line">sysbench --version</span><br></pre></td></tr></table></figure><h3 id="安装时遇到的问题"><a href="#安装时遇到的问题" class="headerlink" title="安装时遇到的问题"></a>安装时遇到的问题</h3><h4 id="查看版本时报错"><a href="#查看版本时报错" class="headerlink" title="查看版本时报错"></a>查看版本时报错</h4><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">sysbench: error <span class="keyword">while</span> loading shared libraries: libmysqlclient.so.20: cannot open shared object file: No such file or directory</span><br></pre></td></tr></table></figure><h5 id="解决方法"><a href="#解决方法" class="headerlink" title="解决方法"></a>解决方法</h5><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 查看动态链接库</span></span><br><span class="line">ldconfig -p | grep mysql</span><br><span class="line"></span><br><span class="line"><span class="comment"># /mitr/baseProgram/mysql/lib/libmysqlclient.so.20在自定义mysql安装位置下</span></span><br><span class="line"><span class="built_in">ln</span> -s /mitr/baseProgram/mysql/lib/libmysqlclient.so.20 /usr/lib</span><br><span class="line">ldconfig</span><br><span class="line"></span><br><span class="line"><span class="comment"># 再次查看动态链接库</span></span><br><span class="line">ldconfig -p | grep mysql</span><br><span class="line"></span><br><span class="line"><span class="comment"># 然后再次查看版本号即可</span></span><br><span class="line">sysbench --version</span><br></pre></td></tr></table></figure><h6 id="ldconfig"><a href="#ldconfig" class="headerlink" title="ldconfig"></a>ldconfig</h6><p>ldconfig命令的用途主要是在默认搜寻目录&#x2F;lib和&#x2F;usr&#x2F;lib以及动态库配置文件&#x2F;etc&#x2F;ld.so.conf内所列的目录下，搜索出可共享的动态链接库（格式如lib*.so*）,进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为&#x2F;etc&#x2F;ld.so.cache，此文件保存已排好序的动态链接库名字列表，为了让动态链接库为系统所共享，需运行动态链接库的管理命令ldconfig，此执行程序存放在&#x2F;sbin目录下</p><p>ldconfig几个需要注意的地方：</p><ul><li>往&#x2F;lib和&#x2F;usr&#x2F;lib里面加东西，是不用修改&#x2F;etc&#x2F;ld.so.conf的，但是完了之后要调一下ldconfig，不然这个library会找不到。</li><li>在上面两个目录以外加东西的时候，一定要修改&#x2F;etc&#x2F;ld.so.conf，然后再调用ldconfig，不然也会找不到。比如安装了一个mysql到&#x2F;usr&#x2F;local&#x2F;mysql，mysql有一大堆library在&#x2F;usr&#x2F;local&#x2F;mysql&#x2F;lib下面</li><li>如果想在这两个目录以外放lib，但是又不想在&#x2F;etc&#x2F;ld.so.conf中加东西（或者是没有权限加东西）。那也可以，就是export一个全局变量LD_LIBRARY_PATH，然后运行程序的时候就会去这个目录中找library。一般来讲这只是一种临时的解决方案，在没有权限或临时需要的时候使用。</li><li>ldconfig做的这些东西都与运行程序时有关，跟编译时一点关系都没有。编译的时候还是该加-L就得加，不要混淆了。</li><li>总之，就是不管做了什么关于library的变动后，最好都ldconfig一下，不然会出现一些意想不到的结果。不会花太多的时间，但是会省很多的事。</li><li>再有，诸如libdb-4.3.so文件头中是会含有库名相关的信息的（即含“libdb-4.3.so”，可用strings命令查看），因此仅通过修改文件名以冒充某已被识别的库（如libdb-4.8.so）是行不通的。为此可在编译库的Makefile中直接修改配置信息，指定特别的库名。</li></ul><h4 id="执行-configure报错：cannot-find-lmysqlclient-r"><a href="#执行-configure报错：cannot-find-lmysqlclient-r" class="headerlink" title="执行.&#x2F;configure报错：cannot find -lmysqlclient_r"></a>执行.&#x2F;configure报错：cannot find -lmysqlclient_r</h4><h5 id="解决方法-1"><a href="#解决方法-1" class="headerlink" title="解决方法"></a>解决方法</h5><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 安装mysql-devel</span></span><br><span class="line">yum install mysql-devel</span><br><span class="line"><span class="comment"># 重新执行./configure 继续安装即可</span></span><br></pre></td></tr></table></figure><h3 id="sysbench语法"><a href="#sysbench语法" class="headerlink" title="sysbench语法"></a>sysbench语法</h3><p>执行sysbench –help，可以看到sysbench的详细使用方法。sysbench的基本语法如下：</p><p><strong>sysbench [options]… [testname] [command]</strong></p><p><strong>command</strong>是sysbench要执行的命令，包括prepare、run和cleanup，顾名思义，prepare是为测试提前准备数据，run是执行正式的测试，cleanup是在测试完成后对数据库进行清理。</p><p><strong>testname</strong>指定了要进行的测试，在老版本的sysbench中，可以通过<code>--test</code>参数指定测试的脚本；而在新版本中，<code>--test</code>参数已经声明为废弃，可以不使用–test，而是直接指定脚本。</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 如以下两种写法效果是一样的</span></span><br><span class="line">sysbench --<span class="built_in">test</span>=/usr/local/share/sysbench/tests/include/oltp_legacy/oltp.lua</span><br><span class="line">sysbench /usr/local/share/sysbench/tests/include/oltp_legacy/oltp.lua</span><br></pre></td></tr></table></figure><p>测试时使用的脚本为lua脚本，可以使用sysbench自带脚本，也可以自己开发。对于大多数应用，使用sysbench自带的脚本就足够了。不同版本的sysbench中，lua脚本的位置可能不同可以使用locate进行搜索</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 安装locate工具</span></span><br><span class="line">yum install -y mlocate</span><br><span class="line"></span><br><span class="line"><span class="comment"># 搜索</span></span><br><span class="line">updatedb</span><br><span class="line">locate oltp.lua</span><br></pre></td></tr></table></figure><p><strong>option</strong> 是sysbench的参数，一下是比较常用的参数</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># mysql连接参数</span></span><br><span class="line">--mysql-host <span class="comment"># mysql服务器主机名/IP</span></span><br><span class="line">--mysql-port <span class="comment"># mysql服务端口,默认3306</span></span><br><span class="line">--mysql-user <span class="comment"># mysql用户名</span></span><br><span class="line">--mysql-password <span class="comment"># mysql密码</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysql执行参数</span></span><br><span class="line"><span class="comment"># 执行模式：simple(简单查询语句)、nontrx(查询,插入,更新 不使用事务)、complex(默认,增删改查,使用事务)</span></span><br><span class="line">--oltp-test-mode </span><br><span class="line">--oltp-tables-count <span class="comment"># 测试表的数量</span></span><br><span class="line">--oltp-table-size <span class="comment"># 测试表的大小(数据量)</span></span><br><span class="line">--threads <span class="comment"># 客户端并发连接数</span></span><br><span class="line">--<span class="keyword">time</span> <span class="comment"># 测试执行的时间,单位是秒,该值不要太短,可以使120</span></span><br><span class="line">--report-interval <span class="comment"># 生成报告的时间间隔,单位是秒,如10</span></span><br></pre></td></tr></table></figure><h3 id="sysbench使用注意"><a href="#sysbench使用注意" class="headerlink" title="sysbench使用注意"></a>sysbench使用注意</h3><ul><li>尽量不要在MySQL服务器运行的机器上进行测试，一方面可能无法体现网络（哪怕是局域网）的影响，另一方面，sysbench的运行（尤其是设置的并发数较高时）会影响MySQL服务器的表现。</li><li>可以逐步增加客户端的并发连接数（–thread参数），观察在连接数不同情况下，MySQL服务器的表现；如分别设置为10,20,50,100等。</li><li>一般执行模式选择complex即可，如果需要特别测试服务器只读性能，或不使用事务时的性能，可以选择simple模式或nontrx模式。</li><li>如果连续进行多次测试，注意确保之前测试的数据已经被清理干净。</li></ul><h3 id="sysbench测试mysql-TPS-QPS"><a href="#sysbench测试mysql-TPS-QPS" class="headerlink" title="sysbench测试mysql TPS&#x2F;QPS"></a>sysbench测试mysql TPS&#x2F;QPS</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 创建用于测试的数据库</span></span><br><span class="line">mysql&gt; create database sbtest;</span><br><span class="line"></span><br><span class="line"><span class="comment"># (执行模式为complex,使用10张表,每张表有100万条数据,客户端并发的线程为100,执行时间为300秒,每10秒生成一次报告)</span></span><br><span class="line"><span class="comment"># 准备数据</span></span><br><span class="line">sysbench /usr/local/share/sysbench/tests/include/oltp_legacy/oltp.lua --mysql-host=10.0.0.68 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --oltp-test-mode=complex --oltp-tables-count=10 --oltp-table-size=1000000 --threads=100 --<span class="keyword">time</span>=300 --report-interval=10 prepare</span><br><span class="line"></span><br><span class="line"><span class="comment"># 执行测试</span></span><br><span class="line">sysbench /usr/local/share/sysbench/tests/include/oltp_legacy/oltp.lua --mysql-host=10.0.0.68 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --oltp-test-mode=complex --oltp-tables-count=10 --oltp-table-size=1000000 --threads=100 --<span class="keyword">time</span>=300 --report-interval=10 run &gt;&gt; /root/mysysbench.log</span><br><span class="line"></span><br><span class="line"><span class="comment"># 清理数据(清除数据一定要指定--oltp-tables-count --oltp-table-size 并与准备数据和执行时的一致)</span></span><br><span class="line">sysbench /usr/local/share/sysbench/tests/include/oltp_legacy/oltp.lua --mysql-host=10.0.0.68 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --oltp-tables-count=10 --oltp-table-size=1000000 cleanup</span><br></pre></td></tr></table></figure><h3 id="sysbench测试mysql脚本"><a href="#sysbench测试mysql脚本" class="headerlink" title="sysbench测试mysql脚本"></a>sysbench测试mysql脚本</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># mysqlpressure.sh</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line">oltp_path=/usr/local/share/sysbench/tests/include/oltp_legacy/oltp.lua</span><br><span class="line">host=10.0.0.68</span><br><span class="line">port=3306</span><br><span class="line">user=root</span><br><span class="line">password=123456</span><br><span class="line">oltp_tables_count=10</span><br><span class="line">oltp_table_size=100000</span><br><span class="line">threads=50</span><br><span class="line">test_time=120</span><br><span class="line">report_path=/var/log/sysbench.report</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;&gt;&gt;&gt;正在准备测试数据&gt;&gt;&gt;&quot;</span></span><br><span class="line">sysbench <span class="variable">$oltp_path</span> --mysql-host=<span class="variable">$host</span> --mysql-port=<span class="variable">$port</span> --mysql-user=<span class="variable">$user</span> --mysql-password=<span class="variable">$password</span> --oltp-test-mode=complex --oltp-tables-count=<span class="variable">$oltp_tables_count</span> --oltp-table-size=<span class="variable">$oltp_table_size</span> --threads=<span class="variable">$threads</span> --report-interval=10 prepare</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;&gt;&gt;&gt;正在进行压力测试&gt;&gt;&gt;&quot;</span></span><br><span class="line">sysbench <span class="variable">$oltp_path</span> --mysql-host=<span class="variable">$host</span> --mysql-port=<span class="variable">$port</span> --mysql-user=<span class="variable">$user</span> --mysql-password=<span class="variable">$password</span> --oltp-test-mode=complex --oltp-tables-count=<span class="variable">$oltp_tables_count</span> --oltp-table-size=<span class="variable">$oltp_table_size</span> --threads=<span class="variable">$threads</span> --<span class="keyword">time</span>=<span class="variable">$test_time</span> --report-interval=10 run &gt;<span class="variable">$report_path</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;&gt;&gt;&gt;正在进行测试数据清理&gt;&gt;&gt;&quot;</span></span><br><span class="line">sysbench <span class="variable">$oltp_path</span> --mysql-host=<span class="variable">$host</span> --mysql-port=<span class="variable">$port</span> --mysql-user=<span class="variable">$user</span> --mysql-password=<span class="variable">$password</span> --oltp-test-mode=complex --oltp-tables-count=<span class="variable">$oltp_tables_count</span> --oltp-table-size=<span class="variable">$oltp_table_size</span> cleanup</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;&gt;&gt;&gt;压力测试完毕测试报告位于<span class="variable">$report_path</span>&quot;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="sysbench解读测试报告"><a href="#sysbench解读测试报告" class="headerlink" title="sysbench解读测试报告"></a>sysbench解读测试报告</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">SQL statistics:</span><br><span class="line">    queries performed:</span><br><span class="line">        <span class="built_in">read</span>: <span class="comment"># 读总数</span></span><br><span class="line">        write: <span class="comment"># 写总数</span></span><br><span class="line">        other: <span class="comment"># 其他操作总数(SELECT、INSERT、UPDATE、DELETE之外的操作，例如COMMIT等)</span></span><br><span class="line">        total: <span class="comment"># 全部总数</span></span><br><span class="line">    transactions: <span class="comment"># TPS 总事务数(每秒事务数)</span></span><br><span class="line">    queries: <span class="comment"># QPS 查询总数（每秒查询数)</span></span><br><span class="line">    ignored errors: <span class="comment"># 总忽略错误总数(每秒忽略错误次数)</span></span><br><span class="line">    reconnects: <span class="comment"># 重连总数(每秒重连次数)</span></span><br><span class="line">    </span><br><span class="line">General statistics:</span><br><span class="line">    total <span class="keyword">time</span>: <span class="comment"># 总耗时</span></span><br><span class="line">    total number of events: <span class="comment"># 共发生多少事务数</span></span><br><span class="line"></span><br><span class="line">Latency (ms):</span><br><span class="line">         min: <span class="comment"># 最小耗时</span></span><br><span class="line">         avg: <span class="comment"># 平均耗时</span></span><br><span class="line">         max: <span class="comment"># 最长耗时</span></span><br><span class="line">         95th percentile: <span class="comment"># 超过95%平均耗时</span></span><br><span class="line">         <span class="built_in">sum</span>: </span><br><span class="line"></span><br><span class="line">Threads fairness: <span class="comment"># 并发统计</span></span><br><span class="line">    events (avg/stddev): <span class="comment"># 总处理事件数/标准偏差</span></span><br><span class="line">    execution <span class="keyword">time</span> (avg/stddev): <span class="comment"># 总执行时间/标准偏差</span></span><br></pre></td></tr></table></figure><p>其中mysql测试主要关注 ：</p><ul><li>queries：查询总数及qps</li><li>transactions：事务总数及tps</li><li>Latency-95th percentile：前95%的请求的最大响应时间</li></ul><h2 id="FIO-磁盘压测工具"><a href="#FIO-磁盘压测工具" class="headerlink" title="FIO(磁盘压测工具)"></a>FIO(磁盘压测工具)</h2><p>详见 <a href="https://chensir.ink/ea69ccc9cc30/">Centos7磁盘IOPS压力测试</a></p><h2 id="服务器资源监控工具nmon"><a href="#服务器资源监控工具nmon" class="headerlink" title="服务器资源监控工具nmon"></a>服务器资源监控工具nmon</h2><blockquote><p>nmon 是 <strong>N</strong>igel’s performance <strong>M</strong>onitor for <strong>L</strong>inux(nigel 的 Linux 性能监控器)的英文缩写；它有<strong>三种</strong>运行模式，分别是：<strong>实时屏幕模式、数据收集模式、定时计划执行模式</strong>；这款工具运行时，本身资源消耗很小，而且监控的资源种类比较多，使用非常简单，所以，在没有搭建专业的监控平台时，很多人都会想到用它来监控服务器</p></blockquote><h2 id="nmon安装与使用"><a href="#nmon安装与使用" class="headerlink" title="nmon安装与使用"></a>nmon安装与使用</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 查看centos的发行版本</span></span><br><span class="line"><span class="built_in">cat</span> /etc/redhat-release</span><br><span class="line"></span><br><span class="line"><span class="comment"># 根据版本在nmon的下载页面下载对应版本，然后解压即可</span></span><br><span class="line"><span class="comment"># nmon：http://nmon.sourceforge.net/pmwiki.php?n=Site.Download&amp;utm_source=testingpai.com</span></span><br><span class="line">yum install -y wget </span><br><span class="line"></span><br><span class="line"><span class="comment"># centos7 对应版本</span></span><br><span class="line">wget https://jaist.dl.sourceforge.net/project/nmon/nmon16m_helpsystems.tar.gz</span><br><span class="line"></span><br><span class="line"><span class="comment"># 解压</span></span><br><span class="line">tar -zxvf nmon16m_helpsystems.tar.gz</span><br><span class="line"></span><br><span class="line"><span class="built_in">cp</span> nmon_x86_64_centos7 /usr/local/bin/nmon</span><br><span class="line"><span class="built_in">chmod</span> +x /usr/local/bin/nmon</span><br></pre></td></tr></table></figure><h4 id="实时屏幕模式"><a href="#实时屏幕模式" class="headerlink" title="实时屏幕模式"></a>实时屏幕模式</h4><p>直接执行nmon，开启nmon的实时屏幕展示模式</p><p><strong>参数说明</strong></p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">c <span class="comment"># 带条形图的 CPU 利用率统计信息（CPU 核心线程）</span></span><br><span class="line">m <span class="comment"># 内存和交换统计</span></span><br><span class="line">d <span class="comment"># 磁盘 I/O 繁忙百分比 &amp; 每秒读\写数据量 KB/s 图</span></span><br><span class="line">r <span class="comment"># 资源：机器类型，名称，缓存详细信息和操作系统版本以及 Distro + LPAR</span></span><br><span class="line">t <span class="comment"># top 进程，1 基础、3 性能、4 大小、5 I/O 仅 root 用户可用</span></span><br><span class="line">n <span class="comment"># 网络统计信息和错误（如果没有错误，则消失）</span></span><br><span class="line">j <span class="comment"># 文件系统，包括日记文件系统</span></span><br><span class="line">k <span class="comment"># 内核统计信息运行队列，上下文切换，派生，平均负载和正常运行时间</span></span><br><span class="line">U <span class="comment"># CPU 使用率统计信息 user, user_nice, system, idle, iowait, irq, softirq, steal, guest, guest_nice</span></span><br><span class="line">u <span class="comment"># 进程详细信息</span></span><br><span class="line"></span><br><span class="line">可以连续输入参数 例如：cmdU</span><br></pre></td></tr></table></figure><h4 id="数据收集模式"><a href="#数据收集模式" class="headerlink" title="数据收集模式"></a>数据收集模式</h4><p>执行nmon -f，开启nmon的数据收集模式，该命令不在后面跟参数，则默认为 -s300 -c288</p><p>注：直接执行这个命令，后面不带参数，该命令将在后台持续执行24小时，手机24小时资源使用情况</p><p><strong>参数说明</strong></p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">-f <span class="comment"># 标准输出到表格文件，默认 -s300 -c288 ，为 24 小时，输出文件格式为：hostname_YMD_HHMM.nmon</span></span><br><span class="line">-F <span class="comment"># 类似-f，但是支持指定输出文件的名称</span></span><br><span class="line">-a <span class="comment"># GPU 加速，统计信息</span></span><br><span class="line">-b <span class="comment"># 切换黑白 和彩色模式</span></span><br><span class="line">-c <span class="comment"># 总统计次数</span></span><br><span class="line">-s <span class="comment"># 数据统计间隔时间， 单位为：秒</span></span><br><span class="line">-d <span class="comment"># 最大的磁盘数，默认 256</span></span><br><span class="line">-D <span class="comment"># 与-g 一起使用以添加磁盘等待/服务时间和运行中状态</span></span><br><span class="line">-g <span class="comment"># 用户定义的磁盘组获取数据：生成 BBBG 和 DG 行</span></span><br><span class="line">-J <span class="comment"># 关闭日志文件系统统计信息收集（可能导致自动挂载 NFS 出现问题）</span></span><br><span class="line">-m <span class="comment"># 把输出文件保存到指定文件夹。通过 cron 启动 nmon 时有用</span></span><br><span class="line">-M <span class="comment"># 为每个 CPU 线程添加 MHz 统计信息。 某些 POWER8 型号 CPU 内核的频率可能不同</span></span><br><span class="line">-N <span class="comment"># 包括适用于 V2，V3 和 V4 的 NFS 网络文件系统</span></span><br><span class="line">-p <span class="comment"># nmon 启动时将输出 PID。 在脚本中很有用，可捕获 PID 以便以后安全停止</span></span><br><span class="line">-r <span class="comment"># 在基准测试中用于记录运行详细信息，以供以后分析[默认主机名]</span></span><br><span class="line">-t <span class="comment"># 在输出中包括 top 流程</span></span><br><span class="line">-T <span class="comment"># -t 增强，它将命令行参数保存在 UARG 部分中</span></span><br><span class="line">-U <span class="comment"># 包括 Linux 10 CPU 使用率统计信息（文件中的 CPUUTIL 行）</span></span><br></pre></td></tr></table></figure><p>常用参数 -f -s -c -m -p</p><h5 id="常用案例"><a href="#常用案例" class="headerlink" title="常用案例"></a>常用案例</h5><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 监控服务器，将结果标准输出，命令将后台持续运行24小时</span></span><br><span class="line">nmon -f</span><br><span class="line"></span><br><span class="line"><span class="comment"># 每隔3秒收集一次，收集10次，将结果标准输出</span></span><br><span class="line">nmon -f -s3 -c10</span><br><span class="line"></span><br><span class="line"><span class="comment"># 每隔3秒收集一次，收集10次，将结果标准输出到指定路径，注意：文件夹要存在</span></span><br><span class="line">nmon -f -s3 -c10 -m /tmp/nmon</span><br></pre></td></tr></table></figure><h4 id="定时计划执行模式"><a href="#定时计划执行模式" class="headerlink" title="定时计划执行模式"></a>定时计划执行模式</h4><p>nmon -x 开启定时计划执行模式，若后面不添加任何参数，默认为-s900 -c96 即每隔900秒获取一次数据，总共执行96次，也就是24小时，收集的数据结果将采用标准输出</p><p>使用-X参数，默认为-s30 -c120 即每隔30秒获取一次数据共执行120次，也就是1小时，收集的数据结果采用标准输出</p><p>-z 用root账户运行，收集1天数据，输出到&#x2F;var&#x2F;perf&#x2F;tmp文件夹</p><h4 id="查看结果"><a href="#查看结果" class="headerlink" title="查看结果"></a>查看结果</h4><p><strong>标准输出结果查看</strong></p><p>nmon的标准输出结果文件为：主机名_年月日_时分。nmon是一种文本数据文件，可以用文本编辑器打开，但不便于阅读，可以使用nmon的analysis工具打开</p><ul><li>本地电脑下载 nmon_analysis:</li></ul><p><a href="http://nmon.sourceforge.net/pmwiki.php?n=Site.Nmon-Analyser&utm_source=testingpai.com">http://nmon.sourceforge.net/pmwiki.php?n=Site.Nmon-Analyser&amp;utm_source=testingpai.com</a></p><ul><li><p>解压刚刚下载的tar包</p></li><li><p>从Linux服务器上下载nmon标准输出文件到本地电脑</p></li><li><p>使用Excel打开刚刚解压的nmon analyser v**.xlsm文件，启用宏</p></li></ul><ul><li>点击 【Analyze nmon data】按钮，选择从服务器上下载的 nmon 文件，将会自动分析，生成一个 xlsx 的文件，保存，自动会用 Excel 打开，打开我们就能看到多个图表</li></ul><p>如果生成的nmon标准输出文件过大，可以使用其他工具：如 nmonchar.tar</p><p><a href="http://nmon.sourceforge.net/pmwiki.php?n=Site.Nmonchart&utm_source=testingpai.com">http://nmon.sourceforge.net/pmwiki.php?n=Site.Nmonchart&amp;utm_source=testingpai.com</a></p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 需要安装ksh</span></span><br><span class="line">yum install -y ksh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载之后解压并进入到nmonchart40</span></span><br><span class="line">./nmonchart 被分析的nmon文件.nmon 生成结果文件.html</span><br><span class="line"></span><br><span class="line"><span class="comment"># 将生成的html文件下载到本地机器即可查看</span></span><br></pre></td></tr></table></figure><h2 id="生产环境-my-cnf-配置案例-未完待续"><a href="#生产环境-my-cnf-配置案例-未完待续" class="headerlink" title="生产环境 my.cnf 配置案例(未完待续)"></a>生产环境 my.cnf 配置案例(未完待续)</h2><p>配置文件生成工具参考链接：<a href="https://imysql.com/my_cnf_generator">https://imysql.com/my_cnf_generator</a></p><p>计算mysql占用内存大小链接：<a href="http://www.mysqlcalculator.com/">http://www.mysqlcalculator.com</a></p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment"># 设置服务端使用的字符集</span></span><br><span class="line">character_set_server=utf8mb4</span><br><span class="line"></span><br><span class="line"><span class="comment"># 禁止域名解析</span></span><br><span class="line">skip_name_resolve=1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 客户端连接失败次数，阻止客户端暴力破解密码 默认100</span></span><br><span class="line"><span class="comment"># 每个客户端连接最大的错误允许数量，当超过该次数，MySql服务器将禁止此主机的连接请求，直到MySQL服务器重启或通过flush hosts命令清空此主机的相关信息</span></span><br><span class="line"><span class="comment"># 需要配合 skip_name_resolve=1 一起用才会生效</span></span><br><span class="line">max_connect_errors=100</span><br><span class="line"></span><br><span class="line"><span class="comment"># 最大客户端连接数 默认值 151 最小值1 最大值100000</span></span><br><span class="line"><span class="comment"># max_connections 还取决于操作系统对单进程允许打开最大文件数的限制</span></span><br><span class="line"><span class="comment"># 也就是说如果操作系统限制单个进程最大可以打开100个文件</span></span><br><span class="line"><span class="comment"># 那么 max_connections 设置为200也没什么用</span></span><br><span class="line"><span class="comment"># ulimit -n 查看操作系统对单进程打开最大文件数限制 默认为1024</span></span><br><span class="line">max_connections=5000</span><br><span class="line"></span><br><span class="line"><span class="comment"># 推荐设置：1； 默认为0</span></span><br><span class="line"><span class="comment"># 应用场景：主从复制时使用，具体看业务需求</span></span><br><span class="line"><span class="comment"># 0：代表mysql不控制写binlog的时间，由file system自由去控制，此时的mysql的并发性达到最好，但是一旦系统崩溃会丢失很多还未写入binlog的数据（比如说正在删数据和更新数据）</span></span><br><span class="line"><span class="comment"># 1：最安全，最多丢掉一个事务或者是一条语句，但是此时它的性能很差，此参数设为0或者是1之间的性能能差4～5倍</span></span><br><span class="line"><span class="comment"># sync_binlog=n，当每进行n次事务提交之后，MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘</span></span><br><span class="line">sync_binlog=1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 隔离级别</span></span><br><span class="line"><span class="comment"># 1.read-uncommitted：读未提交，允许脏读：读未提交是指，一个事务还没提交时，它做的变更就能被别的事务看到</span></span><br><span class="line"><span class="comment"># 2.read-committed：读提交，不允许脏读，但允许不可重复读：读提交是指，一个事务提交之后，它做的变更才会被其他事务看到</span></span><br><span class="line"><span class="comment"># 3.epeatable-read：可重复读，不允许脏读、不可重复读，但允许幻读：可重复读是指，一个事务执行过程中看到的数据，总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下，未提交变更对其他事务也是不可见的</span></span><br><span class="line"><span class="comment"># 4.serializable：串行化，以上都不允许：“写”会加“写锁”，“读”会加“读锁”。当出现读写锁冲突的时候，后访问的事务必须等前一个事务执行完成，才能继续执行</span></span><br><span class="line">transaction_isolation=READ-COMMITTED</span><br><span class="line"></span><br><span class="line"><span class="comment"># 每个连接传输数据大小，最大1G，必须是1024的倍数,一般设为最大的BLOB的值</span></span><br><span class="line"><span class="comment"># 针对一个事务中的一行记录的大小，当一行记录超过限制的大小将会报错</span></span><br><span class="line"><span class="comment"># sql文件中每次insert完进同一张表的所有数据被称为一个数据包（packet），max_allowed_packet就是来限制这个的大小的阈值，大于这个值，mysql的I/O连接会关闭，会报错</span></span><br><span class="line">max_allowed_packet=128M</span><br><span class="line"></span><br><span class="line"><span class="comment"># InnoDB相关参数</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 确定日志文件何时write、flush</span></span><br><span class="line"><span class="comment"># ！！！ 核心交易系统设置为1，默认为1，其他设置2或0 ！！！</span></span><br><span class="line"><span class="comment"># 0：log buffer将每秒一次地写入log file中，并且log file的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候，不会主动触发写入磁盘的操作；就是每秒调用 flush + fsync ，定时器自己维护。</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 1：每次事务提交时MySQL都会把log buffer的数据写入log file，并且flush(刷到磁盘)中去，该模式为系统默认（因此会保留每一份redo日志）；就是实时调用 flush + fsync 没法批处理，性能很低。</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 2：每次事务提交时MySQL都会把log buffer的数据写入log file，但是flush(刷到磁盘)操作并不会同时进行。该模式下，MySQL会每秒执行一次 flush(刷到磁盘)操作。该模式速度较快，也比0安全，只有在操作系统崩溃或者系统断电的情况下，上一秒钟所有事务数据才可能丢失；就是实时flush ,定时 fsync 交给OS维护定时器。</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 除非你用的是小型机或者是超大规模mysql集群一类如：游戏行业，那么需要保留每z一秒的事务，否则请设成2，要不然会严重影响系统性能。这个参数是5.6所没有的。</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 如果不配的后果：默认为1，影响系统写性能。</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># innodb_flush_log_at_trx_commit和sync_binlog 两个参数是控制MySQL 磁盘写入策略以及数据安全性的关键参数，当两个参数都设置为1的时候写入性能最差</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 推荐做法是</span></span><br><span class="line"><span class="comment"># innodb_flush_log_at_trx_commit=2</span></span><br><span class="line"><span class="comment"># sync_binlog=500或1000</span></span><br><span class="line">innodb_flush_log_at_trx_commit=2</span><br><span class="line"></span><br><span class="line"><span class="comment"># 控制着innodb数据文件及redo log的打开、刷写模式</span></span><br><span class="line"><span class="comment"># 确定日志及数据文件如何write、flush</span></span><br><span class="line">innodb_flush_method=O_DIRECT</span><br><span class="line"></span><br><span class="line"><span class="comment"># innodb使用一个缓冲池来保存索引和原始数据，可设置这个变量到物理内存大小的80%</span></span><br><span class="line"><span class="comment"># 建议设置为内存的20%-65%（独立的mysql服务器）</span></span><br><span class="line"><span class="comment"># 20%：因为对于4G内存的mysql服务器按照20%系统内存设置</span></span><br><span class="line">innodb_buffer_pool_size=48128M</span><br><span class="line"></span><br><span class="line"><span class="comment"># 与innodb_buffer_pool_size相辅相成,在32位机器下innodb_buffer_pool_instances一般为1</span></span><br><span class="line"><span class="comment"># 在64位机器上,这个值为8-64</span></span><br><span class="line"><span class="comment"># innodb_buffer_pool_instances其实为CPU核数</span></span><br><span class="line"><span class="comment"># 作用：</span></span><br><span class="line"><span class="comment"># 1.对于缓冲池在数千兆字节范围内的系统，通过减少争用不同线程对缓存页面进行读写的争用，将缓冲池划分为多个单独的实例可以提高并发性</span></span><br><span class="line"><span class="comment"># 2.使用散列函数将存储在缓冲池中或从缓冲池读取的每个页面随机分配给其中一个缓冲池实例。每个缓冲池管理自己的空闲列表,刷新列表,LRU和连接到缓冲池的所有其他数据结构，并受其自己的缓冲池互斥量保护。</span></span><br><span class="line"><span class="comment"># innodb_buffer_pool_size的设置需要为pool_instance的整数倍</span></span><br><span class="line">innodb_buffer_pool_instances=24</span><br><span class="line"></span><br><span class="line"><span class="comment"># 定义了InnoDB后台任务每秒可用的I/O操作数（IOPS）默认200 系统吞吐量上不去</span></span><br><span class="line"><span class="comment"># 影响 innodb 刷脏页的能力 脏页：当内存数据页跟磁盘数据页内容不一致的时候，我们称这个内存页为“脏页”</span></span><br><span class="line"><span class="comment"># 该值对读无效,对写很有意义,它会直接决定mysql的tps(吞吐性能)</span></span><br><span class="line"><span class="comment"># 需要根据paas或者是ias的vm的硬盘性号来定</span></span><br><span class="line"><span class="comment"># 最好的方法是测量你的存储设置的随机写吞吐量，然后给innodb_io_capacity_max设置为你的设备能达到的最大IOPS</span></span><br><span class="line"><span class="comment"># SATA/SAS：innodb_io_capacity_max=200</span></span><br><span class="line"><span class="comment"># SAS raid10：innodb_io_capacity_max=2000</span></span><br><span class="line"><span class="comment"># SSD：innodb_io_capacity_max=8000</span></span><br><span class="line"><span class="comment"># fusion-io(闪存卡)：innodb_io_capacity_max=25000-50000</span></span><br><span class="line">innodb_io_capacity_max=8000</span><br><span class="line"></span><br><span class="line"><span class="comment"># innodb_io_capacity就设置为它的50-75%，特别是系统主要是写操作时</span></span><br><span class="line">innodb_io_capacity=4000</span><br><span class="line"></span><br><span class="line"><span class="comment"># 控制buffer pool刷脏页时是否把脏页邻近的其他脏页一起刷到磁盘，在传统的机械硬盘时代，打开这个参数能够减少磁盘寻道的开销，显著提升性能，设置成1(默认状态)Innodb会刷新一个extent中的所有页面，因SSD在随机IO上没有额外负载，所以不需要启用该特性。即 机械盘 innodb_flush_neighbors=1 固态 innodb_flush_neighbors=0，mysql8.0已经把这个默认值设为0了。</span></span><br><span class="line"><span class="comment"># 当 srv_flush_neighbors 为 0时， [low, high] 只包含一个页面</span></span><br><span class="line"><span class="comment"># 当 srv_flush_neighbors 为 1时， [low, high] 包含邻近的页面，页面数小于等于变量值buf_flush_area</span></span><br><span class="line"><span class="comment"># 当 srv_flush_neighbors 为 2时， [low, high] 包含邻近的页面，页面数等于变量值buf_flush_area</span></span><br><span class="line">innodb_flush_neighbors=1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 在日志组中每个日志文件的大小</span></span><br><span class="line">innodb_log_file_size=1G</span><br><span class="line"><span class="comment"># 在日志组中的文件总数</span></span><br><span class="line">innodb_log_files_in_group=3</span><br><span class="line"></span><br><span class="line"><span class="comment"># 表的字段索引长度限制</span></span><br><span class="line"><span class="comment"># 如果客户端和服务端的字符集设置为utf8mb4则innodb_large_prefix=1</span></span><br><span class="line"><span class="comment"># 因为mysql5.6之前一直是单列索引限制767（256*3-1）3是字符最大占用空间(utf8)</span></span><br><span class="line"><span class="comment"># mysql5.6以后，开始支持4个字节的utf8mb4 255*4&gt;767 于是增加了这个参数</span></span><br><span class="line"><span class="comment"># 默认值为OFF，当改为ON时，允许列索引最大达到3072</span></span><br><span class="line"><span class="comment"># mysql5.6中开关叫ON，OFF，5.7中是1或0，由于前面这是了utf8mb4,那么这个值必须开启</span></span><br><span class="line"><span class="comment"># 未开启：会导致索引微笑，或者查询时不走最有计划</span></span><br><span class="line">innodb_large_prefix=1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 影响page cleaner线程每次刷脏页的数量 默认为1024</span></span><br><span class="line">innodb_lru_scan_depth=2000</span><br><span class="line"></span><br><span class="line"><span class="comment"># 开启慢查询日志</span></span><br><span class="line"><span class="comment"># 默认情况下，慢查询日志禁用，因为开启慢查询日志或多或少的会对mysql的性能产生一些影响</span></span><br><span class="line"><span class="comment"># 在慢查询日志功能开启时，只有SQL执行时间超过long_query_time参数值的的语句才会在慢查询日志中记录</span></span><br><span class="line">slow_query_log=ON</span><br><span class="line"></span><br><span class="line"><span class="comment"># 慢查询时长</span></span><br><span class="line"><span class="comment"># 最小值和默认值分别为0  10，单位为秒</span></span><br><span class="line">long_query_time=2</span><br><span class="line"></span><br><span class="line"><span class="comment"># 以FILE类型存储慢查询日志时的存储位置</span></span><br><span class="line"><span class="comment"># 如果没有为慢查询日志指定名称，默认为host_name-slow.log</span></span><br><span class="line">slow_query_log_file=/mitr/baseProgram/mysql/data/slow.log</span><br><span class="line"></span><br><span class="line"><span class="comment"># 所有线程打开表的数量</span></span><br><span class="line">open_files_limit=65535</span><br><span class="line"></span><br><span class="line"><span class="comment"># 限制Innodb能打开的表的数据</span></span><br><span class="line"><span class="comment"># 这个值默认是300,如果库里的表特别多的情况,可以适当增大为1000. innodb_open_files的大小对InnoDB效率的影响比较小。</span></span><br><span class="line"><span class="comment"># 但是在InnoDBcrash的情况下,innodb_open_files设置过小会影响recovery的效率.</span></span><br><span class="line"><span class="comment"># 所以用InnoDB的时候还是把innodb_open_files放大一些比较合适</span></span><br><span class="line">innodb_open_files=3000</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;mysql基准测试&quot;&gt;&lt;a href=&quot;#mysql基准测试&quot; class=&quot;headerlink&quot; title=&quot;mysql基准测试&quot;&gt;&lt;/a&gt;mysql基准测试&lt;/h2&gt;&lt;h3 id=&quot;什么是基准测试&quot;&gt;&lt;a href=&quot;#什么是基准测试&quot;</summary>
        
      
    
    
    
    <category term="MySql" scheme="https://chensir.ink/categories/MySql/"/>
    
    
    <category term="mysql性能优化" scheme="https://chensir.ink/tags/mysql%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/"/>
    
    <category term="mysqlslap压测" scheme="https://chensir.ink/tags/mysqlslap%E5%8E%8B%E6%B5%8B/"/>
    
    <category term="sysbench压测" scheme="https://chensir.ink/tags/sysbench%E5%8E%8B%E6%B5%8B/"/>
    
    <category term="FIO(IOPS)" scheme="https://chensir.ink/tags/FIO-IOPS/"/>
    
    <category term="nmon" scheme="https://chensir.ink/tags/nmon/"/>
    
  </entry>
  
  <entry>
    <title>MYSQL备份与恢复</title>
    <link href="https://chensir.ink/2021/08/09/MYSQL%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D/"/>
    <id>https://chensir.ink/2021/08/09/MYSQL%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D/</id>
    <published>2021-08-09T01:19:28.000Z</published>
    <updated>2025-11-26T14:04:32.762Z</updated>
    
    <content type="html"><![CDATA[<h1 id="备份恢复概述"><a href="#备份恢复概述" class="headerlink" title="备份恢复概述"></a>备份恢复概述</h1><h2 id="为什么要备份"><a href="#为什么要备份" class="headerlink" title="为什么要备份"></a>为什么要备份</h2><p>灾难恢复：硬件故障、软件故障、自然灾害、黑客攻击、误操作测试等数据丢失场景。</p><h2 id="备份类型"><a href="#备份类型" class="headerlink" title="备份类型"></a>备份类型</h2><ul><li>完全备份 ：备份整个数据集</li><li>部分备份：只备份数据子集，如部分库或表</li><li>增量备份：仅备份最近一次完全备份或增量备份（如果存在增量）依赖的数据，备份较快，还原复杂</li><li>差异备份：仅备份最近一次完全备份以来变化的数据，备份较慢，还原简单；注：二进制日志文件不应该与数据文件放在同一磁盘</li><li>冷备：读、写操作均不可进行，数据库停止服务</li><li>热备：读操作可以执行；写操作不可执行</li><li>温备：读、写操作均可执行<ul><li>MyISAM：温备，不支持热备</li><li>InnoDB：都支持</li></ul></li><li>物理备份：直接复制数据文件进行备份，与存储引擎有关，占用较多的空间，速度快</li><li>逻辑备份：从数据库中导出数据另存而进行的备份，与存储引擎无关，占用空间较少，速度慢，可能丢失精度</li></ul><h2 id="备份内容"><a href="#备份内容" class="headerlink" title="备份内容"></a>备份内容</h2><ul><li>数据</li><li>二进制日志、InnoDB的事务日志</li><li>用户账号，权限设置，程序代码（存储过程、函数、触发器、事件调度器）</li><li>服务器的配置文件</li></ul><h2 id="备份注意要点"><a href="#备份注意要点" class="headerlink" title="备份注意要点"></a>备份注意要点</h2><ul><li>能容忍最多丢失多少数据</li><li>备份产生的负载</li><li>备份过程的时长</li><li>温备的持锁多久</li><li>恢复数据需要在多长时间内完成</li><li>需要备份和恢复哪些数据</li></ul><h2 id="还原要点"><a href="#还原要点" class="headerlink" title="还原要点"></a>还原要点</h2><ul><li>做还原测试，用于测试备份的可用性</li><li>还原演练，写成规范的技术文档</li></ul><h2 id="备份工具"><a href="#备份工具" class="headerlink" title="备份工具"></a>备份工具</h2><ul><li>cp，tar等复制归档工具：物理备份工具，适用所有存储引擎；只支持冷备；完全和部分备份</li><li>LVM的快照：先加读锁，做快照后解锁，几乎热备；借助文件系统工具进行备份</li><li>mysqldump：逻辑备份工具，适用所有存储引擎，对MyISAM存储引擎进行温备；支持完全或部分备份，对InnoDB存储引擎支持热备，结合binlog的增量备份</li><li>xtrabackup：由Percona提供支持对InnoDB做热本（物理备份）的工具，支持完全备份、增量备份</li><li>MariaDB Backup：从MariaDB 10.1.26开始集成，基于Percona XtraBackup2.3.8实现</li><li>mysqlbackup：热备份，Mysql Enterprise Edition组件</li><li>mysqlhotcopy：PERL语言实现，几乎冷备，仅适用于MyISAM存储引擎，使用LOCK TABLES、FLUSH TABLES和cp或scp来快速备份数据库</li></ul><h2 id="基于LVM的快照备份"><a href="#基于LVM的快照备份" class="headerlink" title="基于LVM的快照备份"></a>基于LVM的快照备份</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(1)请求锁定所有表</span><br><span class="line">mysql&gt; FLUSH TABLES WITH READ LOCK;</span><br><span class="line"></span><br><span class="line">(2)记录二进制日志文件及时间位置</span><br><span class="line">mysql&gt; FLUSH LOGS;</span><br><span class="line">mysql&gt; SHOW MASTER STATUS;</span><br><span class="line">mysql -e &#x27;SHOW MASTER STATUS&#x27; &gt; /PATH/TO/SOMEFILE</span><br><span class="line"></span><br><span class="line">(3)创建快照</span><br><span class="line">lvcreate -L # -s -p r -n NAME /DEV/VG_NAME/LV_NAME</span><br><span class="line"></span><br><span class="line">(4)释放锁</span><br><span class="line">mysql&gt; UNLOCK TABLES;</span><br><span class="line"></span><br><span class="line">(5) 挂载快照卷，执行数据备份</span><br><span class="line">(6)备份完成后，删除快照卷</span><br><span class="line">(7)制定好策略，通过原卷备份二进制日志</span><br></pre></td></tr></table></figure><h1 id="mysqldump备份工具"><a href="#mysqldump备份工具" class="headerlink" title="mysqldump备份工具"></a>mysqldump备份工具</h1><h2 id="mysqldump说明"><a href="#mysqldump说明" class="headerlink" title="mysqldump说明"></a>mysqldump说明</h2><p>逻辑备份工具：</p><p>mysqldump，mydumper，phpMyAdmin</p><p>Schema和数据存储在一起、巨大的SQL语句、单个巨大的备份文件</p><p>mysqldump：是MySQL的客户端命令，通过mysql协议连接至mysql服务器进行备份</p><p><strong>命令格式：</strong></p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 支持指定数据库和指定多表的备份，但数据库本身定义不备份</span></span><br><span class="line">mysqldump [OPTION] database [tables] </span><br><span class="line"></span><br><span class="line"><span class="comment"># 支持指定数据库备份，包含数据库本身定义也会备份</span></span><br><span class="line">mysqldump [OPTION] -B DB1 [DB2 DB3 ...]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 备份所有数据库，包含数据库本身定义也会备份</span></span><br><span class="line">mysqldump [OPYION] -A [OPYIONS]</span><br></pre></td></tr></table></figure><p>mysqldump参考：</p><p><a href="https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html">https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html</a></p><p><strong>mysqldump常见通用选项：</strong></p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 备份所有数据库，含create database</span></span><br><span class="line">-A,--all-databases</span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定备份的数据库，包括create database语句</span></span><br><span class="line">-B,--databases db_name</span><br><span class="line"></span><br><span class="line"><span class="comment"># 备份相关的所有event scheduler</span></span><br><span class="line">-E,--events</span><br><span class="line"></span><br><span class="line"><span class="comment"># 备份所有存储过程和自定义函数</span></span><br><span class="line">-R,--routines</span><br><span class="line"></span><br><span class="line"><span class="comment"># 备份表相关触发器，默认启用，用--skip-triggers，不备份触发器</span></span><br><span class="line">--trigge</span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定字符集</span></span><br><span class="line">--default-character-set=utf8</span><br><span class="line"></span><br><span class="line"><span class="comment"># 此选项需要启用二进制日志</span></span><br><span class="line"><span class="comment"># 1:所备份的数据之前加一条记录为CHANGE MASTER TO语句，非注释，不指定#，默认为1，适合主从复制多机使用</span></span><br><span class="line"><span class="comment"># 2:记录为被注释的#CHANGE MASTER TO语句，适合单机使用</span></span><br><span class="line"><span class="comment"># 此选项会自动关闭--lock-tables功能，自动打开-x|--lock-all-tables功能（除非开启--single-transaction）</span></span><br><span class="line">--master-data[=#]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 备份前滚动日志，锁定表完成后，执行flush logs命令，生成新的二进制日志文件，配合-A或-B选项时，会导致刷新多次数据库。建议在同一时刻执行转储和日志刷新，可以通过和--single-transaction或-x,--master-data 一起使用实现，此时只刷一次二进制日志</span></span><br><span class="line">-F,--flush-logs</span><br><span class="line"></span><br><span class="line"><span class="comment"># 去掉注释，适合调试，节约备份占用的空间，生产不使用</span></span><br><span class="line">--compact</span><br><span class="line"></span><br><span class="line"><span class="comment"># 只备份表结构，不备份数据，即只备份create table</span></span><br><span class="line">-d,--no-data</span><br><span class="line"></span><br><span class="line"><span class="comment"># 只备份数据，不备份表结构，即不备份create table</span></span><br><span class="line">-t,--no-create-info</span><br><span class="line"></span><br><span class="line"><span class="comment"># 不备份create database，可被-A 或 -B覆盖</span></span><br><span class="line">-n,--no-create-db</span><br><span class="line"></span><br><span class="line"><span class="comment"># 备份mysql或相关时需要使用</span></span><br><span class="line">--flush-privileges</span><br><span class="line"></span><br><span class="line"><span class="comment"># 忽略SQL错误，继续执行</span></span><br><span class="line">-f,--force</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用十六进制符号转储二进制列，当有包括BINARY，VARBINARY，BLOB，BIT的数据类型的列时使用，避免乱码</span></span><br><span class="line">--hex-blob</span><br><span class="line"></span><br><span class="line"><span class="comment"># 不缓存查询，直接输出，加快备份速度</span></span><br><span class="line">-q,--quick</span><br></pre></td></tr></table></figure><p><strong>mysqldump的MyISAM存储引擎相关备份选项：</strong></p><p>MyISAM不支持事务，只能支持温备；不支持热备，所以必须先锁定要备份的库，而后启动备份操作</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 加全局读锁，锁定所有库的所有表，同时加--single-transaction或--lock-tables选项会关闭此选项功能；注意：数据量大时，可能会导致长时间无法并发访问数据库</span></span><br><span class="line">-x,--lock-all-tables</span><br><span class="line"></span><br><span class="line"><span class="comment"># 对于需要备份的每个数据库，在启动备份之前分别锁定其所有表，默认为on，--skip-lock-tables选项可禁用，对备份MyISAM的多个库，可能会造成数据不一致</span></span><br><span class="line">-l,--lock-tables</span><br><span class="line"></span><br><span class="line"><span class="comment"># 注：以上选项对InnoDB表一样生效，实现温备，但不推荐使用</span></span><br></pre></td></tr></table></figure><p><strong>mysqldump的InnoDB存储引擎先关备份选项：</strong></p><p>InnoDB存储引擎支持事务，可以利用事务的相应的隔离级别，实现热备，也可以实现温备但不建议使用</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 此选项InnoDB中推荐使用，不适用MyISAM，此选项会开始备份前，先执行START TRANSACTION指令开启事务</span></span><br><span class="line"><span class="comment"># 此选项通过在单个事务中转储所有表来创建一致的快照。仅适用于存储在支持多版本控制的存储引擎中的表（目标只有InnoDB可以）；转储不保证与其他存储引擎保持一致。在进行单事务转储时，要确保有效的转储文件（正确的表内容和二进制日志位置），没有其他连接应该使用以下语句：ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE,此选项和--lock-tables（此选项隐含提交挂起的事务）选项是相互排斥，备份大型表时，建议将--single-transaction选项和--quick结合一起使用</span></span><br><span class="line">--single-transcation</span><br></pre></td></tr></table></figure><h2 id="生产环境实战备份策略"><a href="#生产环境实战备份策略" class="headerlink" title="生产环境实战备份策略"></a>生产环境实战备份策略</h2><p>InnoDB建议备份策略</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">mysqldump -uroot -p -A -F -E -R --triggers --single-transaction --master-data=1 --flush-privileges --default-character-set=utf8 --hex-blob &gt; $&#123;BACKUP&#125;/fullbak_$&#123;BACKUP_TIME&#125;.sql</span><br></pre></td></tr></table></figure><p>MyISAM建议备份方案策略</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">mysqldump -uroot -p -A -F -E -R -x --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob &gt; $&#123;BACKUP&#125;/fullbak_$&#123;BACKUP_TIME&#125;.sql</span><br></pre></td></tr></table></figure><h2 id="实战：mysqldump备份还原"><a href="#实战：mysqldump备份还原" class="headerlink" title="实战：mysqldump备份还原"></a>实战：mysqldump备份还原</h2><h3 id="特定数据库的备份脚本"><a href="#特定数据库的备份脚本" class="headerlink" title="特定数据库的备份脚本"></a>特定数据库的备份脚本</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">TIME=`<span class="built_in">date</span> +%F_%H-%M-%S`</span><br><span class="line"><span class="comment"># 备份文件存放路径</span></span><br><span class="line">DIR=/backup</span><br><span class="line"><span class="comment"># 数据库名称</span></span><br><span class="line">DB=erpdb</span><br><span class="line"><span class="comment"># 数据库密码</span></span><br><span class="line">PASS=123456</span><br><span class="line">mysqldump -uroot -p<span class="string">&quot;<span class="variable">$PASS</span>&quot;</span> -F -E -R --triggers --single-transaction --master-data=2 --default-character-set=utf8 -q -B <span class="variable">$DB</span> |gzip &gt;<span class="variable">$&#123;DIR&#125;</span>/<span class="variable">$&#123;DB&#125;</span>_<span class="variable">$&#123;TIME&#125;</span>.sql.gz</span><br></pre></td></tr></table></figure><h3 id="分库备份脚本"><a href="#分库备份脚本" class="headerlink" title="分库备份脚本"></a>分库备份脚本</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">TIME=`<span class="built_in">date</span> +%F_%H-%M-%S`</span><br><span class="line"><span class="comment"># 备份文件存放路径</span></span><br><span class="line">DIR=/backup</span><br><span class="line"><span class="comment"># 数据库密码</span></span><br><span class="line">PASS=123456</span><br><span class="line">[ ! -d <span class="string">&quot;<span class="variable">$DIR</span>&quot;</span> ]  || <span class="built_in">mkdir</span> <span class="variable">$DIR</span></span><br><span class="line"><span class="keyword">for</span> DB <span class="keyword">in</span> `mysql -uroot -p123456 -e <span class="string">&#x27;show databases&#x27;</span>|grep -Ev <span class="string">&quot;^Database|.*schema$&quot;</span>`;<span class="keyword">do</span> mysqldump -uroot -p123456 -F --single-transaction --master-data=2 --default-character-set=utf8 -q -B <span class="variable">$DB</span> |gzip &gt; <span class="variable">$&#123;DIR&#125;</span>/<span class="variable">$&#123;DB&#125;</span>_<span class="variable">$&#123;TIME&#125;</span>.sql.gz</span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><h3 id="完全备份与还原"><a href="#完全备份与还原" class="headerlink" title="完全备份与还原"></a>完全备份与还原</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 前提开启二进制日志</span></span><br><span class="line">[mysqld]</span><br><span class="line">log-bin=/usr/local/mysql/log/mysql-bin</span><br><span class="line"></span><br><span class="line"><span class="comment"># 完全备份</span></span><br><span class="line">mysqldump -uroot -p123456 -A -F --single-transaction --master-data=2 |gzip &gt; /backup/all-`<span class="built_in">date</span> +%F`.sql.gz</span><br><span class="line"></span><br><span class="line"><span class="comment"># 还原</span></span><br><span class="line"><span class="comment"># 登录新安装的数据库</span></span><br><span class="line">mysql -uroot -p</span><br><span class="line"></span><br><span class="line"><span class="comment"># 解压备份压缩包</span></span><br><span class="line">gunzip /backup/all-2021-08-09.sql.gz</span><br><span class="line"><span class="comment"># 依次执行</span></span><br><span class="line"><span class="built_in">set</span> sql_log_bin=off;</span><br><span class="line"><span class="built_in">source</span> /backup/all-2021-08-09.sql;</span><br><span class="line"><span class="built_in">set</span> sql_log_bin=on;</span><br></pre></td></tr></table></figure><h1 id="xtrabackup备份工具"><a href="#xtrabackup备份工具" class="headerlink" title="xtrabackup备份工具"></a>xtrabackup备份工具</h1><h2 id="XtraBackup工具介绍"><a href="#XtraBackup工具介绍" class="headerlink" title="XtraBackup工具介绍"></a>XtraBackup工具介绍</h2><p><strong>Percona公司</strong> <a href="http://www.percona.com/">http://www.percona.com</a></p><p>Percona-server</p><p>InnoDB—&gt;XtraDB</p><p>Xtrabackup 备份工具：Percona提供的MySQL数据库备份工具，唯一开源的能够对InnoDB和Xtradb数据库进行热备的工具</p><p>手册：<a href="https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html">https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html</a></p><p>下载：<a href="https://www.percona.com/downloads/">https://www.percona.com/downloads/</a></p><h3 id="Xtrabackup特点："><a href="#Xtrabackup特点：" class="headerlink" title="Xtrabackup特点："></a>Xtrabackup特点：</h3><ul><li>备份还原过程快速、可靠</li><li>备份过程不会打断正在执行的事务</li><li>能够基于压缩等功能节约磁盘空间和流量</li><li>自动实现备份检验</li><li>开源、免费</li></ul><h3 id="XtraBackup工具文件组成"><a href="#XtraBackup工具文件组成" class="headerlink" title="XtraBackup工具文件组成"></a>XtraBackup工具文件组成</h3><p><strong>XtraBackup2.2版</strong>之前包括4个可执行文件：</p><ul><li>innobackupex：Perl脚本</li><li>XtraBackup：C&#x2F;C++,编译的二进制程序</li><li>xbcrypt：加解密</li><li>xbstream：支持并发写的流文件格式</li></ul><p>说明：XtraBackup是用来备份InnoDB表的，不能备份非InnoDB表，和MySQL Server没有交互；innobackupex脚本用来备份非InnoDB表，同时会调用XtraBackup命令来备份InnoDB表，还会和MySQL Server发送命令进行交互，如加全局锁（FTWRL）、获取位点（SHOW SLAVE STATUS）等。即innobackupex是在XtraBackup至上做了一层封装实现的</p><p><strong>Xtrabackup的新版本变化</strong></p><p>xtrabackup版本升级到2.4后，相比之前的2.1有了比较大的变化:innobackupex 功能全部集成到 xtrabackup 里面，只有一个 binary程序，另外为了兼容考虑，innobackupex作为 xtrabackup 的软链接，即xtrabackup现在支持非Innodb表备份，并且 Innobackupex 在下一版本中移除，建议通过 xtrabackup替换innobackupex</p><p><strong>备份生成的相关文件</strong></p><p>使用innobackupex备份时，其会调用xtrabackup备份所有的InnoDB表，复制所有关于表结构定义的相 关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件，同时还会备份触发器和数据库配 置信息相关的文件。这些文件会被保存至一个以时间命名的目录中,在备份时，innobackupex还会在备 份目录中创建如下文件</p><ul><li>xtrabackup_info:文本文件，innobackupex工具执行时的相关信息，包括版本，备份选项，备份 时长，备份LSN(log sequence number日志序列号)，BINLOG的位置</li><li>xtrabackup_checkpoints:文本文件，备份类型(如完全或增量)、备份状态(如是否已经为 prepared状态)和LSN范围信息,每个InnoDB页(通常为16k大小)都会包含一个日志序列号LSN。 LSN是整个数据库系统的系统版本号，每个页面相关的LSN能够表明此页面最近是如何发生改变的</li><li>xtrabackup_binlog_info:文本文件，MySQL服务器当前正在使用的二进制日志文件及至备份这一 刻为止二进制日志事件的位置，可利用实现基于binlog的恢复</li><li>backup-my.cnf:文本文件，备份命令用到的配置选项信息</li><li>xtrabackup_logfile:备份生成的二进制日志文件</li></ul><h2 id="XtraBackup安装"><a href="#XtraBackup安装" class="headerlink" title="XtraBackup安装"></a>XtraBackup安装</h2><p>在EPEL源中</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm</span><br><span class="line"></span><br><span class="line">percona-release setup ps80</span><br><span class="line"></span><br><span class="line">yum install -y percona-xtrabackup-24</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="XtraBackup用法"><a href="#XtraBackup用法" class="headerlink" title="XtraBackup用法"></a>XtraBackup用法</h2><p>XtraBackup工具备份和还原，需要三步实现</p><p>1.备份：对数据库做完全备份或增量备份</p><p>2.预准备：还原前，先对备份的数据，整理至一个临时目录</p><p>3.还原：将整理好的数据，复制回数据库目录中</p><p>XtraBackup选项参考：</p><p><a href="https://www.percona.com/doc/percona-xtrabackup/LATEST/genindex.html">https://www.percona.com/doc/percona-xtrabackup/LATEST/genindex.html</a></p><h3 id="备份"><a href="#备份" class="headerlink" title="备份"></a><strong>备份</strong></h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">innobackupex [option] BACKUP-ROOT-DIR</span><br></pre></td></tr></table></figure><h4 id="选项说明："><a href="#选项说明：" class="headerlink" title="选项说明："></a><strong>选项说明：</strong></h4><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 该选项表示备份账号</span></span><br><span class="line">--user</span><br><span class="line"></span><br><span class="line"><span class="comment"># 该选项表示备份的密码</span></span><br><span class="line">--password</span><br><span class="line"></span><br><span class="line"><span class="comment"># 该选项表示备份数据库的地址</span></span><br><span class="line">--host</span><br><span class="line"></span><br><span class="line"><span class="comment"># 该选项接受的参数为数据库名，如果要指定多个数据库，彼此间需要以空格隔开; </span></span><br><span class="line"><span class="comment"># 如:&quot;xtra_test dba_test&quot;，同时，在指定某数据库时，也可以只指定其中的某张表。如:&quot;mydatabase.mytable&quot;。该选项对innodb引擎表无效，还是会备份所有innodb表</span></span><br><span class="line">--databases</span><br><span class="line"></span><br><span class="line"><span class="comment">#该选项指定从哪个文件读取MySQL配置，必须放在命令行第一个选项位置</span></span><br><span class="line">--defaults-file</span><br><span class="line"></span><br><span class="line"><span class="comment">#该选项表示创建一个增量备份，需要指定--incremental-basedir</span></span><br><span class="line">--incremental</span><br><span class="line"></span><br><span class="line"><span class="comment">#该选项指定为前一次全备份或增量备份的目录，与--incremental同时使用</span></span><br><span class="line">--incremental-basedir</span><br><span class="line"></span><br><span class="line"><span class="comment">#该选项表示还原时增量备份的目录</span></span><br><span class="line">--incremental-dir</span><br><span class="line"></span><br><span class="line"><span class="comment">#指定表名，格式:databasename.tablename</span></span><br><span class="line">--include=name</span><br></pre></td></tr></table></figure><h3 id="Prepare预准备"><a href="#Prepare预准备" class="headerlink" title="Prepare预准备"></a><strong>Prepare预准备</strong></h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">innobackupex --apply-log [option]  BACKUP-DIR</span><br></pre></td></tr></table></figure><h4 id="选项说明：-1"><a href="#选项说明：-1" class="headerlink" title="选项说明："></a><strong>选项说明：</strong></h4><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 一般情况下,在备份完成后，数据尚且不能用于恢复操作，因为备份的数据中可能会包含尚 未提交的事务或已经提交但尚未同步至数据文件中的事务。因此，此时数据文件仍处理不一致状态。此选项作 用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态</span></span><br><span class="line">--apply-log</span><br><span class="line"></span><br><span class="line"><span class="comment"># 和--apply-log选项一起使用，当prepare 备份时，做crash recovery分配的内存大 小，单位字节，也可1MB,1M,1G,1GB等，推荐1G</span></span><br><span class="line">--use-memory</span><br><span class="line"></span><br><span class="line"><span class="comment"># 表示开启可导出单独的表之后再导入其他Mysql中</span></span><br><span class="line">--<span class="built_in">export</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 此选项在prepare base full backup，往其中合并增量备份时候使用，但不包括对最后 一个增量备份的合并</span></span><br><span class="line">--redo-only</span><br></pre></td></tr></table></figure><h3 id="还原"><a href="#还原" class="headerlink" title="还原"></a><strong>还原</strong></h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">innobackupex --copy-back [选项] BACKUP-DIR</span><br><span class="line">innobackupex --move-back [选项] [--defaults-group=GROUP-NAME] BACKUP-DIR</span><br></pre></td></tr></table></figure><h4 id="选项说明：-2"><a href="#选项说明：-2" class="headerlink" title="选项说明："></a><strong>选项说明：</strong></h4><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir</span></span><br><span class="line">--copy-back</span><br><span class="line"></span><br><span class="line"><span class="comment"># 这个选项与--copy-back相似，唯一的区别是它不拷贝文件，而是移动文件到目的地。这 个选项移除backup文件，用时候必须小心。使用场景:没有足够的磁盘空间同事保留数据文件和Backup副本</span></span><br><span class="line">--move-back</span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定该参数时候，使得innobackupex --copy-back或--move- back选项转移文件到非空目录，已存在的文件不会被覆盖。如果--copy-back和--move-back文件需要从备 份目录拷贝一个在datadir已经存在的文件，会报错失败</span></span><br><span class="line">--force-non-empty-directories</span><br></pre></td></tr></table></figure><h4 id="还原注意事项"><a href="#还原注意事项" class="headerlink" title="还原注意事项"></a>还原注意事项</h4><p>1.datadir 目录必须为空。除非指定innobackupex –force-non-empty-directorires选项指定，否则– copy-back选项不会覆盖</p><p>2.在restore之前,必须shutdown MySQL实例，不能将一个运行中的实例restore到datadir目录中</p><p>3.由于文件属性会被保留，大部分情况下需要在启动实例之前将文件的属主改为mysql，这些文件将属于创建备份的用户, 执行chown -R mysql:mysql &#x2F;data&#x2F;mysql,以上需要在用户调用 innobackupex之前完成</p><h3 id="Xtrabackup-完全备份及还原"><a href="#Xtrabackup-完全备份及还原" class="headerlink" title="Xtrabackup 完全备份及还原"></a>Xtrabackup 完全备份及还原</h3><p>基于Centos7的MySQL5.7实现</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 1.安装XtraBackup,依次执行</span></span><br><span class="line">yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm</span><br><span class="line">percona-release setup ps80</span><br><span class="line">yum install -y percona-xtrabackup-24</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2.在原主机完全备份到/backup</span></span><br><span class="line">xtrabackup -uroot -p123456 --backup --host=127.0.0.1 --target-dir=/backup/base </span><br><span class="line"></span><br><span class="line"><span class="comment"># 目标主机无需创建/backup目录，直接复制目录本身</span></span><br><span class="line">scp -r /backup/ 目标主机:/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3.在目标主机上还原</span></span><br><span class="line"><span class="comment"># 1）预准备：确保数据一致，提交完成的事务，回滚未完成的事务</span></span><br><span class="line">xtrabackup --prepare --target-dir=/backup/base</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2）复制到数据库</span></span><br><span class="line"><span class="comment"># 注意：数据库目录必须为空，mysql服务不能启动</span></span><br><span class="line">xtrabackup --copy-back --target-dir=/backup/base</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3）还原属性</span></span><br><span class="line"><span class="built_in">chown</span> -R mysql:mysql /usr/local/mysql/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4）启动服务</span></span><br><span class="line">service mysqld start</span><br></pre></td></tr></table></figure><h3 id="Xtrabackup-完全备份-增量备份及还原"><a href="#Xtrabackup-完全备份-增量备份及还原" class="headerlink" title="Xtrabackup 完全备份,增量备份及还原"></a>Xtrabackup 完全备份,增量备份及还原</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 1.完全备份</span></span><br><span class="line"><span class="built_in">mkdir</span> backup</span><br><span class="line">xtrabackup -uroot -p123456 --backup --host=127.0.0.1 --target-dir=/backup/base</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2.第一次修改数据</span></span><br><span class="line"><span class="comment"># 3.第一次增量备份</span></span><br><span class="line">xtrabackup -uroot -p123456 --host=127.0.0.1 --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看xtrabackup相关文件</span></span><br><span class="line"><span class="built_in">cat</span> /backup/inc1/xtrabackup_info</span><br><span class="line"></span><br><span class="line">uuid = 78811189-f96e-11eb-a6f8-000c2930bb8a</span><br><span class="line">name =</span><br><span class="line">tool_name = xtrabackup</span><br><span class="line">tool_command = -uroot -p123456 --host=127.0.0.1 --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base</span><br><span class="line">tool_version = 2.4.23</span><br><span class="line">ibbackup_version = 2.4.23</span><br><span class="line">server_version = 5.7.25-<span class="built_in">log</span></span><br><span class="line">start_time = 2021-08-10 08:03:52</span><br><span class="line">end_time = 2021-08-10 08:04:02</span><br><span class="line">lock_time = 1</span><br><span class="line">binlog_pos = filename <span class="string">&#x27;mysql-bin.000022&#x27;</span>, position <span class="string">&#x27;154&#x27;</span></span><br><span class="line">innodb_from_lsn = 1047831622</span><br><span class="line">innodb_to_lsn = 1047831622</span><br><span class="line">partial = N</span><br><span class="line">incremental = Y</span><br><span class="line">format = file</span><br><span class="line">compact = N</span><br><span class="line">compressed = N</span><br><span class="line">encrypted = N</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4.第二次修改数据</span></span><br><span class="line"><span class="comment"># 5.第二次增量</span></span><br><span class="line">xtrabackup -uroot -p123456 --host=127.0.0.1 --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看xtrabackup相关文件</span></span><br><span class="line"><span class="built_in">cat</span> /backup/inc2/xtrabackup_info</span><br><span class="line"></span><br><span class="line">uuid = f230df9a-f96e-11eb-a6f8-000c2930bb8a</span><br><span class="line">name =</span><br><span class="line">tool_name = xtrabackup</span><br><span class="line">tool_command = -uroot -p123456 --host=127.0.0.1 --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1</span><br><span class="line">tool_version = 2.4.23</span><br><span class="line">ibbackup_version = 2.4.23</span><br><span class="line">server_version = 5.7.25-<span class="built_in">log</span></span><br><span class="line">start_time = 2021-08-10 08:07:16</span><br><span class="line">end_time = 2021-08-10 08:07:26</span><br><span class="line">lock_time = 0</span><br><span class="line">binlog_pos = filename <span class="string">&#x27;mysql-bin.000022&#x27;</span>, position <span class="string">&#x27;589&#x27;</span></span><br><span class="line">innodb_from_lsn = 1047831622</span><br><span class="line">innodb_to_lsn = 1047832133</span><br><span class="line">partial = N</span><br><span class="line">incremental = Y</span><br><span class="line">format = file</span><br><span class="line">compact = N</span><br><span class="line">compressed = N</span><br><span class="line">encrypted = N</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="built_in">cat</span> /backup/inc2/xtrabackup_checkpoints</span><br><span class="line"></span><br><span class="line">backup_type = incremental</span><br><span class="line">from_lsn = 1047831622</span><br><span class="line">to_lsn = 1047832133</span><br><span class="line">last_lsn = 1047832142</span><br><span class="line">compact = 0</span><br><span class="line">recover_binlog_info = 0</span><br><span class="line">flushed_lsn = 1047832142</span><br><span class="line"></span><br><span class="line"><span class="built_in">cat</span> /backup/inc2/xtrabackup_binlog_info</span><br><span class="line"></span><br><span class="line">mysql-bin.000022589</span><br><span class="line"></span><br><span class="line"><span class="comment"># 6.还原数据</span></span><br><span class="line">scp -r /backup/* 目标主机:/backup/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 还原过程</span></span><br><span class="line"><span class="comment"># 1）预准备完成备份，此选项--apply-log-only 阻止回滚未完成的事务</span></span><br><span class="line">xtrabackup --prepare --apply-log-only --target-dir=/backup/base</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2）合并第1次增量备份到完全备份</span></span><br><span class="line">xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3）合并第2次增量备份到完全备份:最后一次还原不需要加选项--apply-log-only</span></span><br><span class="line">xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc2</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4）复制到数据库目录，注意数据库目录必须为空，MySQL服务不能启动</span></span><br><span class="line">xtrabackup --copy-back --target-dir=/backup/base</span><br><span class="line"></span><br><span class="line"><span class="comment"># 5）还原属性</span></span><br><span class="line"><span class="built_in">chown</span> -R mysql:mysql /usr/local/mysql/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 6）启动服务</span></span><br><span class="line">service mysqld start</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;备份恢复概述&quot;&gt;&lt;a href=&quot;#备份恢复概述&quot; class=&quot;headerlink&quot; title=&quot;备份恢复概述&quot;&gt;&lt;/a&gt;备份恢复概述&lt;/h1&gt;&lt;h2 id=&quot;为什么要备份&quot;&gt;&lt;a href=&quot;#为什么要备份&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="MySql" scheme="https://chensir.ink/categories/MySql/"/>
    
    
    <category term="MySql备份" scheme="https://chensir.ink/tags/MySql%E5%A4%87%E4%BB%BD/"/>
    
  </entry>
  
  <entry>
    <title>虚拟化基础管理平台VMware vSphere</title>
    <link href="https://chensir.ink/2021/08/06/%E8%99%9A%E6%8B%9F%E5%8C%96%E5%9F%BA%E7%A1%80%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0VMware-vSphere/"/>
    <id>https://chensir.ink/2021/08/06/%E8%99%9A%E6%8B%9F%E5%8C%96%E5%9F%BA%E7%A1%80%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0VMware-vSphere/</id>
    <published>2021-08-06T13:00:59.000Z</published>
    <updated>2025-11-26T14:04:32.775Z</updated>
    
    <content type="html"><![CDATA[<h1 id="VMware简介"><a href="#VMware简介" class="headerlink" title="VMware简介"></a>VMware简介</h1><h2 id="VMware介绍"><a href="#VMware介绍" class="headerlink" title="VMware介绍"></a>VMware介绍</h2><p>官网：<a href="https://www.vmware.com/cn.html">https://www.vmware.com/cn.html</a></p><p>VMware公司成立于1998年，2003年存储厂商EMC以6.35亿美元收购了VMware；2015年10月，戴尔宣布以670亿美元收购EMC。VMware公司在2018年全年收入79.2亿美元。</p><h2 id="VMware主要产品"><a href="#VMware主要产品" class="headerlink" title="VMware主要产品"></a>VMware主要产品</h2><ul><li><p>Workstation Pro：面向Windows的虚拟化。</p></li><li><p>Fusion for Mac：面向Mac的虚拟化</p></li><li><p>ThinApp：是一款无代理应用虚拟化解决方案。是一款便携软件或单文件打包工具，可以把有很多文件或文件夹的程序打包成一个单文件，可以将应用程序封装起来与OS或其他程序独立展开；将程序插入到MSI或EXE文件中并部署一个包括注册表键值、DLL、第三方库及Framework的虚拟系统环境，而无需在底层操作系统中安装的任何的代理或应用，可以避免程序的冲突。</p></li><li><p>Horizon：用于管理虚拟桌面（VDI）、应用和在线服务的领先平台。</p></li><li><p>Horizon Cloud：用于托管虚拟桌面和应用的灵活云计算平台。</p></li><li><p>NSX for Horizon：一款虚拟桌面基础架构VD（Virtual Desktop Infrastructure）网络连接解决方案。</p></li><li><p>VMware Enterprise PKS：面向多云企业和服务提供商的生产级Kubernetes。</p></li><li><p>VMware vSphere Integrated Containers：用于传统应用和容器化应用的企业级容器基础架构。</p></li><li><p>vSAN：经过闪存优化的vSphere原生存储，适用于私有云和公有云，即实现存储虚拟化</p></li><li><p>VMware vSphere：业界领先的服务器虚拟化平台，作为基础平台，是云环境的理想之选</p><p>链接：<a href="https://www.vmware.com/cn/products/vsphere.html">https://www.vmware.com/cn/products/vsphere.html</a></p></li></ul><blockquote><p>VMware 服务器虚拟化第一个产品叫ESX，后来VMware在4版本的时候推出了ESXI，ESXI和ESX的版本最大的技术区别是内核的变化，从4版本开始VMware吧ESX及ESXI产品统称为vSphere，但是VMware从5版本取消了原来的ESX版本，所以现在来讲的话vSphere就是ESXI，只是两种叫法而已。一般官方文档中以vSphere为主。</p></blockquote><p><img src="https://img.chensir.ink/chensir-pics/202206091211310.png" alt="vm3"></p><ul><li><p>VMware vCenter Server：用于管理跨混合云的vSphere</p><p>虚拟化环境的集中式管理平台：<a href="https://www.vmware.com/cn/products/vcenter-server.html">https://www.vmware.com/cn/products/vcenter-server.html</a></p></li></ul><p><img src="https://img.chensir.ink/chensir-pics/202206091211112.png" alt="vm8"></p><h2 id="架构说明"><a href="#架构说明" class="headerlink" title="架构说明"></a>架构说明</h2><p><img src="https://img.chensir.ink/chensir-pics/202206091212052.png" alt="vm4"></p><h1 id="VMware-vSphere"><a href="#VMware-vSphere" class="headerlink" title="VMware vSphere"></a>VMware vSphere</h1><h2 id="发行版说明"><a href="#发行版说明" class="headerlink" title="发行版说明"></a>发行版说明</h2><p>VMware ESXi 版本和内部版本号历史记录参考链接：<a href="https://blog.csdn.net/z136370204/article/details/97042440">https://blog.csdn.net/z136370204/article/details/97042440</a></p><h2 id="申请使用VMware-vSphere"><a href="#申请使用VMware-vSphere" class="headerlink" title="申请使用VMware vSphere"></a>申请使用VMware vSphere</h2><h3 id="注册账号"><a href="#注册账号" class="headerlink" title="注册账号"></a>注册账号</h3><p><a href="https://my.vmware.com/cn/web/vmware/registration">https://my.vmware.com/cn/web/vmware/registration</a></p><p>填好注册信息，到邮箱验证并激活账号</p><p><img src="https://img.chensir.ink/chensir-pics/202206091212982.png" alt="vm5"></p><h3 id="申请试用VMware-vSphere"><a href="#申请试用VMware-vSphere" class="headerlink" title="申请试用VMware vSphere"></a>申请试用VMware vSphere</h3><p>默认的账号不能下载安装包，需要申请试用相应的产品才可以下载</p><p><a href="https://www.vmware.com/cn/try-vmware.html">https://www.vmware.com/cn/try-vmware.html</a></p><h3 id="下载安装程序"><a href="#下载安装程序" class="headerlink" title="下载安装程序"></a>下载安装程序</h3><p>试用申请通过之后就可以下载安装镜像了 <a href="https://my.vmware.com/cn/group/vmware/">https://my.vmware.com/cn/group/vmware/</a></p><p><img src="https://img.chensir.ink/chensir-pics/202206091212395.png" alt="vm6"></p><p><img src="https://img.chensir.ink/chensir-pics/202206091213434.png" alt="vm7"></p><h3 id="安装VMware-ESXI"><a href="#安装VMware-ESXI" class="headerlink" title="安装VMware ESXI"></a>安装VMware ESXI</h3><p>本次实验 在MacBook Pro 使用VMware Fusion做一个虚拟机安装ESXI（套娃，娃中娃）</p><p>VMware vSphere文档：<a href="https://docs.vmware.com/cn/VMware-vSphere/index.html">https://docs.vmware.com/cn/VMware-vSphere/index.html</a></p><h4 id="打开VMware-Fusion"><a href="#打开VMware-Fusion" class="headerlink" title="打开VMware Fusion"></a>打开VMware Fusion</h4><p><img src="https://img.chensir.ink/chensir-pics/202206091214581.png" alt="esxi1"></p><p><img src="https://img.chensir.ink/chensir-pics/202206091214021.png" alt="esxi2"></p><p><img src="https://img.chensir.ink/chensir-pics/202206091214465.png" alt="esxi3"></p><p>修改内存为16G，硬盘150G，键盘选择Mac配置，然后启动即可。</p><p><img src="https://img.chensir.ink/chensir-pics/202206091215680.png" alt="esxi4"></p><p><strong>注意</strong>：ESXI 7.0 U2默认占用120G虚拟闪存，在安装ESXI 7.0 U2启动的第一个画面5秒倒计时结束前按shift+o组合键(是字母o不是数字0)，然后在显示的runweasel cdromBoot之后输入autoPartitionOSDataSize&#x3D;8192或4096</p><p>&#x2F;pic&#x2F;zy01.png)</p><p>开始安装ESXI节点</p><p><img src="https://img.chensir.ink/chensir-pics/202206091215887.png" alt="esxi5"></p><p>确认安装：按回车</p><p><img src="https://img.chensir.ink/chensir-pics/202206091215333.png" alt="esxi6"></p><p>同意协议：F11</p><p><img src="https://img.chensir.ink/chensir-pics/202206091215674.png" alt="esxi7"></p><p>选择硬盘并安装：按回车</p><p><img src="https://img.chensir.ink/chensir-pics/202206091213025.png" alt="vm9"></p><p>选择键盘：按回车</p><p><img src="https://img.chensir.ink/chensir-pics/202206091216783.png" alt="esxi8"></p><p>设置管理员密码：最少7位，且必须符合密码复杂度要求</p><p><img src="https://img.chensir.ink/chensir-pics/202206091216139.png" alt="esxi9"></p><p>开始安装：F11</p><p><img src="https://img.chensir.ink/chensir-pics/202206091216639.png" alt="esxi10"></p><p>安装过程中：</p><p><img src="https://img.chensir.ink/chensir-pics/202206091217361.png" alt="esxi11"></p><p>安装完成：按回车，等待重启</p><p><img src="https://img.chensir.ink/chensir-pics/202206091217593.png" alt="esxi12"></p><p>配置IP地址：第一次重启后默认为DHCP获取的IP地址，通常会将服务器配置为静态IP地址</p><p>可以在看到默认的动态IP，按F2进行登录</p><p><img src="https://img.chensir.ink/chensir-pics/202206091217241.png" alt="esxi13"></p><p>登录服务器：用户管理员名称为root，输入安装过程中设置的管理员密码</p><p><img src="https://img.chensir.ink/chensir-pics/202206091217700.png" alt="esxi14"></p><p>回车登录后会看到以下画面</p><p><img src="https://img.chensir.ink/chensir-pics/202206091217143.png" alt="esxi15"></p><p>设置静态IP</p><p>选中Configure Management Network回车进入，在选中IPV4 configuration进行IP配置，回车确定</p><p>默认为通过DHCP获取的IP地址，修改为静态IP地址</p><p><img src="https://img.chensir.ink/chensir-pics/202206091218322.png" alt="esxi16"></p><p>回车进行IP配置</p><p><img src="https://img.chensir.ink/chensir-pics/202206091218186.png" alt="esxi17"></p><p><img src="https://img.chensir.ink/chensir-pics/202206091218300.png" alt="esxi18"></p><p>配置DNS</p><p><img src="https://img.chensir.ink/chensir-pics/202206091218516.png" alt="esxi19"></p><p><img src="https://img.chensir.ink/chensir-pics/202206091218902.png" alt="esxi20"></p><p>重启网络：上面界面完成后，按ESC退出，再按Y确认重启网络服务</p><p><img src="https://img.chensir.ink/chensir-pics/202206091219201.png" alt="esxi21"></p><p>启用本地登录和ssh服务连接功能</p><p>选中Troubleshoot Options进行ssh服务设置</p><p><img src="https://img.chensir.ink/chensir-pics/202206091219875.png" alt="esxi22"></p><p><img src="https://img.chensir.ink/chensir-pics/202206091219180.png" alt="esxi23"></p><p>登录web管理页面 通过浏览器可以单独访问web界面进行单机管理</p><p><img src="https://img.chensir.ink/chensir-pics/202206091219580.png" alt="esxi24"></p><p><img src="https://img.chensir.ink/chensir-pics/202206091219567.png" alt="esxi25"></p><p><img src="https://img.chensir.ink/chensir-pics/202206091220343.png" alt="esxi26"></p><h1 id="在ESXI创建和管理虚拟机"><a href="#在ESXI创建和管理虚拟机" class="headerlink" title="在ESXI创建和管理虚拟机"></a>在ESXI创建和管理虚拟机</h1><h2 id="准备ISO镜像"><a href="#准备ISO镜像" class="headerlink" title="准备ISO镜像"></a>准备ISO镜像</h2><p>将系统镜像上传至当前ESXI节点：存储&#x3D;&gt;数据存储浏览器&#x3D;&gt;创建目录&#x3D;&gt;上载</p><p><img src="https://img.chensir.ink/chensir-pics/202206091220287.png" alt="ex1"></p><p><img src="https://img.chensir.ink/chensir-pics/202206091220060.png" alt="ex2"></p><p><img src="https://img.chensir.ink/chensir-pics/202206091221666.png" alt="ex3"></p><p><img src="https://img.chensir.ink/chensir-pics/202206091221430.png" alt="ex4"></p><p>上传的ISO文件实际保存在ESXI主机的目录：<code>/vmfs/volumes/datastore1/ISO</code></p><h2 id="创建虚拟机"><a href="#创建虚拟机" class="headerlink" title="创建虚拟机"></a>创建虚拟机</h2><p>通过web页面创建虚拟机</p><h3 id="创建虚拟机并选择类型"><a href="#创建虚拟机并选择类型" class="headerlink" title="创建虚拟机并选择类型"></a>创建虚拟机并选择类型</h3><p>虚拟机&#x3D;&gt;新建&#x2F;注册虚拟机，按照显示安装</p><p><img src="https://img.chensir.ink/chensir-pics/202206091221129.png" alt="ex5"></p><h3 id="定义虚拟机名称与版本"><a href="#定义虚拟机名称与版本" class="headerlink" title="定义虚拟机名称与版本"></a>定义虚拟机名称与版本</h3><p><img src="https://img.chensir.ink/chensir-pics/202206091221954.png" alt="ex6"></p><h3 id="定义存储"><a href="#定义存储" class="headerlink" title="定义存储"></a>定义存储</h3><p>默认设置即可</p><p><img src="https://img.chensir.ink/chensir-pics/202206091221074.png" alt="ex7"></p><h3 id="自定义配置"><a href="#自定义配置" class="headerlink" title="自定义配置"></a>自定义配置</h3><p>虚拟机基础信息定义</p><p><img src="https://img.chensir.ink/chensir-pics/202206091222249.png" alt="ex8"></p><p><img src="https://img.chensir.ink/chensir-pics/202206091222583.png" alt="ex9"></p><h4 id="磁盘配置说明"><a href="#磁盘配置说明" class="headerlink" title="磁盘配置说明"></a>磁盘配置说明</h4><ul><li>厚置备延迟置零（默认 default）：默认的创建格式，创建过程中为虚拟磁盘分配所需空间。创建时不会擦除物理设备上保留的任何数据，没有置零操作，当有IO操作时，需要等待清零操作完成后才能完成IO，即：分配好空间，执行写操作时才会按需要将其置零。</li><li>后置备置零（thick）：创建支持集群功能的厚磁盘。在创建时为虚拟磁盘分配所需的空间。并将物理设备上保留的数据置零。创建这种格式的磁盘所需的时间可能会比创建其他类型的磁盘长。即：分配好空间并置零操作，有IO时无需等待任何操作直接执行。</li><li>精简置备（thin）：精简置备就是无伦磁盘分配多大，实际占用的大小是现在使用的大小，即用多少算多少。当客户机有输入输出的时候，vmkernel首先分配需要的空间并进行清零操作，也就是说如果使用精简配置在有IO的时候需要等待分配空间和清零，这两个步骤完成后才能进行操作，对于IO叫频繁的应用这样性能会有所下降，虽然节省了存储空间。</li></ul><h4 id="磁盘模式说明"><a href="#磁盘模式说明" class="headerlink" title="磁盘模式说明"></a>磁盘模式说明</h4><ul><li>从属：是默认的磁盘模式，它既无特殊型也无特殊要求，只有普通的vmdk磁盘、创建快照后，数据将与磁盘增量一起保存，已根据需要添加到现有数据中或删除。</li><li>独立-持久：如果经常使用快照功能，则它非常有用。还原快照时。在此模式下它完全不会影响磁盘。这种磁盘在数据不需要恢复到初始状态的情况下非常有用，例如系统日志或站点日志，其内容需要保存在当前状态。删除快照时切换到此次盘模式，如果启动或停止VM，数据保持不变。</li><li>独立-非持久：这是一个重做磁盘，这意味着如果在启用“独立-非-持久”模式的情况下启动VM，则所有更改都将写入磁盘增量中。以前存在的数据为只读。因此，如果停止或启动虚拟机（不是重启，不影响任何操作），或者删除快照，则所有更改都将被放弃。</li></ul><p>总而言之，你可以打开和关闭这些模式中的每一个，但请记住，只有在VM停止后才能这样做。</p><h4 id="确认完成信息"><a href="#确认完成信息" class="headerlink" title="确认完成信息"></a>确认完成信息</h4><p><img src="https://img.chensir.ink/chensir-pics/202206091222575.png" alt="ex10"></p><h4 id="开始安装过程"><a href="#开始安装过程" class="headerlink" title="开始安装过程"></a>开始安装过程</h4><p>打开虚拟机电源，开始系统安装</p><p><img src="https://img.chensir.ink/chensir-pics/202206091222744.png" alt="ex11"></p><p>打开控制台进行常规系统安装即可</p><p><img src="https://img.chensir.ink/chensir-pics/202206091222591.png" alt="ex12"></p><h4 id="初始化系统：关selinux-防火墙等"><a href="#初始化系统：关selinux-防火墙等" class="headerlink" title="初始化系统：关selinux 防火墙等"></a>初始化系统：关selinux 防火墙等</h4><p>具体的看我的另一篇文章 <a href="https://chensir.ink/0abec7f652b7/">《Centos7 初步操作指北》</a></p><h4 id="将虚拟机的光驱卸载"><a href="#将虚拟机的光驱卸载" class="headerlink" title="将虚拟机的光驱卸载"></a>将虚拟机的光驱卸载</h4><p>关闭虚拟机后，将光驱卸载，防止后期迁移出错</p><p><strong>注意</strong>：关闭虚拟机在修改配置，否则会很慢</p><p><img src="https://img.chensir.ink/chensir-pics/202206091223404.png" alt="ex13"></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;VMware简介&quot;&gt;&lt;a href=&quot;#VMware简介&quot; class=&quot;headerlink&quot; title=&quot;VMware简介&quot;&gt;&lt;/a&gt;VMware简介&lt;/h1&gt;&lt;h2 id=&quot;VMware介绍&quot;&gt;&lt;a href=&quot;#VMware介绍&quot;</summary>
        
      
    
    
    
    <category term="Linux" scheme="https://chensir.ink/categories/Linux/"/>
    
    
    <category term="vSphere" scheme="https://chensir.ink/tags/vSphere/"/>
    
    <category term="虚拟机" scheme="https://chensir.ink/tags/%E8%99%9A%E6%8B%9F%E6%9C%BA/"/>
    
  </entry>
  
  <entry>
    <title>Centos7安装GitLab</title>
    <link href="https://chensir.ink/2021/07/25/Centos7%E5%AE%89%E8%A3%85GitLab/"/>
    <id>https://chensir.ink/2021/07/25/Centos7%E5%AE%89%E8%A3%85GitLab/</id>
    <published>2021-07-25T10:38:07.000Z</published>
    <updated>2025-11-26T14:04:32.773Z</updated>
    
    <content type="html"><![CDATA[<h1 id="安装环境："><a href="#安装环境：" class="headerlink" title="安装环境："></a>安装环境：</h1><p>虚拟机：Centos7 最小安装 4核8G</p><h1 id="下载GitLab"><a href="#下载GitLab" class="headerlink" title="下载GitLab"></a>下载GitLab</h1><p>本次实验下载的是 gitlab-ce-14.1.0-ce.0.el7.x86_64.rpm</p><p>官网截图</p><p><img src="https://img.chensir.ink/chensir-pics/202206091155629.png" alt="gitlab-a"></p><p>清华源截图</p><p><img src="https://img.chensir.ink/chensir-pics/202206091155207.png" alt="gitlab-b"></p><ul><li>安装包下载地址(官网；下载CE版本，EE是收费版本)：<a href="https://packages.gitlab.com/gitlab/gitlab-ce">https://packages.gitlab.com/gitlab/gitlab-ce</a></li><li>国内镜像源下载地址(清华源)：<a href="https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/">https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/</a></li></ul><h1 id="安装GitLab"><a href="#安装GitLab" class="headerlink" title="安装GitLab"></a>安装GitLab</h1><p>安装Postfix用于发送通知邮件，当然也可以使用其他SMTP服务器来发送邮件，本次实验使用Postfix。</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">yum install -y postfix</span><br></pre></td></tr></table></figure><p><img src="https://img.chensir.ink/chensir-pics/202206091156862.png" alt="gitlab-d"></p><p>安装GitLab</p><p><img src="https://img.chensir.ink/chensir-pics/202206091156589.png" alt="gitlab-c"></p><h2 id="在线安装"><a href="#在线安装" class="headerlink" title="在线安装"></a>在线安装</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | <span class="built_in">sudo</span> bash</span><br></pre></td></tr></table></figure><p><img src="https://img.chensir.ink/chensir-pics/202206091156492.png" alt="gitlab-e"></p><p><img src="https://img.chensir.ink/chensir-pics/202206091157364.png" alt="gitlab-f"></p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">yum install gitlab-ce-14.1.0-ce.0.el7.x86_64</span><br></pre></td></tr></table></figure><p><img src="https://img.chensir.ink/chensir-pics/202206091157835.png" alt="gitlab-h"></p><p><img src="https://img.chensir.ink/chensir-pics/202206091157882.png" alt="gitlab-g"></p><h2 id="离线安装"><a href="#离线安装" class="headerlink" title="离线安装"></a>离线安装</h2><p>将安装程序下载并上传至服务器，在安装程序所在目录执行</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">rpm -ivh gitlab-ce-14.1.0-ce.0.el7.x86_64.rpm --nodeps --force</span><br></pre></td></tr></table></figure><p>与在线安装一样出现GitLab图标安装成功</p><h1 id="配置GitLab"><a href="#配置GitLab" class="headerlink" title="配置GitLab"></a>配置GitLab</h1><h2 id="修改-etc-gitlab-gitlab-rb"><a href="#修改-etc-gitlab-gitlab-rb" class="headerlink" title="修改&#x2F;etc&#x2F;gitlab&#x2F;gitlab.rb"></a>修改&#x2F;etc&#x2F;gitlab&#x2F;gitlab.rb</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vi /etc/gitlab/gitlab.rb</span><br></pre></td></tr></table></figure><p><img src="https://img.chensir.ink/chensir-pics/202206091158951.png" alt="gitlab-i"></p><p>external_url 指的是通过外部的哪个域名访问GitLab。可以写成本机的IP如：<a href="http://10.0.0.60/">http://10.0.0.60</a></p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">external_url <span class="string">&#x27;http://10.0.0.60&#x27;</span></span><br></pre></td></tr></table></figure><p>可选邮件配置</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">gitlab_rails[&#x27;smtp_enable&#x27;] = true</span><br><span class="line">gitlab_rails[&#x27;smtp_address&#x27;] = &quot;smtp.qq.com&quot;</span><br><span class="line">gitlab_rails[&#x27;smtp_port&#x27;] = 465</span><br><span class="line">gitlab_rails[&#x27;smtp_user_name&#x27;] = &quot;xchensir.qq.com&quot;</span><br><span class="line">gitlab_rails[&#x27;smtp_password&#x27;] = &quot;***************&quot;</span><br><span class="line">gitlab_rails[&#x27;smtp_domain&#x27;] = &quot;qq.com&quot;</span><br><span class="line">gitlab_rails[&#x27;smtp_authentication&#x27;] = &quot;login&quot;</span><br><span class="line">gitlab_rails[&#x27;smtp_enable_starttls_auto&#x27;] = true</span><br><span class="line">gitlab_rails[&#x27;smtp_tls&#x27;] = true</span><br><span class="line"></span><br><span class="line">gitlab_rails[&#x27;gitlab_email_from&#x27;] = &#x27;xhcensir@qq.com&#x27;</span><br><span class="line">user[&#x27;git_user_email&#x27;] = &quot;xchensir@qq.com&quot;</span><br></pre></td></tr></table></figure><h2 id="初始化服务"><a href="#初始化服务" class="headerlink" title="初始化服务"></a>初始化服务</h2><p>执行配置并启动服务</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 修改完配置文件需执行该命令并执行重启命令</span><br><span class="line">gitlab-ctl reconfigure</span><br><span class="line"></span><br><span class="line"># 重启命令</span><br><span class="line">gitlab-ctl restart</span><br></pre></td></tr></table></figure><h2 id="GitLab相关目录："><a href="#GitLab相关目录：" class="headerlink" title="GitLab相关目录："></a>GitLab相关目录：</h2><ul><li>配置文件目录：&#x2F;etc&#x2F;gitlab</li><li>运行PID目录：&#x2F;run&#x2F;gitlab</li><li>安装目录：&#x2F;opt&#x2F;gitlab</li><li>数据目录：&#x2F;var&#x2F;opt&#x2F;gitlab</li><li>日志目录：&#x2F;var&#x2F;log&#x2F;gitlab</li></ul><h2 id="GitLab常用命令"><a href="#GitLab常用命令" class="headerlink" title="GitLab常用命令"></a>GitLab常用命令</h2><ul><li><p>启动控制台进行特殊操作（修改管理员密码、打开数据库控制台等’gitlab-rails dbconsole’）：gitlab-rails</p></li><li><p>数据库命令行：gitlab-psql</p></li><li><p>数据备份恢复等操作：gitlab-rake</p></li><li><p>客户端命令行操作：gitlab-ctl</p><ul><li>停止gitlab：stop</li><li>启动gitlab：start</li><li>重启gitlab：restart</li><li>查看组件运行状态：status</li><li>查看某个组件的日志：tail nginx</li></ul></li></ul><h2 id="验证GitLab启动完成"><a href="#验证GitLab启动完成" class="headerlink" title="验证GitLab启动完成"></a>验证GitLab启动完成</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">gitlab-ctl status</span><br></pre></td></tr></table></figure><p><img src="https://img.chensir.ink/chensir-pics/202206091159568.png" alt="gitlabj"></p><h2 id="验证端口及状态"><a href="#验证端口及状态" class="headerlink" title="验证端口及状态"></a>验证端口及状态</h2><p>80端口是在初始化GitLab时启动的，如果之前有程序占用会导致初始化失败或无法访问GitLab。</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 最小化安装没有lsof 需要安装</span><br><span class="line">yum install -y lsof</span><br><span class="line"></span><br><span class="line"># 查看80端口状态</span><br><span class="line">lsof -i:80</span><br></pre></td></tr></table></figure><p><img src="https://img.chensir.ink/chensir-pics/202206091200553.png" alt="gitlab-01"></p><h1 id="登录GitLab"><a href="#登录GitLab" class="headerlink" title="登录GitLab"></a>登录GitLab</h1><p>进入到页面会让你输入用户名和密码</p><p><img src="https://img.chensir.ink/chensir-pics/202206091200341.png" alt="gitlab-002"></p><p>初始管理员用户为<strong>root</strong>，密码在安装过程中已随机生成并保存在&#x2F;etc&#x2F;gitlab&#x2F;initial_root_password中，有效期24小时</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 查看root用户密码</span><br><span class="line">cat /etc/gitlab/initial_root_password</span><br></pre></td></tr></table></figure><h2 id="默认首页"><a href="#默认首页" class="headerlink" title="默认首页"></a>默认首页</h2><p><img src="https://img.chensir.ink/chensir-pics/202206091202850.png" alt="gitlab-003"></p><h2 id="关闭注册"><a href="#关闭注册" class="headerlink" title="关闭注册"></a>关闭注册</h2><p><img src="https://img.chensir.ink/chensir-pics/202206091202034.png" alt="gitlab-004"></p><p><img src="https://img.chensir.ink/chensir-pics/202206091203005.png" alt="gitlab-005"></p><h1 id="问题汇总"><a href="#问题汇总" class="headerlink" title="问题汇总"></a>问题汇总</h1><h2 id="发送邮件通知问题"><a href="#发送邮件通知问题" class="headerlink" title="发送邮件通知问题"></a>发送邮件通知问题</h2><p>邮件发布出去大致两个原因：</p><ul><li>默认端口好被限制</li><li>SMTP邮箱有问题</li></ul><p>上操作：</p><ul><li><p>检查配置文件SMTP配置是否有问题，参照上文中配置GitLab的配置</p></li><li><p>如果SMTP配置没有问题 进入控制台查看 </p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">gitlab-rails console</span><br><span class="line"></span><br><span class="line"># 输入邮箱地址后根据响应的提示排错找到具体原因：</span><br><span class="line"># 如QQ邮箱：需要授权码 密码配置填写的是授权码而不是邮箱密码</span><br><span class="line">Notify.test_email(&#x27;***@******.com&#x27;,&#x27;email title&#x27;,&#x27;email content desc&#x27;).deliver_now</span><br></pre></td></tr></table></figure><p>修改好配置文件，依次执行：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">gitlab-ctl reconfigure</span><br><span class="line">gitlab-ctl restart</span><br></pre></td></tr></table></figure></li></ul><h2 id="登录GitLab-422"><a href="#登录GitLab-422" class="headerlink" title="登录GitLab 422"></a>登录GitLab 422</h2><p>服务器时间与本地时间不一致</p><p>解决方法：大多数是服务器时间的问题，修改时间即可</p><h1 id="重置GitLab管理员密码"><a href="#重置GitLab管理员密码" class="headerlink" title="重置GitLab管理员密码"></a>重置GitLab管理员密码</h1><h2 id="切换到相应路径"><a href="#切换到相应路径" class="headerlink" title="切换到相应路径"></a>切换到相应路径</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cd /opt/gitlab/bin/</span><br></pre></td></tr></table></figure><h2 id="进入控制台"><a href="#进入控制台" class="headerlink" title="进入控制台"></a>进入控制台</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">gitlab-rails console</span><br></pre></td></tr></table></figure><h2 id="查询root用户账号信息并赋值"><a href="#查询root用户账号信息并赋值" class="headerlink" title="查询root用户账号信息并赋值"></a>查询root用户账号信息并赋值</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">u=User.find(1)</span><br></pre></td></tr></table></figure><h2 id="设置密码"><a href="#设置密码" class="headerlink" title="设置密码"></a>设置密码</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">u.password=&#x27;root123456&#x27;</span><br></pre></td></tr></table></figure><h2 id="确认密码（非必须）"><a href="#确认密码（非必须）" class="headerlink" title="确认密码（非必须）"></a>确认密码（非必须）</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">u.password_confirmation = &#x27;root123456&#x27;</span><br></pre></td></tr></table></figure><h2 id="保存设置"><a href="#保存设置" class="headerlink" title="保存设置"></a>保存设置</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">u.save!</span><br></pre></td></tr></table></figure><h2 id="退出控制台"><a href="#退出控制台" class="headerlink" title="退出控制台"></a>退出控制台</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">exit</span><br></pre></td></tr></table></figure><h2 id="重启GitLab"><a href="#重启GitLab" class="headerlink" title="重启GitLab"></a>重启GitLab</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">gitlab-ctl restart</span><br></pre></td></tr></table></figure><h1 id="完全卸载GitLab"><a href="#完全卸载GitLab" class="headerlink" title="完全卸载GitLab"></a>完全卸载GitLab</h1><h2 id="停止GitLab"><a href="#停止GitLab" class="headerlink" title="停止GitLab"></a>停止GitLab</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">gitlab-ctl stop</span><br></pre></td></tr></table></figure><h2 id="卸载GitLab"><a href="#卸载GitLab" class="headerlink" title="卸载GitLab"></a>卸载GitLab</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">rpm -e gitlab-ce</span><br></pre></td></tr></table></figure><h2 id="查看GitLab进程"><a href="#查看GitLab进程" class="headerlink" title="查看GitLab进程"></a>查看GitLab进程</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">ps aux | grep gitlab</span><br></pre></td></tr></table></figure><h2 id="kill掉第一个进程"><a href="#kill掉第一个进程" class="headerlink" title="kill掉第一个进程"></a>kill掉第一个进程</h2><p>kill掉之后 再次查看gitlab进程，确认是否被停止</p><h2 id="删除所有包含gitlab的文件"><a href="#删除所有包含gitlab的文件" class="headerlink" title="删除所有包含gitlab的文件"></a>删除所有包含gitlab的文件</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">find / -name gitlab | xargs rm -rf</span><br></pre></td></tr></table></figure><h1 id="Git常用命令"><a href="#Git常用命令" class="headerlink" title="Git常用命令"></a>Git常用命令</h1><h2 id="设置全局用户名"><a href="#设置全局用户名" class="headerlink" title="设置全局用户名"></a>设置全局用户名</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git config --global user.name &quot;name&quot;</span><br></pre></td></tr></table></figure><h2 id="设置全局邮箱"><a href="#设置全局邮箱" class="headerlink" title="设置全局邮箱"></a>设置全局邮箱</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git config --global user.email xxx@xxx.com</span><br></pre></td></tr></table></figure><h2 id="列出用户全局配置"><a href="#列出用户全局配置" class="headerlink" title="列出用户全局配置"></a>列出用户全局配置</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git config --global --list</span><br></pre></td></tr></table></figure><h2 id="添加到暂存区"><a href="#添加到暂存区" class="headerlink" title="添加到暂存区"></a>添加到暂存区</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git add -A</span><br></pre></td></tr></table></figure><h2 id="提交文件到工作区"><a href="#提交文件到工作区" class="headerlink" title="提交文件到工作区"></a>提交文件到工作区</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git commit -m &#x27;工作内容&#x27;</span><br></pre></td></tr></table></figure><h2 id="查看工作区状态"><a href="#查看工作区状态" class="headerlink" title="查看工作区状态"></a>查看工作区状态</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git status</span><br></pre></td></tr></table></figure><h2 id="提交代码到服务器"><a href="#提交代码到服务器" class="headerlink" title="提交代码到服务器"></a>提交代码到服务器</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git push</span><br></pre></td></tr></table></figure><h2 id="获取代码到本地"><a href="#获取代码到本地" class="headerlink" title="获取代码到本地"></a>获取代码到本地</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git pull</span><br></pre></td></tr></table></figure><h2 id="查看操作日志"><a href="#查看操作日志" class="headerlink" title="查看操作日志"></a>查看操作日志</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git log</span><br></pre></td></tr></table></figure><h2 id="定义忽略文件上传至gitlab"><a href="#定义忽略文件上传至gitlab" class="headerlink" title="定义忽略文件上传至gitlab"></a>定义忽略文件上传至gitlab</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vim .gitignore</span><br></pre></td></tr></table></figure><h2 id="版本回滚"><a href="#版本回滚" class="headerlink" title="版本回滚"></a>版本回滚</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># HEAD为当前版本，加上一个^为上一版本 ^^为上上一个版本</span><br><span class="line">git reset --hard HEAD^^</span><br></pre></td></tr></table></figure><h2 id="获取每次提交的ID"><a href="#获取每次提交的ID" class="headerlink" title="获取每次提交的ID"></a>获取每次提交的ID</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 可以使用 --hard 根据提交的ID进行版本回退</span><br><span class="line">git reflog</span><br></pre></td></tr></table></figure><h2 id="回退到指定版本"><a href="#回退到指定版本" class="headerlink" title="回退到指定版本"></a>回退到指定版本</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git reset --hard 5ae4b07i0</span><br></pre></td></tr></table></figure><h2 id="查看当前所在分支"><a href="#查看当前所在分支" class="headerlink" title="查看当前所在分支"></a>查看当前所在分支</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git branch</span><br></pre></td></tr></table></figure><h2 id="创建并切换到一个新分支"><a href="#创建并切换到一个新分支" class="headerlink" title="创建并切换到一个新分支"></a>创建并切换到一个新分支</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git checkout -b develop</span><br></pre></td></tr></table></figure><h2 id="切换分支"><a href="#切换分支" class="headerlink" title="切换分支"></a>切换分支</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git checkout develop</span><br></pre></td></tr></table></figure><h1 id="GitLab数据备份与恢复"><a href="#GitLab数据备份与恢复" class="headerlink" title="GitLab数据备份与恢复"></a>GitLab数据备份与恢复</h1><h2 id="停止gitlab数据服务"><a href="#停止gitlab数据服务" class="headerlink" title="停止gitlab数据服务"></a>停止gitlab数据服务</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">gitlab-ctl stop unicorn</span><br><span class="line">gitlab-ctl stop sidekiq</span><br></pre></td></tr></table></figure><h2 id="手动备份数据"><a href="#手动备份数据" class="headerlink" title="手动备份数据"></a>手动备份数据</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 在任意目录即可备份当前gitlab数据</span><br><span class="line">gitlab-rake gitlab:backup:create</span><br><span class="line"></span><br><span class="line"># 备份完成后启动gitlab</span><br><span class="line">gitlab-ctl start </span><br></pre></td></tr></table></figure><h2 id="查看要恢复的文件"><a href="#查看要恢复的文件" class="headerlink" title="查看要恢复的文件"></a>查看要恢复的文件</h2><ul><li>数据备份目录：&#x2F;var&#x2F;opt&#x2F;gitlab&#x2F;backups&#x2F;</li><li>nginx配置文件：&#x2F;var&#x2F;opt&#x2F;gitlab&#x2F;nginx&#x2F;conf</li><li>gitlab配置文件：&#x2F;etc&#x2F;gitlab&#x2F;gitlab.rd</li><li>key文件：&#x2F;etc&#x2F;gitlab&#x2F;gitlab-secrets.json</li></ul><h2 id="执行恢复"><a href="#执行恢复" class="headerlink" title="执行恢复"></a>执行恢复</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">gitlab-ctl stop unicorn</span><br><span class="line"></span><br><span class="line"># 数据恢复之前停止服务</span><br><span class="line">gitlab-ctl stop sidekiq</span><br><span class="line"></span><br><span class="line">gitlab-rake gitlab:backup:restore BACKUP=备份文件名</span><br></pre></td></tr></table></figure><h2 id="启动服务"><a href="#启动服务" class="headerlink" title="启动服务"></a>启动服务</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">gitlab-ctl start sidekiq</span><br><span class="line">gitlab-ctl start unicorn</span><br></pre></td></tr></table></figure><h1 id="本地定时备份数据"><a href="#本地定时备份数据" class="headerlink" title="本地定时备份数据"></a>本地定时备份数据</h1><h2 id="准备工作："><a href="#准备工作：" class="headerlink" title="准备工作："></a>准备工作：</h2><ul><li>本地默认备份路径：&#x2F;var&#x2F;opt&#x2F;gitlab&#x2F;backups&#x2F;</li><li>备份命令：gitlab-rake gitlab:backup:create</li><li>恢复命令：gitlab-rake gitlab:backup:restore BACKUP&#x3D;备份文件名</li><li>配置文件：&#x2F;etc&#x2F;gitlab&#x2F;gitlab.rd</li></ul><h2 id="修改配置文件"><a href="#修改配置文件" class="headerlink" title="修改配置文件"></a>修改配置文件</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vim /etc/gitlab/gitlab.rd</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">gitlab_rails[&#x27;manage_backup_path&#x27;] = true</span><br><span class="line"></span><br><span class="line"># 备份目录</span><br><span class="line">gitlab_rails[&#x27;backup_path&#x27;] = &quot;/var/opt/gitlab/backups&quot;</span><br><span class="line"></span><br><span class="line"># 生成备份文件的权限</span><br><span class="line">gitlab_rails[&#x27;backup_archive_permissions&#x27;] = 0644</span><br><span class="line"></span><br><span class="line"># 备份保留天数，秒计算</span><br><span class="line">gitlab_rails[&#x27;backup_keep_time&#x27;] = 604800</span><br></pre></td></tr></table></figure><h2 id="更新配置文件使其生效"><a href="#更新配置文件使其生效" class="headerlink" title="更新配置文件使其生效"></a>更新配置文件使其生效</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">gitlab-ctl reconfigure</span><br></pre></td></tr></table></figure><h2 id="添加定时任务"><a href="#添加定时任务" class="headerlink" title="添加定时任务"></a>添加定时任务</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">crontab -e</span><br><span class="line"></span><br><span class="line"># 每天凌晨两点执行备份命令</span><br><span class="line">0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create</span><br></pre></td></tr></table></figure><h2 id="查看定时任务"><a href="#查看定时任务" class="headerlink" title="查看定时任务"></a>查看定时任务</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">corntab -l</span><br></pre></td></tr></table></figure><h2 id="设置crontab自启"><a href="#设置crontab自启" class="headerlink" title="设置crontab自启"></a>设置crontab自启</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">systemctl enable crontab</span><br><span class="line"></span><br><span class="line"># 修改后重启crontab服务</span><br><span class="line">systemctl restart crontab</span><br></pre></td></tr></table></figure><h2 id="验证备份结果"><a href="#验证备份结果" class="headerlink" title="验证备份结果"></a>验证备份结果</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">ls -al /var/opt/gitlab/backups</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;安装环境：&quot;&gt;&lt;a href=&quot;#安装环境：&quot; class=&quot;headerlink&quot; title=&quot;安装环境：&quot;&gt;&lt;/a&gt;安装环境：&lt;/h1&gt;&lt;p&gt;虚拟机：Centos7 最小安装 4核8G&lt;/p&gt;
&lt;h1 id=&quot;下载GitLab&quot;&gt;&lt;a</summary>
        
      
    
    
    
    <category term="GitLab" scheme="https://chensir.ink/categories/GitLab/"/>
    
    
    <category term="GitLab" scheme="https://chensir.ink/tags/GitLab/"/>
    
  </entry>
  
  <entry>
    <title>DevOps 你了解多少？</title>
    <link href="https://chensir.ink/2021/07/25/DevOps-%E4%BD%A0%E4%BA%86%E8%A7%A3%E5%A4%9A%E5%B0%91%EF%BC%9F/"/>
    <id>https://chensir.ink/2021/07/25/DevOps-%E4%BD%A0%E4%BA%86%E8%A7%A3%E5%A4%9A%E5%B0%91%EF%BC%9F/</id>
    <published>2021-07-25T08:03:56.000Z</published>
    <updated>2025-11-26T14:04:32.753Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>DevOps是Development和Operations的组合，也就是开发和运维的简写。</p><p>DevOps是针对企业中的研发人员、运维人员和测试人员的工作理念，是他们在应用开发、代码部署和质量检测等整条生命周期中协作和沟通的最佳实践。</p><p>DevOps强调整个组织的合作以及交付和基础设施变更的自动化，从而实现持续集成、持续部署和持续交付。</p></blockquote><h1 id="什么是DevOps"><a href="#什么是DevOps" class="headerlink" title="什么是DevOps"></a>什么是DevOps</h1><p><img src="https://img.chensir.ink/chensir-pics/202206091153964.png" alt="dev-1"></p><h1 id="为什么要推广DevOps"><a href="#为什么要推广DevOps" class="headerlink" title="为什么要推广DevOps"></a>为什么要推广DevOps</h1><p>DevOps强调团队协作、相互协助、持续发展，然而传统的模式是开发人员只顾开发程序，运维只负责基础环境管理和代码部署及监控，其并不是为了一个共同的目标而共同实现最终的目的，儿DevOps则实现团队作战，即无论是开发、运维还是测试，都为了最终的代码发布、持续部署和业务稳定而付出各自的努力，从而实现产品设计、开发、测试和部署的良性循环，实现产品的最终持续交付。</p><h1 id="传统技术团队"><a href="#传统技术团队" class="headerlink" title="传统技术团队"></a>传统技术团队</h1><p><img src="https://img.chensir.ink/chensir-pics/202206091153330.jpg" alt="dev-2"></p><h1 id="DevOps技术团队"><a href="#DevOps技术团队" class="headerlink" title="DevOps技术团队"></a>DevOps技术团队</h1><p>戴明环</p><p><img src="https://img.chensir.ink/chensir-pics/202206091153208.png" alt="dev-3"></p><h1 id="什么是持续集成（CI）"><a href="#什么是持续集成（CI）" class="headerlink" title="什么是持续集成（CI）"></a>什么是持续集成（CI）</h1><p><strong>CI-Continuous Integration</strong></p><p>持续集成是指多名开发者开发不同功能代码的过程中，可以频繁的将代码合并到一起并且相互不影响工作。</p><h1 id="什么是持续部署（CD）"><a href="#什么是持续部署（CD）" class="headerlink" title="什么是持续部署（CD）"></a>什么是持续部署（CD）</h1><p><strong>CD-Continuous Deployment</strong></p><p>持续部署是基于某种工具或平台实现代码自动化的构建、测试和部署到线上环境以实现交付高质量的产品，持续部署在某种程度上代表了一个开发团队的更新迭代速率。</p><h1 id="什么是持续交付"><a href="#什么是持续交付" class="headerlink" title="什么是持续交付"></a>什么是持续交付</h1><p>持续交付是在持续部署的基础上，将产品交付到线上环境，因此持续交付是产品价值的一种交付，是产品价值的一种盈利的实现。</p><h1 id="常见的部署方式"><a href="#常见的部署方式" class="headerlink" title="常见的部署方式"></a>常见的部署方式</h1><ul><li>开发自己上传——最原始的方案</li><li>开发给运维手动上传——运维自己手动部署</li><li>运维使用脚本复制——半自动</li><li>结合web界面一键部署——自动化</li></ul><h1 id="常见的持续集成开源工具"><a href="#常见的持续集成开源工具" class="headerlink" title="常见的持续集成开源工具"></a>常见的持续集成开源工具</h1><p>在公司服务器安装的某种程序，该程序用于按照特定格式和方式记录和保存公司多名开发人员不定期提交的源代码，后期可以按照某种标记及方式对用混提交的数据进行还原。</p><h2 id="CVS（Concurrent-Version-System）"><a href="#CVS（Concurrent-Version-System）" class="headerlink" title="CVS（Concurrent Version System）"></a>CVS（Concurrent Version System）</h2><p>早期的集中式版本控制系统，现基本淘汰（会出现数据提交后不完整的情况）</p><h2 id="SVN（Subversion）"><a href="#SVN（Subversion）" class="headerlink" title="SVN（Subversion）"></a>SVN（Subversion）</h2><p>集中式版本控制系统，2000年开始开发，目标是替代CVS集中式管理，依赖于网络，一台服务器集中管理，目前依然有部分公司在使用。</p><h2 id="Git"><a href="#Git" class="headerlink" title="Git"></a>Git</h2><p>分布式版本控制系统，详细说明参考本站的另一文章：<a href="https://chensir.ink/748ccaec5a3b/">Git 了解一下不？</a></p><h1 id="版本控制系统分类"><a href="#版本控制系统分类" class="headerlink" title="版本控制系统分类"></a>版本控制系统分类</h1><h2 id="集中式版本控制系统"><a href="#集中式版本控制系统" class="headerlink" title="集中式版本控制系统"></a>集中式版本控制系统</h2><p>任何提交和回滚都依赖于连接服务器，SVN服务器是单点</p><h2 id="分布式版本控制系统"><a href="#分布式版本控制系统" class="headerlink" title="分布式版本控制系统"></a>分布式版本控制系统</h2><p>Git：每个用户都是一个完整的版本库，即使没有中央服务器也可以提交和回滚代码，最终再把改好的代码提交至中央服务器进行合并即可。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;DevOps是Development和Operations的组合，也就是开发和运维的简写。&lt;/p&gt;
&lt;p&gt;DevOps是针对企业中的研发人员、运维人员和测试人员的工作理念，是他们在应用开发、代码部署和质量检测等整条生命周期中协作和沟通的最佳实践。&lt;</summary>
        
      
    
    
    
    <category term="devops" scheme="https://chensir.ink/categories/devops/"/>
    
    
    <category term="devops" scheme="https://chensir.ink/tags/devops/"/>
    
  </entry>
  
  <entry>
    <title>基于gogs快速搭建私有Git服务</title>
    <link href="https://chensir.ink/2021/07/19/%E5%9F%BA%E4%BA%8Egogs%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BA%E7%A7%81%E6%9C%89Git%E6%9C%8D%E5%8A%A1/"/>
    <id>https://chensir.ink/2021/07/19/%E5%9F%BA%E4%BA%8Egogs%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BA%E7%A7%81%E6%9C%89Git%E6%9C%8D%E5%8A%A1/</id>
    <published>2021-07-19T11:26:47.000Z</published>
    <updated>2025-11-26T14:04:32.733Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>Gogs是一款开源的轻量级Git Web服务，简单易用，跨平台。其主要功能有：提供http与ssh两种协议访问源码服务；提供web管理界面可查看修改源码代码；提供较完善的权限管理功能、其中包括组织、团队、个人等仓库权限；提供简单的项目VIKI功能；提供工单管理与里程碑管理。</p></blockquote><h1 id="下载安装"><a href="#下载安装" class="headerlink" title="下载安装"></a>下载安装</h1><p>官网：<a href="https://gogs.io/">https://gogs.io</a></p><p>下载：Linux amd64:<a href="https://dl.gogs.io/0.12.3/gogs_0.12.3_linux_amd64.tar.gz">https://dl.gogs.io/0.12.3/gogs_0.12.3_linux_amd64.tar.gz</a></p><p>安装文档：<a href="https://gogs.io/docs/installation/install_from_binary">https://gogs.io/docs/installation/install_from_binary</a></p><h1 id="Gogs基础配置"><a href="#Gogs基础配置" class="headerlink" title="Gogs基础配置"></a>Gogs基础配置</h1><h2 id="邮件配置说明："><a href="#邮件配置说明：" class="headerlink" title="邮件配置说明："></a>邮件配置说明：</h2><p>邮件配置是用于注册时邮件确认，和找回密码时验证邮件发送。其配置分为两步：</p><ul><li>创建一个开通了SMTP服务的邮箱账号，一般用公司管理员邮箱，我这用的QQ邮箱</li><li>在{gogs_home&#x2F;custom&#x2F;conf&#x2F;app,ini}文件中配置（初次登陆走完安装引导流程之后才会生成配置文件相关目录）。</li></ul><h3 id="QQ邮箱开通SMTP"><a href="#QQ邮箱开通SMTP" class="headerlink" title="QQ邮箱开通SMTP"></a>QQ邮箱开通SMTP</h3><p>1.点击设置</p><p><img src="https://img.chensir.ink/chensir-pics/202206091150061.png" alt="gogs-2"></p><p>2.开启smtp</p><p><img src="https://img.chensir.ink/chensir-pics/202206091150911.png" alt="gogs-3"></p><p>开启时候启动项目，进入安装引导页面按照要求填写即可。</p><h2 id="下载安装包至服务器"><a href="#下载安装包至服务器" class="headerlink" title="下载安装包至服务器"></a>下载安装包至服务器</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">wget https://dl.gogs.io/0.12.3/gogs_0.12.3_linux_amd64.tar.gz</span><br></pre></td></tr></table></figure><h2 id="解压安装包"><a href="#解压安装包" class="headerlink" title="解压安装包"></a>解压安装包</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">tar -zxvf gogs_0.12.3_linux_amd64.tar.gz</span><br></pre></td></tr></table></figure><h2 id="运行Gogs"><a href="#运行Gogs" class="headerlink" title="运行Gogs"></a>运行Gogs</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 前台运行</span><br><span class="line">./gogs web</span><br><span class="line"></span><br><span class="line"># 后台运行</span><br><span class="line">nohup ./gogs web &amp;</span><br></pre></td></tr></table></figure><p>默认端口：3000</p><p>初次访问：<a href="http://ip:3000/">http://ip:3000</a>  进入到初始化页面进行引导配置，可选择mysql或sqlite等数据库，本次选的是sqlite</p><p>注：mysql索引长度的问题导致gogs无法安装成功，需要使用mysql5.7以上的版本。如果是云服务器记得放开端口或者用nginx做代理。</p><p>按照页面提示合理填写即可完成安装。</p><p><img src="https://img.chensir.ink/chensir-pics/202206091151618.png" alt="gogs-x"></p><p>安装成功，登陆试试！</p><p><img src="https://img.chensir.ink/chensir-pics/202206091151552.png" alt="gogs-v"></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;Gogs是一款开源的轻量级Git</summary>
        
      
    
    
    
    <category term="Git" scheme="https://chensir.ink/categories/Git/"/>
    
    
    <category term="私有Git搭建" scheme="https://chensir.ink/tags/%E7%A7%81%E6%9C%89Git%E6%90%AD%E5%BB%BA/"/>
    
  </entry>
  
  <entry>
    <title>Git 了解一下不？</title>
    <link href="https://chensir.ink/2021/07/01/Git-%E4%BA%86%E8%A7%A3%E4%B8%80%E4%B8%8B%E4%B8%8D%EF%BC%9F/"/>
    <id>https://chensir.ink/2021/07/01/Git-%E4%BA%86%E8%A7%A3%E4%B8%80%E4%B8%8B%E4%B8%8D%EF%BC%9F/</id>
    <published>2021-07-01T12:37:13.000Z</published>
    <updated>2025-11-26T14:04:32.734Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>Git 是一个开源的分布式版本控制系统，用于敏捷高效地处理任何或小或大的项目。</p><p>Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。</p><p>Git 与常用的版本控制工具 CVS, Subversion 等不同，它采用了分布式版本库的方式，不必服务器端软件支持。</p></blockquote><h1 id="Git与Svn的区别"><a href="#Git与Svn的区别" class="headerlink" title="Git与Svn的区别"></a>Git与Svn的区别</h1><h2 id="存储方式的区别"><a href="#存储方式的区别" class="headerlink" title="存储方式的区别"></a>存储方式的区别</h2><ul><li>Git把内容按照元数据的方式存储类似key&#x2F;value数据库</li><li>Svn把内容按照文件的方式存储，把文件的元信息隐藏在一个类似 .svn、.cvs等文件夹里</li></ul><p><strong>Git的存储方式 类k&#x2F;v数据库：</strong></p><p>例：初始化一个名称为git_test的Git仓库：</p><p><code>git init git_test</code></p><p>进入到git_test目录</p><p><code>cd git_test</code></p><p>在git_test仓库内新建一个hello.txt文件并追加内容为“Hello World”</p><p><code>echo &quot;Hello World&quot; &gt; hello.txt</code></p><p>计算对象ID并将实际对象写入数据库（blob类型）</p><p><code>git hash-object -w hello.txt</code></p><p>根据对象ID打印出对象的内容</p><p><code>git cat-file -p 557db03de997c86a4a028e1ebd3a1ceb225be238</code></p><p><img src="https://img.chensir.ink/chensir-pics/202206091146241.png" alt="git-1"></p><h2 id="使用方式的区别"><a href="#使用方式的区别" class="headerlink" title="使用方式的区别"></a>使用方式的区别</h2><p>从本地把文件推送到远程服务：</p><ul><li>svn：只需要commit</li><li>git：需要 add、commit、push</li></ul><p><strong>svn使用过程：</strong></p><p><img src="https://img.chensir.ink/chensir-pics/202206091146113.png" alt="git-2"></p><p><strong>git使用过程：</strong></p><p><img src="https://img.chensir.ink/chensir-pics/202206091146669.png" alt="git-3"></p><h2 id="版本管理模式的区别"><a href="#版本管理模式的区别" class="headerlink" title="版本管理模式的区别"></a>版本管理模式的区别</h2><ul><li>git是一个分布式的版本管理系统</li><li>svn远程集中式的管理系统</li></ul><p><img src="https://img.chensir.ink/chensir-pics/202206091147967.jpg" alt="git-4"></p><h1 id="核心命令的使用"><a href="#核心命令的使用" class="headerlink" title="核心命令的使用"></a>核心命令的使用</h1><h2 id="安装git客户端"><a href="#安装git客户端" class="headerlink" title="安装git客户端"></a>安装git客户端</h2><p>官方客户端： httpsd:&#x2F;&#x2F;git-scm.com&#x2F;downloads</p><p>其它客户端：<a href="https://tortoisegit.org/download/">https://tortoisegit.org/download/</a></p><h2 id="git的基本使用"><a href="#git的基本使用" class="headerlink" title="git的基本使用"></a>git的基本使用</h2><h3 id="git项目创建与克隆"><a href="#git项目创建与克隆" class="headerlink" title="git项目创建与克隆"></a>git项目创建与克隆</h3><ul><li>基于远程仓库克隆至本地</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git clone &lt;remote url&gt;</span><br></pre></td></tr></table></figure><ul><li>当前目录初始化为git本地仓库</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git init &lt;directory&gt;</span><br></pre></td></tr></table></figure><ul><li>基于maven模板创建仓库</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">mvn archetype:generate</span><br></pre></td></tr></table></figure><h3 id="文件提交与推送"><a href="#文件提交与推送" class="headerlink" title="文件提交与推送"></a>文件提交与推送</h3><ul><li>添加指定文件到暂存区</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git add &lt;fileName&gt;</span><br></pre></td></tr></table></figure><ul><li>添加指定目录到暂存区</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git add &lt;direactory&gt;</span><br></pre></td></tr></table></figure><ul><li>添加所有到暂存区</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git add -A</span><br></pre></td></tr></table></figure><ul><li>指定目录或文件移除暂存区</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 指定目录</span><br><span class="line">git rm --cached &lt;direactory&gt; -r</span><br><span class="line"># 指定文件</span><br><span class="line">git rm --cached &lt;fileName&gt;</span><br></pre></td></tr></table></figure><ul><li><p>添加忽略配置文件 .gitignore</p></li><li><p>提交至本地仓库</p></li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git commit &lt;fileName&gt; -m &quot;提交内容&quot;</span><br></pre></td></tr></table></figure><ul><li>提交所有至本地仓库</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git commit -am &quot;提交内容&quot;</span><br></pre></td></tr></table></figure><ul><li>推送</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git push &lt;远程主机名&gt; &lt;本地分支名&gt;:&lt;远程分支名&gt;</span><br></pre></td></tr></table></figure><h2 id="分支管理"><a href="#分支管理" class="headerlink" title="分支管理"></a>分支管理</h2><ul><li>查看当前分支</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git branch [-avv]</span><br></pre></td></tr></table></figure><ul><li>基于当前分支新建分支</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git branch &lt;branch name&gt;</span><br></pre></td></tr></table></figure><ul><li>基于提交新建分支</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git branch &lt;branch name&gt; &lt;commit id&gt;</span><br></pre></td></tr></table></figure><ul><li>切换分支</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git checkout &lt;branch name&gt;</span><br></pre></td></tr></table></figure><ul><li>合并分支</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git merge &lt;merge target&gt;</span><br></pre></td></tr></table></figure><ul><li>删除分支</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git branch -d &#123;dev&#125;</span><br></pre></td></tr></table></figure><ul><li>解决冲突：如果引冲突导致自动合并失败。此时status为mergeing 状态，需手动修改后重新提交(commit)</li></ul><h2 id="远程仓库管理"><a href="#远程仓库管理" class="headerlink" title="远程仓库管理"></a>远程仓库管理</h2><ul><li>查看远程配置</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git remote [-v]</span><br></pre></td></tr></table></figure><ul><li>添加远程地址</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git remote add origin http://xxx.xxx</span><br></pre></td></tr></table></figure><ul><li>删除远程地址</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git remote remove origin </span><br></pre></td></tr></table></figure><ul><li>上传新分支至远程</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git push --set-upstream origin master </span><br></pre></td></tr></table></figure><ul><li>将本地分支与远程建立关联</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git branch --track --set-upstream-to=origin/test test</span><br></pre></td></tr></table></figure><h2 id="Tag管理"><a href="#Tag管理" class="headerlink" title="Tag管理"></a>Tag管理</h2><ul><li>查看当前Tag</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git tag</span><br></pre></td></tr></table></figure><ul><li>创建分支</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git tag &lt;tag name&gt; &lt;branch name&gt;</span><br></pre></td></tr></table></figure><ul><li>删除分支</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git tag -d &lt;tag name&gt;</span><br></pre></td></tr></table></figure><h2 id="日志管理"><a href="#日志管理" class="headerlink" title="日志管理"></a>日志管理</h2><ul><li>查看所有提交的日志</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git log</span><br></pre></td></tr></table></figure><ul><li>查看当前分支下提交的日志</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git log &lt;branch name&gt;</span><br></pre></td></tr></table></figure><ul><li>单行显示日志</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git log --oneline</span><br></pre></td></tr></table></figure><ul><li>比较两个版本的区别</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git log master..experiment</span><br></pre></td></tr></table></figure><ul><li>以图表的方式显示提交合并网格</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git log --pretty=format:&#x27;%h %s&#x27; --graph</span><br></pre></td></tr></table></figure><ul><li>查看详细修改</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git show &lt;branch name&gt;</span><br></pre></td></tr></table></figure><h1 id="Git底层原理"><a href="#Git底层原理" class="headerlink" title="Git底层原理"></a>Git底层原理</h1><h2 id="Git存储对象"><a href="#Git存储对象" class="headerlink" title="Git存储对象"></a>Git存储对象</h2><p>Git是一个内容寻址文件系统，其核心是一个简单的键值对数据库，可以向数据库中插入任意内容，它会返回一个用于取回该值的hash键。</p><p>基于键获取指定内容：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">git cat-file -p  79362d07c</span><br></pre></td></tr></table></figure><p>Git基于该功能把每个文件的版本中内容都保存在数据库中，当要进行回滚的时候就通过其中一个键将内容取回来并替换。</p><p>所以我们平常使用的 git add 其实就是把修改后的内容插入到键值库中。当我们执行 git add <fileName> 等同于执行了 git hash-object -w <fileName> 把文件写到数据中。</p><h2 id="Git树对象"><a href="#Git树对象" class="headerlink" title="Git树对象"></a>Git树对象</h2><p>Git存储对象解决了存储的问题，但只是能存储内容并没有存储文件名，如果进行回滚，怎么知道那个内容对应哪个文件呢？树对象解决了文件名存储的问题。</p><p>树对象的目的是将多个文件名组织在一起，其内容包含多个文件名称与其对应的Key和其他树对象的引用，可以理解成操作系统当中的文件夹，一个文件夹包含多个文件和多个其他文件夹。</p><p><img src="https://img.chensir.ink/chensir-pics/202206091147675.png" alt="git-5"></p><p>每一个分支当中都关联了一个树对象，它存储了当前分支下所有的文件名及对应的Key。通过以下命令可以查看</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 查看分支树</span><br><span class="line">git cat-file -p master^&#123;tree&#125;</span><br></pre></td></tr></table></figure><h2 id="Git提交对象"><a href="#Git提交对象" class="headerlink" title="Git提交对象"></a>Git提交对象</h2><p>一次提交即为当前版本的一个快照，该快照就是通过提交对象进行存储的，其存储内容为：一个顶级树对象、上一次提交的对象哈希、提交者用户名及邮箱、提交时间戳、提交评论。</p><p>通过存储对象、树对象、提交对象可以推测出修改一个文件到提交的过程总共生成了三个对象：</p><ul><li>一个内容对象：存储文件内容</li><li>一个树对象：存储文件名及内容对象的Key</li><li>一个提交对象：存储了树对象的Key及提交评论</li></ul><h2 id="Git引用"><a href="#Git引用" class="headerlink" title="Git引用"></a>Git引用</h2><p>当执行 git branch <branchName> 时创建了一个分支，其本质就是在git基于指定提交创建了一个引用文件，保存在 .git&#x2F;refs&#x2F;heads&#x2F; 目录下。</p><p>git总共有三种类型的引用：</p><ul><li>分支引用</li><li>远程分支引用</li><li>标签引用</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 查询比较两个版本</span><br><span class="line">git log master..experiment</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 版本提交历史网格</span><br><span class="line">git log --pretty=format:&#x27;%h %s&#x27; --graph</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 查看分支树</span><br><span class="line">git cat-file -p master^&#123;tree&#125;</span><br></pre></td></tr></table></figure><h1 id="Git支持的四种通信协议"><a href="#Git支持的四种通信协议" class="headerlink" title="Git支持的四种通信协议"></a>Git支持的四种通信协议</h1><h2 id="Local（本地协议）"><a href="#Local（本地协议）" class="headerlink" title="Local（本地协议）"></a>Local（本地协议）</h2><p>基于本地文件系统或共享（NFS）文件系统进行访问</p><p>**优点：**简单，直接使用现有的文件权限和网络权限，小团队小项目建立一个这样的版本管理系统是非常轻松的一件事。</p><p>**缺点：**这种协议缺陷就是本身共享文件系统的局限，只能在局域网，而且速度慢</p><p>**适应场景：**小团队，小项目临时搭建版本服务</p><p><strong>本地协议使用方式：</strong></p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 从本地 d/git/atals 目录克隆项目</span><br><span class="line">git clone d/git/atals/</span><br><span class="line"></span><br><span class="line"># 即使是 brae 仓库也可以正常下载</span><br><span class="line">git clone d/git/atals.git</span><br><span class="line"></span><br><span class="line"># 基于 file 协议克隆本地项目</span><br><span class="line">git clone file:///d/git/atals/</span><br></pre></td></tr></table></figure><p>如果URL开头明确指定file:&#x2F;&#x2F;，那么Git的行为会略有不同。如果仅是指定路径，Git会尝试使用硬链接（hard link）或直接复制所需要的文件、如果指定file:&#x2F;&#x2F;，Git会触发平时用于网路传输资料的进程，传输过来的是打包好的文件，更节约硬盘空间。</p><h2 id="ssh协议"><a href="#ssh协议" class="headerlink" title="ssh协议"></a>ssh协议</h2><p>Git支持利用ssh协议进行通信，这是绝大部分Linux、Uninx系统都支持的，所以利用该协议架设Git版本服务是非常方便的</p><p>**优点：**首先ssh架设相对简单，其次通过ssh访问是安全的、另外ssh协议很高效，在传输前也会尽量压缩数据。</p><p>**缺点：**权限体系下不灵活，必须提供操作系统的账户密码，哪怕是只需要读取版本。</p><p>**适应场景：**小团队、小项目、临时项目</p><h2 id="http协议（dumb、smart）"><a href="#http协议（dumb、smart）" class="headerlink" title="http协议（dumb、smart）"></a>http协议（dumb、smart）</h2><p>Git http协议实现是依赖web容器（apache、nginx）及cgi组件进行通信交互，并利用web容器本身权限体系进行授权验证。在Git1.6.6前只支持http dumb（哑）协议，该协议只能下载不能提交，通常会配合ssh协议一起使用，ssh分配提交账号，http dumb提供只读账号。1.6.6之后Git提供了git-http-backend的CGI用于实现远程推送等功能。</p><p>**优点：**解决了local与ssh权限验证单一的问题、可基于http url提供匿名服务，从而可以放到公网上去。而local与ssh是很难做到这一点，必须实现一个类似github这样的网站。</p><p>**缺点：**架设复杂一些需要部署web服务器和HTTPS证书之类的配置</p><p>**场景：**大型团队、需要对权限精准控制。需要把服务部署到公网上去</p><p>**注：**http smart协议是基于CGI配个Git git-http-backend脚本进行使用，配置较复杂，现在一般不会这么去做，而是采用Gitlab、gogs之类的文本管理进行替代。</p><h2 id="Git协议"><a href="#Git协议" class="headerlink" title="Git协议"></a>Git协议</h2><p>Git协议是包含在Git里的一个特殊的守护进程；它监听在一个特定的端口（9418），类似于ssh服务，但是访问无需任何授权。</p><p>**优点：**目前Git协议是Git使用的网络传输协议里最快的。如果你的项目有很大的访问量，或者你的项目很庞大并且不需要为写进行用户授权，架设Git守护进程来提供服务是不错的选择。它使用与ssh相同的数据传输机制，但是省去了加密和授权的开销。</p><p>**缺点：**Git协议缺点是缺乏授权机制。而且9418是一个非标准端口，一般防火墙不会开放。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;Git 是一个开源的分布式版本控制系统，用于敏捷高效地处理任何或小或大的项目。&lt;/p&gt;
&lt;p&gt;Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。&lt;/p&gt;
&lt;p&gt;Git</summary>
        
      
    
    
    
    <category term="Git" scheme="https://chensir.ink/categories/Git/"/>
    
    
    <category term="Git" scheme="https://chensir.ink/tags/Git/"/>
    
  </entry>
  
  <entry>
    <title>Centos7 静默安装Oracle11gR2</title>
    <link href="https://chensir.ink/2021/06/27/Centos7%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85Oracle11gR2/"/>
    <id>https://chensir.ink/2021/06/27/Centos7%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85Oracle11gR2/</id>
    <published>2021-06-27T02:34:36.000Z</published>
    <updated>2025-11-26T14:04:32.768Z</updated>
    
    <content type="html"><![CDATA[<h1 id="安装Oracle11gR2准备"><a href="#安装Oracle11gR2准备" class="headerlink" title="安装Oracle11gR2准备"></a>安装Oracle11gR2准备</h1><h2 id="安装所需依赖："><a href="#安装所需依赖：" class="headerlink" title="安装所需依赖："></a>安装所需依赖：</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">yum -y install gcc gcc-c++ make binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel elfutils-libelf-devel-static glibc glibc-common glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel numactl-devel sysstat unixODBC unixODBC-devel kernelheaders pdksh pcre-devel readline rlwrap perl autoconf unzip</span><br></pre></td></tr></table></figure><h2 id="下载所需安装包"><a href="#下载所需安装包" class="headerlink" title="下载所需安装包"></a>下载所需安装包</h2><ul><li><p>linux.x64_11gR2_database_1of2.zip</p></li><li><p>linux.x64_11gR2_database_2of2.zip</p></li><li><p>rlwrap-0.42-1.el6.x86_64.rpm</p><p>以上安装包提供百度网盘下载：<br>链接: <a href="https://pan.baidu.com/s/1hLFKqSESKMakB2tJZmM0vA">https://pan.baidu.com/s/1hLFKqSESKMakB2tJZmM0vA</a>  密码: 39tk</p></li></ul><h2 id="安装rlwrap插件"><a href="#安装rlwrap插件" class="headerlink" title="安装rlwrap插件"></a>安装rlwrap插件</h2><p>rlwrap插件：实现上下键调用以前输入过的命令。</p><p>将rlwrap-0.42-1.el6.x86_64.rpm上传至服务器并在所在目录执行</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">rpm -ivh rlwrap-0.42-1.el6.x86_64.rpm</span><br></pre></td></tr></table></figure><h1 id="创建用户组-及用户"><a href="#创建用户组-及用户" class="headerlink" title="创建用户组 及用户"></a>创建用户组 及用户</h1><ul><li>创建用户组： <code> groupadd oinstall</code> </li><li>创建用户组：<code> groupadd dba</code> </li><li>创建用户并添加到用户组：<code>useradd -g oinstall -G dba oracle</code> </li><li>设置Oracle用户密码：<code>passwd oracle</code></li></ul><h1 id="创建安装目录并分配权限"><a href="#创建安装目录并分配权限" class="headerlink" title="创建安装目录并分配权限"></a>创建安装目录并分配权限</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">mkdir -p /data/u01/app/oracle/product/11.2.0/dbhome_1</span><br><span class="line">mkdir /data/u01/app/oracle/&#123;oradata,inventory,fast_recovery_area&#125;</span><br><span class="line">chown -R oracle:oinstall /data/u01/app/oracle</span><br><span class="line">chmod -R 775 /data/u01/app/oracle</span><br></pre></td></tr></table></figure><h1 id="上传安装包并解压"><a href="#上传安装包并解压" class="headerlink" title="上传安装包并解压"></a>上传安装包并解压</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 创建存放安装包的目录</span><br><span class="line">mkdir -p /data/u01/software</span><br><span class="line"># 将安装包上传至该目录下 上传方法略</span><br><span class="line"># 执行解压命令</span><br><span class="line">cd /data/u01/software</span><br><span class="line">unzip linux.x64_11gR2_database_1of2.zip</span><br><span class="line">unzip linux.x64_11gR2_database_2of2.zip</span><br></pre></td></tr></table></figure><h1 id="修改相关配置文件"><a href="#修改相关配置文件" class="headerlink" title="修改相关配置文件"></a>修改相关配置文件</h1><h2 id="修改内核文件"><a href="#修改内核文件" class="headerlink" title="修改内核文件"></a>修改内核文件</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vim /etc/sysctl.conf</span><br></pre></td></tr></table></figure><p>修改内容如👇</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 找到合适的位置（就好比厨师教你做饭：盐少许）添加如下内容</span><br><span class="line">fs.aio-max-nr = 1048576</span><br><span class="line">fs.file-max = 6815744</span><br><span class="line">kernel.shmall = 2097152</span><br><span class="line">kernel.shmmax = 1073741824</span><br><span class="line">kernel.shmmni = 4096</span><br><span class="line">kernel.sem = 250 32000 100 128</span><br><span class="line">net.ipv4.ip_local_port_range = 9000 65500</span><br><span class="line">net.core.rmem_default = 262144</span><br><span class="line">net.core.rmem_max = 4194304</span><br><span class="line">net.core.wmem_default = 262144</span><br><span class="line">net.core.wmem_max = 1048576</span><br></pre></td></tr></table></figure><p><strong>修改后执行 <code> sysctl -p</code>  使配置文件生效</strong></p><h2 id="修改用户限制"><a href="#修改用户限制" class="headerlink" title="修改用户限制"></a>修改用户限制</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vim /etc/security/limits.conf</span><br></pre></td></tr></table></figure><p>修改内容如👇</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">oracle soft nproc 2047</span><br><span class="line">oracle hard nproc 16384</span><br><span class="line">oracle soft nofile 1024</span><br><span class="line">oracle hard nofile 65536</span><br><span class="line">oracle soft stack 10240</span><br></pre></td></tr></table></figure><h2 id="修改-etc-pam-d-login-文件"><a href="#修改-etc-pam-d-login-文件" class="headerlink" title="修改&#x2F;etc&#x2F;pam.d&#x2F;login 文件"></a>修改&#x2F;etc&#x2F;pam.d&#x2F;login 文件</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vim /etc/pam.d/login</span><br></pre></td></tr></table></figure><p>修改内容如👇</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">session required /lib64/security/pam_limits.so</span><br><span class="line">session required pam_limits.so</span><br></pre></td></tr></table></figure><h2 id="修改-etc-profile-文件"><a href="#修改-etc-profile-文件" class="headerlink" title="修改&#x2F;etc&#x2F;profile 文件"></a>修改&#x2F;etc&#x2F;profile 文件</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vim /etc/profile</span><br></pre></td></tr></table></figure><p>修改内容如👇</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 找到合适的位置（｝后或者IF前 或者#语句的上下；）</span><br><span class="line">if [ $USER = &quot;oracle&quot; ]; then</span><br><span class="line">if [ $SHELL = &quot;/bin/ksh&quot; ]; then</span><br><span class="line">ulimit -p 16384</span><br><span class="line">ulimit -n 65536</span><br><span class="line">else</span><br><span class="line">ulimit -u 16384 -n 65536</span><br><span class="line">fi</span><br><span class="line">fi</span><br></pre></td></tr></table></figure><p>使修改生效：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">source /etc/profile</span><br></pre></td></tr></table></figure><h2 id="设置oracle-用户环境变量"><a href="#设置oracle-用户环境变量" class="headerlink" title="设置oracle 用户环境变量"></a>设置oracle 用户环境变量</h2><h3 id="切换到oracle用户"><a href="#切换到oracle用户" class="headerlink" title="切换到oracle用户"></a>切换到oracle用户</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">su - oracle</span><br></pre></td></tr></table></figure><p>编辑 .bash_profile文件</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vim .bash_profile</span><br></pre></td></tr></table></figure><p>增加内容如👇</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">export ORACLE_BASE=/data/u01/app/oracle</span><br><span class="line">export ORACLE_HOME=/data/u01/app/oracle/product/11.2.0/dbhome_1</span><br><span class="line">export ORACLE_SID=orcl</span><br><span class="line">export ORACLE_UNQNAME=$ORACLE_SID</span><br><span class="line">export PATH=$ORACLE_HOME/bin:$PATH</span><br><span class="line">export NLS_LANG=american_america.AL32UTF8</span><br><span class="line">alias sqlplus=&#x27;rlwrap sqlplus&#x27;</span><br><span class="line">alias rman=&#x27;rlwrap rman&#x27;</span><br></pre></td></tr></table></figure><p>使修改生效</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">source .bash_profile</span><br></pre></td></tr></table></figure><h2 id="修改静默安装响应文件"><a href="#修改静默安装响应文件" class="headerlink" title="修改静默安装响应文件"></a>修改静默安装响应文件</h2><ul><li>拷贝备份一份响应文件至当前用户目录：<code>cp -R /data/u01/software/database/response/ ~</code></li><li>编辑db_install.rsp :<code>vim ~/response/db_install.rsp</code></li></ul><p>修改内容可参考👇</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment">####################################################################</span></span><br><span class="line"><span class="comment">## Copyright(c) Oracle Corporation 1998,2008. All rights reserved.##</span></span><br><span class="line"><span class="comment">##                                                                ##</span></span><br><span class="line"><span class="comment">## Specify values for the variables listed below to customize     ##</span></span><br><span class="line"><span class="comment">## your installation.                                             ##</span></span><br><span class="line"><span class="comment">##                                                                ##</span></span><br><span class="line"><span class="comment">## Each variable is associated with a comment. The comment        ##</span></span><br><span class="line"><span class="comment">## can help to populate the variables with the appropriate        ##</span></span><br><span class="line"><span class="comment">## values.                            ##</span></span><br><span class="line"><span class="comment">##                                                                ##</span></span><br><span class="line"><span class="comment">## IMPORTANT NOTE: This file contains plain text passwords and    ##</span></span><br><span class="line"><span class="comment">## should be secured to have read permission only by oracle user  ##</span></span><br><span class="line"><span class="comment">## or db administrator who owns this installation.                ##</span></span><br><span class="line"><span class="comment">##                                                                ##</span></span><br><span class="line"><span class="comment">####################################################################</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Do not change the following system generated value. </span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 标注响应文件版本，这个版本必须和要安装的数据库版本相同，安装检验无法通过，不能更改</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the installation option.</span></span><br><span class="line"><span class="comment"># It can be one of the following:</span></span><br><span class="line"><span class="comment"># 1. INSTALL_DB_SWONLY</span></span><br><span class="line"><span class="comment"># 2. INSTALL_DB_AND_CONFIG</span></span><br><span class="line"><span class="comment"># 3. UPGRADE_DB</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 选择安装类型</span></span><br><span class="line"><span class="comment"># 1. INSTALL_DB_SWONLY        只装数据库软件</span></span><br><span class="line"><span class="comment"># 2. INSTALL_DB_AND_CONFIG    安装数据库软件并建库</span></span><br><span class="line"><span class="comment"># 3. UPGRADE_DB               升级数据库</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.option=INSTALL_DB_SWONLY</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the hostname of the system as set during the install. It can be used</span></span><br><span class="line"><span class="comment"># to force the installation to use an alternative hostname rather than using the</span></span><br><span class="line"><span class="comment"># first hostname found on the system. (e.g., for systems with multiple hostnames </span></span><br><span class="line"><span class="comment"># and network interfaces)</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定操作系统主机名，通过 hostname 命令获得</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">ORACLE_HOSTNAME=oracle</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the Unix group to be set for the inventory directory.  </span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定oracle inventory目录的所有者，通常会是 oinstall 或者 dba</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">UNIX_GROUP_NAME=oinstall</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the location which holds the inventory files.</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定产品清单 oracle inventory 目录的路径</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">INVENTORY_LOCATION=/data/u01/app/oracle/inventory</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the languages in which the components will be installed.             </span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># en   : English                  ja   : Japanese                  </span></span><br><span class="line"><span class="comment"># fr   : French                   ko   : Korean                    </span></span><br><span class="line"><span class="comment"># ar   : Arabic                   es   : Latin American Spanish    </span></span><br><span class="line"><span class="comment"># bn   : Bengali                  lv   : Latvian                   </span></span><br><span class="line"><span class="comment"># pt_BR: Brazilian Portuguese     lt   : Lithuanian                </span></span><br><span class="line"><span class="comment"># bg   : Bulgarian                ms   : Malay                     </span></span><br><span class="line"><span class="comment"># fr_CA: Canadian French          es_MX: Mexican Spanish           </span></span><br><span class="line"><span class="comment"># ca   : Catalan                  no   : Norwegian                 </span></span><br><span class="line"><span class="comment"># hr   : Croatian                 pl   : Polish                    </span></span><br><span class="line"><span class="comment"># cs   : Czech                    pt   : Portuguese                </span></span><br><span class="line"><span class="comment"># da   : Danish                   ro   : Romanian                  </span></span><br><span class="line"><span class="comment"># nl   : Dutch                    ru   : Russian                   </span></span><br><span class="line"><span class="comment"># ar_EG: Egyptian                 zh_CN: Simplified Chinese        </span></span><br><span class="line"><span class="comment"># en_GB: English (Great Britain)  sk   : Slovak                    </span></span><br><span class="line"><span class="comment"># et   : Estonian                 sl   : Slovenian                 </span></span><br><span class="line"><span class="comment"># fi   : Finnish                  es_ES: Spanish                   </span></span><br><span class="line"><span class="comment"># de   : German                   sv   : Swedish                   </span></span><br><span class="line"><span class="comment"># el   : Greek                    th   : Thai                      </span></span><br><span class="line"><span class="comment"># iw   : Hebrew                   zh_TW: Traditional Chinese       </span></span><br><span class="line"><span class="comment"># hu   : Hungarian                tr   : Turkish                   </span></span><br><span class="line"><span class="comment"># is   : Icelandic                uk   : Ukrainian                 </span></span><br><span class="line"><span class="comment"># in   : Indonesian               vi   : Vietnamese                </span></span><br><span class="line"><span class="comment"># it   : Italian                                                   </span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Example : SELECTED_LANGUAGES=en,fr,ja</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定数据库语言，可以选择多个 , 用逗号隔开。选择en, zh_CN（英文和简体中文）</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">SELECTED_LANGUAGES=en,zh_CN</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the complete path of the Oracle Home.</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置 ORALCE_HOME 的路径</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">ORACLE_HOME=/data/u01/app/oracle/product/11.2.0/dbhome_1</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the complete path of the Oracle Base. </span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置 ORALCE_BASE 的路径</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">ORACLE_BASE=/data/u01/app/oracle</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the installation edition of the component.                        </span></span><br><span class="line"><span class="comment">#                                                             </span></span><br><span class="line"><span class="comment"># The value should contain only one of these choices.        </span></span><br><span class="line"><span class="comment"># EE     : Enterprise Edition                                </span></span><br><span class="line"><span class="comment"># SE     : Standard Edition                                  </span></span><br><span class="line"><span class="comment"># SEONE  : Standard Edition One</span></span><br><span class="line"><span class="comment"># PE     : Personal Edition (WINDOWS ONLY)</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 选择Oracle安装数据库软件的版本（企业版，标准版，标准版1），不同的版本功能不同</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.InstallEdition=EE</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># This variable is used to enable or disable custom install.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># true  : Components mentioned as part of &#x27;customComponents&#x27; property</span></span><br><span class="line"><span class="comment">#         are considered for install.</span></span><br><span class="line"><span class="comment"># false : Value for &#x27;customComponents&#x27; is not considered.</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 是否自定义Oracle的组件，如果选择false，则会使用默认的组件，如果选择true否则需要自己在下面一条参数将要安装的组件一一列出。</span></span><br><span class="line"><span class="comment"># 安装相应版权后会安装所有的组件，后期如果缺乏某个组件，再次安装会非常的麻烦。</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.isCustomInstall=<span class="literal">false</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># This variable is considered only if &#x27;IsCustomInstall&#x27; is set to true. </span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Description: List of Enterprise Edition Options you would like to install.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment">#              The following choices are available. You may specify any</span></span><br><span class="line"><span class="comment">#              combination of these choices.  The components you choose should</span></span><br><span class="line"><span class="comment">#              be specified in the form &quot;internal-component-name:version&quot;</span></span><br><span class="line"><span class="comment">#              Below is a list of components you may specify to install.</span></span><br><span class="line"><span class="comment">#        </span></span><br><span class="line"><span class="comment">#              oracle.rdbms.partitioning:11.2.0.1.0 - Oracle Partitioning</span></span><br><span class="line"><span class="comment">#              oracle.rdbms.dm:11.2.0.1.0 - Oracle Data Mining</span></span><br><span class="line"><span class="comment">#              oracle.rdbms.dv:11.2.0.1.0 - Oracle Database Vault </span></span><br><span class="line"><span class="comment">#              oracle.rdbms.lbac:11.2.0.1.0 - Oracle Label Security</span></span><br><span class="line"><span class="comment">#              oracle.rdbms.rat:11.2.0.1.0 - Oracle Real Application Testing </span></span><br><span class="line"><span class="comment">#              oracle.oraolap:11.2.0.1.0 - Oracle OLAP</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 手工选择需要安装组件</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.customComponents=oracle.server:11.2.0.1.0,oracle.sysman.ccr:10.2.7.0.0,oracle.xdk:11.2.0.1.0,oracle.rdbms.oci:11.2.0.1.0,oracle.network:11.2.0.1.0,oracle.network.listener:11.2.0.1.0,oracle.rdbms:11.2.0.1.0,oracle.options:11.2.0.1.0,oracle.rdbms.partitioning:11.2.0.1.0,oracle.oraolap:11.2.0.1.0,oracle.rdbms.dm:11.2.0.1.0,oracle.rdbms.dv:11.2.0.1.0,orcle.rdbms.lbac:11.2.0.1.0,oracle.rdbms.rat:11.2.0.1.0</span><br><span class="line"></span><br><span class="line"><span class="comment">###############################################################################</span></span><br><span class="line"><span class="comment">#                                                                             #</span></span><br><span class="line"><span class="comment"># PRIVILEGED OPERATING SYSTEM GROUPS                                          #</span></span><br><span class="line"><span class="comment"># ------------------------------------------                                  #</span></span><br><span class="line"><span class="comment"># Provide values for the OS groups to which OSDBA and OSOPER privileges       #</span></span><br><span class="line"><span class="comment"># needs to be granted. If the install is being performed as a member of the   #     </span></span><br><span class="line"><span class="comment"># group &quot;dba&quot;, then that will be used unless specified otherwise below.       #</span></span><br><span class="line"><span class="comment">#                                                                             #</span></span><br><span class="line"><span class="comment">###############################################################################</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># The DBA_GROUP is the OS group which is to be granted OSDBA privileges.</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定拥有 OSDBA、OSOPER 权限的用户组，通常会是 dba 组</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.DBA_GROUP=dba</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># The OPER_GROUP is the OS group which is to be granted OSOPER privileges.</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line">oracle.install.db.OPER_GROUP=dba</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the cluster node names selected during the installation.</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 如果是RAC的安装，在这里指定所有的节点</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.CLUSTER_NODES=</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the type of database to create.</span></span><br><span class="line"><span class="comment"># It can be one of the following:</span></span><br><span class="line"><span class="comment"># - GENERAL_PURPOSE/TRANSACTION_PROCESSING          </span></span><br><span class="line"><span class="comment"># - DATA_WAREHOUSE                                </span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 选择数据库的用途，一般用途/事物处理，数据仓库</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.type=GENERAL_PURPOSE</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the Starter Database Global Database Name. </span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定GlobalName</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.globalDBName=orcl</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the Starter Database SID.</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定SID,和 ORACLE_SID 一致</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.SID=orcl</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the Starter Database character set.</span></span><br><span class="line"><span class="comment">#                                              </span></span><br><span class="line"><span class="comment"># It can be one of the following:</span></span><br><span class="line"><span class="comment"># AL32UTF8, WE8ISO8859P15, WE8MSWIN1252, EE8ISO8859P2,</span></span><br><span class="line"><span class="comment"># EE8MSWIN1250, NE8ISO8859P10, NEE8ISO8859P4, BLT8MSWIN1257,</span></span><br><span class="line"><span class="comment"># BLT8ISO8859P13, CL8ISO8859P5, CL8MSWIN1251, AR8ISO8859P6,</span></span><br><span class="line"><span class="comment"># AR8MSWIN1256, EL8ISO8859P7, EL8MSWIN1253, IW8ISO8859P8,</span></span><br><span class="line"><span class="comment"># IW8MSWIN1255, JA16EUC, JA16EUCTILDE, JA16SJIS, JA16SJISTILDE,</span></span><br><span class="line"><span class="comment"># KO16MSWIN949, ZHS16GBK, TH8TISASCII, ZHT32EUC, ZHT16MSWIN950,</span></span><br><span class="line"><span class="comment"># ZHT16HKSCS, WE8ISO8859P9, TR8MSWIN1254, VN8MSWIN1258</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 选择字符集。不正确的字符集会给数据显示和存储带来麻烦无数。</span></span><br><span class="line"><span class="comment"># 通常中文选择的有 ZHS16GBK 简体中文库，建议选择 unicode 的 AL32UTF8 国际字符集</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.characterSet=AL32UTF8</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># This variable should be set to true if Automatic Memory Management </span></span><br><span class="line"><span class="comment"># in Database is desired.</span></span><br><span class="line"><span class="comment"># If Automatic Memory Management is not desired, and memory allocation</span></span><br><span class="line"><span class="comment"># is to be done manually, then set it to false.</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 11g的新特性自动内存管理，也就是 SGA_TARGET 和 PAG_AGGREGATE_TARGET 都不用设置了，Oracle会自动调配两部分大小。</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.memoryOption=<span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the total memory allocation for the database. Value(in MB) should be</span></span><br><span class="line"><span class="comment"># at least 256 MB, and should not exceed the total physical memory available </span></span><br><span class="line"><span class="comment"># on the system.</span></span><br><span class="line"><span class="comment"># Example: oracle.install.db.config.starterdb.memoryLimit=512</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定Oracle自动管理内存的大小，最小是256MB</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.memoryLimit=1024</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># This variable controls whether to load Example Schemas onto the starter</span></span><br><span class="line"><span class="comment"># database or not.</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 是否载入模板示例</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.installExampleSchemas=<span class="literal">false</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># This variable includes enabling audit settings, configuring password profiles</span></span><br><span class="line"><span class="comment"># and revoking some grants to public. These settings are provided by default. </span></span><br><span class="line"><span class="comment"># These settings may also be disabled.    </span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 是否启用安全设置</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.enableSecuritySettings=<span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment">###############################################################################</span></span><br><span class="line"><span class="comment">#                                                                             #</span></span><br><span class="line"><span class="comment"># Passwords can be supplied for the following four schemas in the         #</span></span><br><span class="line"><span class="comment"># starter database:                                   #</span></span><br><span class="line"><span class="comment">#   SYS                                                                       #</span></span><br><span class="line"><span class="comment">#   SYSTEM                                                                    #</span></span><br><span class="line"><span class="comment">#   SYSMAN (used by Enterprise Manager)                                       #</span></span><br><span class="line"><span class="comment">#   DBSNMP (used by Enterprise Manager)                                       #</span></span><br><span class="line"><span class="comment">#                                                                             #</span></span><br><span class="line"><span class="comment"># Same password can be used for all accounts (not recommended)            #</span></span><br><span class="line"><span class="comment"># or different passwords for each account can be provided (recommended)       #</span></span><br><span class="line"><span class="comment">#                                                                             #</span></span><br><span class="line"><span class="comment">###############################################################################</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># This variable holds the password that is to be used for all schemas in the</span></span><br><span class="line"><span class="comment"># starter database.</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置数据库用户密码，设定所有数据库用户使用同一个密码，其它数据库用户就不用单独设置了。</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.password.ALL=</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the SYS password for the starter database.</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line">oracle.install.db.config.starterdb.password.SYS=</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the SYSTEM password for the starter database.</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line">oracle.install.db.config.starterdb.password.SYSTEM=</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the SYSMAN password for the starter database.</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line">oracle.install.db.config.starterdb.password.SYSMAN=</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the DBSNMP password for the starter database.</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line">oracle.install.db.config.starterdb.password.DBSNMP=</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the management option to be selected for the starter database. </span></span><br><span class="line"><span class="comment"># It can be one of the following:</span></span><br><span class="line"><span class="comment"># 1. GRID_CONTROL</span></span><br><span class="line"><span class="comment"># 2. DB_CONTROL</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 数据库本地管理工具 DB_CONTROL，远程集中管理工具 GRID_CONTROL</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.control=DB_CONTROL</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the Management Service to use if Grid Control is selected to manage </span></span><br><span class="line"><span class="comment"># the database.      </span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># GRID_CONTROL 需要设定 grid control 的远程路径 URL</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.gridcontrol.gridControlServiceURL=</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># This variable indicates whether to receive email notification for critical </span></span><br><span class="line"><span class="comment"># alerts when using DB control.   </span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 是否启用Email通知, 启用后会将告警等信息发送到指定邮箱</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.dbcontrol.enableEmailNotification=<span class="literal">false</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the email address to which the notifications are to be sent.</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置通知EMAIL地址</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.dbcontrol.emailAddress=</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the SMTP server used for email notifications.</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置EMAIL邮件服务器</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.dbcontrol.SMTPServer=</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">###############################################################################</span></span><br><span class="line"><span class="comment">#                                                                             #</span></span><br><span class="line"><span class="comment"># SPECIFY BACKUP AND RECOVERY OPTIONS                                         #</span></span><br><span class="line"><span class="comment"># ------------------------------------                                    #</span></span><br><span class="line"><span class="comment"># Out-of-box backup and recovery options for the database can be mentioned    #</span></span><br><span class="line"><span class="comment"># using the entries below.                            # </span></span><br><span class="line"><span class="comment">#                                                                             #</span></span><br><span class="line"><span class="comment">###############################################################################</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># This variable is to be set to false if automated backup is not required. Else </span></span><br><span class="line"><span class="comment"># this can be set to true.</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置自动备份，和OUI里的自动备份一样</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.automatedBackup.<span class="built_in">enable</span>=<span class="literal">false</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Regardless of the type of storage that is chosen for backup and recovery, if </span></span><br><span class="line"><span class="comment"># automated backups are enabled, a job will be scheduled to run daily at</span></span><br><span class="line"><span class="comment"># 2:00 AM to backup the database. This job will run as the operating system </span></span><br><span class="line"><span class="comment"># user that is specified in this variable.</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 自动备份会启动一个job，指定启动JOB的系统用户ID</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.automatedBackup.osuid=</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Regardless of the type of storage that is chosen for backup and recovery, if </span></span><br><span class="line"><span class="comment"># automated backups are enabled, a job will be scheduled to run daily at</span></span><br><span class="line"><span class="comment"># 2:00 AM to backup the database. This job will run as the operating system user</span></span><br><span class="line"><span class="comment"># specified by the above entry. The following entry stores the password for the</span></span><br><span class="line"><span class="comment"># above operating system user.</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 自动备份会开启一个job，需要指定OSUser的密码</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.automatedBackup.ospwd=</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the type of storage to use for the database.</span></span><br><span class="line"><span class="comment"># It can be one of the following:</span></span><br><span class="line"><span class="comment"># - FILE_SYSTEM_STORAGE</span></span><br><span class="line"><span class="comment"># - ASM_STORAGE</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 自动备份，要求指定使用的文件系统存放数据库文件还是ASM</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.storageType=</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the database file location which is a directory for datafiles, control</span></span><br><span class="line"><span class="comment"># files, redo logs.         </span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Applicable only when oracle.install.db.config.starterdb.storage=FILE_SYSTEM </span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用文件系统存放数据库文件才需要指定数据文件、控制文件、Redo log的存放目录</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the backup and recovery location.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Applicable only when oracle.install.db.config.starterdb.storage=FILE_SYSTEM </span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用文件系统存放数据库文件才需要指定备份恢复目录</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the existing ASM disk groups to be used for storage.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Applicable only when oracle.install.db.config.starterdb.storage=ASM</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用ASM存放数据库文件才需要指定存放的磁盘组</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.asm.diskGroup=</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the password for ASMSNMP user of the ASM instance.                  </span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Applicable only when oracle.install.db.config.starterdb.storage=ASM_SYSTEM </span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用ASM存放数据库文件才需要指定ASM实例密码</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">oracle.install.db.config.asm.ASMSNMPPassword=</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the My Oracle Support Account Username.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment">#  Example   : MYORACLESUPPORT_USERNAME=metalink</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定metalink账户用户名</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">MYORACLESUPPORT_USERNAME=</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the My Oracle Support Account Username password.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Example    : MYORACLESUPPORT_PASSWORD=password</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定metalink账户密码</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">MYORACLESUPPORT_PASSWORD=</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify whether to enable the user to set the password for</span></span><br><span class="line"><span class="comment"># My Oracle Support credentials. The value can be either true or false.</span></span><br><span class="line"><span class="comment"># If left blank it will be assumed to be false.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Example    : SECURITY_UPDATES_VIA_MYORACLESUPPORT=true</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 用户是否可以设置metalink密码</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">SECURITY_UPDATES_VIA_MYORACLESUPPORT=</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify whether user wants to give any proxy details for connection. </span></span><br><span class="line"><span class="comment"># The value can be either true or false. If left blank it will be assumed</span></span><br><span class="line"><span class="comment"># to be false.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Example    : DECLINE_SECURITY_UPDATES=false</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 表示不需要设置安全更新，Response File中必须指定为true，否则会提示错误</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">DECLINE_SECURITY_UPDATES=<span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the Proxy server name. Length should be greater than zero.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Example    : PROXY_HOST=proxy.domain.com </span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 代理服务器名</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">PROXY_HOST=</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the proxy port number. Should be Numeric and atleast 2 chars.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Example    : PROXY_PORT=25 </span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 代理服务器端口</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">PROXY_PORT=</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the proxy user name. Leave PROXY_USER and PROXY_PWD </span></span><br><span class="line"><span class="comment"># blank if your proxy server requires no authentication.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Example    : PROXY_USER=username </span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 代理服务器用户名</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">PROXY_USER=</span><br><span class="line"></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Specify the proxy password. Leave PROXY_USER and PROXY_PWD  </span></span><br><span class="line"><span class="comment"># blank if your proxy server requires no authentication.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Example    : PROXY_PWD=password </span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 代理服务器密码</span></span><br><span class="line"><span class="comment">#------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">PROXY_PWD=</span><br></pre></td></tr></table></figure><h1 id="安装oracle"><a href="#安装oracle" class="headerlink" title="安装oracle"></a>安装oracle</h1><ul><li><p>切换到解压的安装包目录：<code>cd /data/u01/software/database/</code></p></li><li><p>执行：<code>./runInstaller -silent -responseFile /home/oracle/response/db_install.rsp -ignorePrereq</code></p><p>稍作等待……</p><p><img src="https://img.chensir.ink/chensir-pics/202206091143555.png" alt="oracle2"></p></li></ul><p>出现以下提示信息，安装完成</p><figure class="highlight dart"><table><tr><td class="code"><pre><span class="line">To execute the configuration scripts:</span><br><span class="line">          <span class="number">1</span>. Open a terminal <span class="built_in">window</span> </span><br><span class="line">          <span class="number">2</span>. Log <span class="keyword">in</span> <span class="keyword">as</span> <span class="string">&quot;root&quot;</span> </span><br><span class="line">          <span class="number">3</span>. Run the scripts </span><br><span class="line">          <span class="number">4</span>. Return to <span class="keyword">this</span> <span class="built_in">window</span> and hit <span class="string">&quot;Enter&quot;</span> key to <span class="keyword">continue</span> </span><br><span class="line"></span><br><span class="line">Successfully Setup Software.</span><br></pre></td></tr></table></figure><ul><li><p>切换到root用户，执行</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">/data/u01/app/oracle/inventory/orainstRoot.sh</span><br><span class="line">/data/u01/app/oracle/product/11.2.0/dbhome_1/root.sh</span><br></pre></td></tr></table></figure></li></ul><h1 id="静默方式创建实例"><a href="#静默方式创建实例" class="headerlink" title="静默方式创建实例"></a>静默方式创建实例</h1><h2 id="修改配置文件"><a href="#修改配置文件" class="headerlink" title="修改配置文件"></a>修改配置文件</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vim /home/oracle/response/dbca.rsp</span><br></pre></td></tr></table></figure><p>修改内容可参考👇</p><figure class="highlight ruby"><table><tr><td class="code"><pre><span class="line"><span class="comment">##############################################################################</span></span><br><span class="line"><span class="comment">##                                                                          ##</span></span><br><span class="line"><span class="comment">##                            DBCA response file                            ##</span></span><br><span class="line"><span class="comment">##                            ------------------                            ##</span></span><br><span class="line"><span class="comment">## Copyright   1998, 2007, Oracle Corporation. All Rights Reserved.         ##</span></span><br><span class="line"><span class="comment">##                                                                          ##</span></span><br><span class="line"><span class="comment">## Specify values for the variables listed below to customize Oracle        ##</span></span><br><span class="line"><span class="comment">## Database Configuration installation.                                     ##</span></span><br><span class="line"><span class="comment">##                                                                          ##</span></span><br><span class="line"><span class="comment">## Each variable is associated with a comment. The comment identifies the   ##</span></span><br><span class="line"><span class="comment">## variable type.                                                           ##</span></span><br><span class="line"><span class="comment">##                                                                          ##</span></span><br><span class="line"><span class="comment">## Please specify the values in the following format :                      ##</span></span><br><span class="line"><span class="comment">##          Type       :  Example                                           ##</span></span><br><span class="line"><span class="comment">##          String     :  &quot;&lt;value&gt;&quot;                                         ##</span></span><br><span class="line"><span class="comment">##          Boolean    :  True or False                                     ##</span></span><br><span class="line"><span class="comment">##          Number     :  &lt;numeric value&gt;                                   ##</span></span><br><span class="line"><span class="comment">##          StringList :  &#123;&quot;&lt;value1&gt;&quot;,&quot;&lt;value2&gt;&quot;&#125;                           ##</span></span><br><span class="line"><span class="comment">##                                                                          ##</span></span><br><span class="line"><span class="comment">## Examples :                                                               ##</span></span><br><span class="line"><span class="comment">##     1. dbca -progress_only -responseFile &lt;response file&gt;                 ##</span></span><br><span class="line"><span class="comment">##        Display a progress bar depicting progress of database creation    ##</span></span><br><span class="line"><span class="comment">##        process.                                                          ##</span></span><br><span class="line"><span class="comment">##                                                                          ##</span></span><br><span class="line"><span class="comment">##     2. dbca -silent -responseFile &lt;response file&gt;                        ##</span></span><br><span class="line"><span class="comment">##        Creates database silently. No user interface is displayed.        ##</span></span><br><span class="line"><span class="comment">##                                                                          ##</span></span><br><span class="line"><span class="comment">##     3. dbca -silent -createDatabase -cloneTemplate                       ##</span></span><br><span class="line"><span class="comment">##           -responseFile &lt;response file&gt;                      ##</span></span><br><span class="line"><span class="comment">##        Creates database silently with clone template. The template in    ##</span></span><br><span class="line"><span class="comment">##    responsefile is a clone template.                         ##</span></span><br><span class="line"><span class="comment">##                                                                          ##</span></span><br><span class="line"><span class="comment">##     4. dbca -silent -deleteDatabase -responseFile &lt;response file&gt;        ##</span></span><br><span class="line"><span class="comment">##        Deletes database silently.                                        ##</span></span><br><span class="line"><span class="comment">##############################################################################</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># GENERAL section is required for all types of database creations.</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line">[<span class="variable constant_">GENERAL</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : RESPONSEFILE_VERSION</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Version of the database to create</span></span><br><span class="line"><span class="comment"># Valid values  : &quot;11.1.0&quot;</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 数据库版本，不可更改</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">RESPONSEFILE_VERSION</span> = <span class="string">&quot;11.2.0&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : OPERATION_TYPE</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Type of operation</span></span><br><span class="line"><span class="comment"># Valid values  : &quot;createDatabase&quot; \ &quot;createTemplateFromDB&quot; \ &quot;createCloneTemplate&quot; \ &quot;deleteDatabase&quot; \ &quot;configureDatabase&quot; \ &quot;addInstance&quot; (RAC-only) \ &quot;deleteInstance&quot; (RAC-only)</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 操作类型：创建数据库</span></span><br><span class="line"><span class="comment"># 可选还有创建模版从数据库，创建克隆模版，删除数据库，配置数据库，添加实例（只限RAC），删除实例（只限RAC）</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">OPERATION_TYPE</span> = <span class="string">&quot;createDatabase&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------*** End of GENERAL section ***------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># CREATEDATABASE section is used when OPERATION_TYPE is defined as &quot;createDatabase&quot;. </span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 当操作类型选择 createDatabase 会使用下面的选项</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">[<span class="variable constant_">CREATEDATABASE</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : GDBNAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Global database name of the database</span></span><br><span class="line"><span class="comment"># Valid values  : &lt;db_name&gt;.&lt;db_domain&gt; - when database domain isn&#x27;t NULL</span></span><br><span class="line"><span class="comment">#                 &lt;db_name&gt;             - when database domain is NULL</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 数据库的全局数据库名称</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">GDBNAME</span> = <span class="string">&quot;orcl&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : POLICYMANAGED</span></span><br><span class="line"><span class="comment"># Datatype      : Boolean</span></span><br><span class="line"><span class="comment"># Description   : Set to true if Database is policy managed and </span></span><br><span class="line"><span class="comment">#         set to false if  Database is admin managed</span></span><br><span class="line"><span class="comment"># Valid values  : TRUE\FALSE</span></span><br><span class="line"><span class="comment"># Default value : FALSE</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#POLICYMANAGED = &quot;false&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : CREATESERVERPOOL</span></span><br><span class="line"><span class="comment"># Datatype      : Boolean</span></span><br><span class="line"><span class="comment"># Description   : Set to true if new server pool need to be created for database </span></span><br><span class="line"><span class="comment">#         if this option is specified then the newly created database </span></span><br><span class="line"><span class="comment">#         will use this newly created serverpool. </span></span><br><span class="line"><span class="comment">#         Multiple serverpoolname can not be specified for database</span></span><br><span class="line"><span class="comment"># Valid values  : TRUE\FALSE</span></span><br><span class="line"><span class="comment"># Default value : FALSE</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#CREATESERVERPOOL = &quot;false&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : FORCE</span></span><br><span class="line"><span class="comment"># Datatype      : Boolean</span></span><br><span class="line"><span class="comment"># Description   : Set to true if new server pool need to be created by force </span></span><br><span class="line"><span class="comment">#         if this option is specified then the newly created serverpool</span></span><br><span class="line"><span class="comment">#         will be assigned server even if no free servers are available.</span></span><br><span class="line"><span class="comment">#         This may affect already running database.</span></span><br><span class="line"><span class="comment">#         This flag can be specified for Admin managed as well as policy managed db.</span></span><br><span class="line"><span class="comment"># Valid values  : TRUE\FALSE</span></span><br><span class="line"><span class="comment"># Default value : FALSE</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#FORCE = &quot;false&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SERVERPOOLNAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Only one serverpool name need to be specified </span></span><br><span class="line"><span class="comment">#          if Create Server Pool option is specified. </span></span><br><span class="line"><span class="comment">#          Comma-separated list of Serverpool names if db need to use</span></span><br><span class="line"><span class="comment">#          multiple Server pool</span></span><br><span class="line"><span class="comment"># Valid values  : ServerPool name</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : No [required in case of RAC service centric database]</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#SERVERPOOLNAME = </span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : CARDINALITY</span></span><br><span class="line"><span class="comment"># Datatype      : Number</span></span><br><span class="line"><span class="comment"># Description   : Specify Cardinality for create server pool operation</span></span><br><span class="line"><span class="comment"># Valid values  : any positive Integer value</span></span><br><span class="line"><span class="comment"># Default value : Number of qualified nodes on cluster</span></span><br><span class="line"><span class="comment"># Mandatory     : No [Required when a new serverpool need to be created]</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#CARDINALITY = </span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SID</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : System identifier (SID) of the database</span></span><br><span class="line"><span class="comment"># Valid values  : Check Oracle11g Administrator&#x27;s Guide</span></span><br><span class="line"><span class="comment"># Default value : &lt;db_name&gt; specified in GDBNAME</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 数据库的系统标识符</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">SID</span> = <span class="string">&quot;orcl&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : NODELIST</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Comma-separated list of cluster nodes</span></span><br><span class="line"><span class="comment"># Valid values  : Cluster node names</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : No (Yes for RAC database-centric database )</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#NODELIST=</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : TEMPLATENAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Name of the template</span></span><br><span class="line"><span class="comment"># Valid values  : Template file name</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 模板文件的名字</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">TEMPLATENAME</span> = <span class="string">&quot;General_Purpose.dbc&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : OBFUSCATEDPASSWORDS</span></span><br><span class="line"><span class="comment"># Datatype      : Boolean</span></span><br><span class="line"><span class="comment"># Description   : Set to true if passwords are encrypted</span></span><br><span class="line"><span class="comment"># Valid values  : TRUE\FALSE</span></span><br><span class="line"><span class="comment"># Default value : FALSE</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#OBFUSCATEDPASSWORDS = FALSE</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SYSPASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Password for SYS user</span></span><br><span class="line"><span class="comment"># Valid values  : Check Oracle11g Administrator&#x27;s Guide</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 系统超级用户密码</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">SYSPASSWORD</span> = <span class="string">&quot;Oracle1234&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SYSTEMPASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Password for SYSTEM user</span></span><br><span class="line"><span class="comment"># Valid values  : Check Oracle11g Administrator&#x27;s Guide</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="variable constant_">SYSTEMPASSWORD</span> = <span class="string">&quot;Oracle1234&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : EMCONFIGURATION</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Enterprise Manager Configuration Type</span></span><br><span class="line"><span class="comment"># Valid values  : CENTRAL|LOCAL|ALL|NOBACKUP|NOEMAIL|NONE</span></span><br><span class="line"><span class="comment"># Default value : NONE</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#EMCONFIGURATION = &quot;NONE&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DISABLESECURITYCONFIGURATION</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Database Security Settings</span></span><br><span class="line"><span class="comment"># Valid values  : ALL|NONE|AUDIT|PASSWORD_PROFILE</span></span><br><span class="line"><span class="comment"># Default value : NONE</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#DISABLESECURITYCONFIGURATION = &quot;NONE&quot;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SYSMANPASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Password for SYSMAN user</span></span><br><span class="line"><span class="comment"># Valid values  : Check Oracle11g Administrator&#x27;s Guide</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes, if LOCAL specified for EMCONFIGURATION</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="variable constant_">SYSMANPASSWORD</span> = <span class="string">&quot;Oracle1234&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DBSNMPPASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Password for DBSNMP user</span></span><br><span class="line"><span class="comment"># Valid values  : Check Oracle11g Administrator&#x27;s Guide</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes, if EMCONFIGURATION is specified</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="variable constant_">DBSNMPPASSWORD</span> = <span class="string">&quot;Oracle1234&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : CENTRALAGENT</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Grid Control Central Agent Oracle Home</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes, if CENTRAL is specified for EMCONFIGURATION</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#CENTRALAGENT = </span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : HOSTUSERNAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Host user name for EM backup job</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes, if ALL or NOEMAIL are specified for EMCONFIGURATION</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#HOSTUSERNAME = </span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : HOSTUSERPASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Host user password for EM backup job</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes, if ALL or NOEMAIL are specified for EMCONFIGURATION</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#HOSTUSERPASSWORD= </span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : BACKUPSCHEDULE</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Daily backup schedule in the form of hh:mm</span></span><br><span class="line"><span class="comment"># Default value : 2:00</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes, if ALL or NOEMAIL are specified for EMCONFIGURATION</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#BACKUPSCHEDULE=</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SMTPSERVER</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Outgoing mail (SMTP) server for email notifications</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes, if ALL or NOBACKUP are specified for EMCONFIGURATION</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#SMTPSERVER =</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : EMAILADDRESS</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Email address for email notifications</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes, if ALL or NOBACKUP are specified for EMCONFIGURATION</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#EMAILADDRESS =</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DVOWNERNAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : DataVault Owner</span></span><br><span class="line"><span class="comment"># Valid values  : Check Oracle11g Administrator&#x27;s Guide</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes, if DataVault option is chosen</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#DVOWNERNAME = &quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DVOWNERPASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Password for DataVault Owner</span></span><br><span class="line"><span class="comment"># Valid values  : Check Oracle11g Administrator&#x27;s Guide</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes, if DataVault option is chosen</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#DVOWNERPASSWORD = &quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DVACCOUNTMANAGERNAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : DataVault Account Manager</span></span><br><span class="line"><span class="comment"># Valid values  : Check Oracle11g Administrator&#x27;s Guide</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#DVACCOUNTMANAGERNAME = &quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DVACCOUNTMANAGERPASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Password for  DataVault Account Manager</span></span><br><span class="line"><span class="comment"># Valid values  : Check Oracle11g Administrator&#x27;s Guide</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#DVACCOUNTMANAGERPASSWORD = &quot;&quot;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DATAFILEJARLOCATION </span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Location of the data file jar </span></span><br><span class="line"><span class="comment"># Valid values  : Directory containing compressed datafile jar</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#DATAFILEJARLOCATION =</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DATAFILEDESTINATION </span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Location of the data file&#x27;s</span></span><br><span class="line"><span class="comment"># Valid values  : Directory for all the database files</span></span><br><span class="line"><span class="comment"># Default value : $ORACLE_BASE/oradata</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="variable constant_">DATAFILEDESTINATION</span> =<span class="regexp">/data/u</span>01/app/oracle/oradata</span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : RECOVERYAREADESTINATION</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Location of the data file&#x27;s</span></span><br><span class="line"><span class="comment"># Valid values  : Recovery Area location</span></span><br><span class="line"><span class="comment"># Default value : $ORACLE_BASE/flash_recovery_area</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="variable constant_">RECOVERYAREADESTINATION</span>=<span class="regexp">/data/u</span>01/app/oracle/fast_recovery_area</span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : STORAGETYPE</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Specifies the storage on which the database is to be created</span></span><br><span class="line"><span class="comment"># Valid values  : FS (CFS for RAC), ASM</span></span><br><span class="line"><span class="comment"># Default value : FS</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#STORAGETYPE=FS</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DISKGROUPNAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Specifies the disk group name for the storage</span></span><br><span class="line"><span class="comment"># Default value : DATA</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#DISKGROUPNAME=DATA</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : ASMSNMP_PASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Password for ASM Monitoring</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#ASMSNMP_PASSWORD=&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : RECOVERYGROUPNAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Specifies the disk group name for the recovery area</span></span><br><span class="line"><span class="comment"># Default value : RECOVERY</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#RECOVERYGROUPNAME=RECOVERY</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : CHARACTERSET</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Character set of the database</span></span><br><span class="line"><span class="comment"># Valid values  : Check Oracle11g National Language Support Guide</span></span><br><span class="line"><span class="comment"># Default value : &quot;US7ASCII&quot;</span></span><br><span class="line"><span class="comment"># Mandatory     : NO</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 数据库的字符集</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">CHARACTERSET</span> = <span class="string">&quot;AL32UTF8&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : NATIONALCHARACTERSET</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : National Character set of the database</span></span><br><span class="line"><span class="comment"># Valid values  : &quot;UTF8&quot; or &quot;AL16UTF16&quot;. For details, check Oracle11g National Language Support Guide</span></span><br><span class="line"><span class="comment"># Default value : &quot;AL16UTF16&quot;</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 国家字符集</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">NATIONALCHARACTERSET</span>= <span class="string">&quot;UTF8&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : REGISTERWITHDIRSERVICE</span></span><br><span class="line"><span class="comment"># Datatype      : Boolean</span></span><br><span class="line"><span class="comment"># Description   : Specifies whether to register with Directory Service.</span></span><br><span class="line"><span class="comment"># Valid values  : TRUE \ FALSE</span></span><br><span class="line"><span class="comment"># Default value : FALSE</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#REGISTERWITHDIRSERVICE= TRUE</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DIRSERVICEUSERNAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Specifies the name of the directory service user</span></span><br><span class="line"><span class="comment"># Mandatory     : YES, if the value of registerWithDirService is TRUE</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#DIRSERVICEUSERNAME= &quot;name&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DIRSERVICEPASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : The password of the directory service user.</span></span><br><span class="line"><span class="comment">#         You can also specify the password at the command prompt instead of here.</span></span><br><span class="line"><span class="comment"># Mandatory     : YES, if the value of registerWithDirService is TRUE</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#DIRSERVICEPASSWORD= &quot;password&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : WALLETPASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : The password for wallet to created or modified.</span></span><br><span class="line"><span class="comment">#         You can also specify the password at the command prompt instead of here.</span></span><br><span class="line"><span class="comment"># Mandatory     : YES, if the value of registerWithDirService is TRUE</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#WALLETPASSWORD= &quot;password&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : LISTENERS</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Specifies list of listeners to register the database with.</span></span><br><span class="line"><span class="comment">#         By default the database is configured for all the listeners specified in the </span></span><br><span class="line"><span class="comment">#         $ORACLE_HOME/network/admin/listener.ora   </span></span><br><span class="line"><span class="comment"># Valid values  : The list should be space separated names like &quot;listener1 listener2&quot;.</span></span><br><span class="line"><span class="comment"># Mandatory     : NO</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#LISTENERS = &quot;listener1 listener2&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : VARIABLESFILE </span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Location of the file containing variable value pair</span></span><br><span class="line"><span class="comment"># Valid values  : A valid file-system file. The variable value pair format in this file </span></span><br><span class="line"><span class="comment">#         is &lt;variable&gt;=&lt;value&gt;. Each pair should be in a new line.</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : NO</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#VARIABLESFILE =</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : VARIABLES</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : comma separated list of name=value pairs. Overrides variables defined in variablefile and templates</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : NO</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#VARIABLES =</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : INITPARAMS</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : comma separated list of name=value pairs. Overrides initialization parameters defined in templates</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : NO</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#INITPARAMS =</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : MEMORYPERCENTAGE</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : percentage of physical memory for Oracle</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : NO</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Oracle占用物理内存的百分比</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">MEMORYPERCENTAGE</span> = <span class="string">&quot;40&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DATABASETYPE</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : used for memory distribution when MEMORYPERCENTAGE specified</span></span><br><span class="line"><span class="comment"># Valid values  : MULTIPURPOSE|DATA_WAREHOUSING|OLTP</span></span><br><span class="line"><span class="comment"># Default value : MULTIPURPOSE</span></span><br><span class="line"><span class="comment"># Mandatory     : NO</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#DATABASETYPE = &quot;MULTIPURPOSE&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : AUTOMATICMEMORYMANAGEMENT</span></span><br><span class="line"><span class="comment"># Datatype      : Boolean</span></span><br><span class="line"><span class="comment"># Description   : flag to indicate Automatic Memory Management is used</span></span><br><span class="line"><span class="comment"># Valid values  : TRUE/FALSE</span></span><br><span class="line"><span class="comment"># Default value : TRUE</span></span><br><span class="line"><span class="comment"># Mandatory     : NO</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#AUTOMATICMEMORYMANAGEMENT = &quot;TRUE&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : TOTALMEMORY</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : total memory in MB to allocate to Oracle</span></span><br><span class="line"><span class="comment"># Valid values  : </span></span><br><span class="line"><span class="comment"># Default value : </span></span><br><span class="line"><span class="comment"># Mandatory     : NO</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="variable constant_">TOTALMEMORY</span> = <span class="string">&quot;2048&quot;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------*** End of CREATEDATABASE section ***------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># createTemplateFromDB section is used when OPERATION_TYPE is defined as &quot;createTemplateFromDB&quot;. </span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 当操作类型是创建模版createTemplateFromDB的时候会启用这个选项</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">[createTemplateFromDB]</span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SOURCEDB </span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : The source database from which to create the template</span></span><br><span class="line"><span class="comment"># Valid values  : The format is &lt;host&gt;:&lt;port&gt;:&lt;sid&gt;</span></span><br><span class="line"><span class="comment"># Default value : none</span></span><br><span class="line"><span class="comment"># Mandatory     : YES</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 给源数据库创建模版</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">SOURCEDB</span> = <span class="string">&quot;myhost:1521:orcl&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SYSDBAUSERNAME </span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : A user with DBA role.</span></span><br><span class="line"><span class="comment"># Default value : none</span></span><br><span class="line"><span class="comment"># Mandatory     : YES</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用的数据库角色是system</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">SYSDBAUSERNAME</span> = <span class="string">&quot;system&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SYSDBAPASSWORD </span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : The password of the DBA user.</span></span><br><span class="line"><span class="comment">#         You can also specify the password at the command prompt instead of here.</span></span><br><span class="line"><span class="comment"># Default value : none</span></span><br><span class="line"><span class="comment"># Mandatory     : YES</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#SYSDBAPASSWORD = &quot;password&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : TEMPLATENAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Name for the new template.</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 新模版的名字</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">TEMPLATENAME</span> = <span class="string">&quot;My Copy TEMPLATE&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------*** End of createTemplateFromDB section ***------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># createCloneTemplate section is used when OPERATION_TYPE is defined as &quot;createCloneTemplate&quot;. </span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 当操作类型是创建克隆模版createCloneTemplate会使用下面的选项</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">[createCloneTemplate]</span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SOURCEDB</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : The source database is the SID from which to create the template. </span></span><br><span class="line"><span class="comment">#         This database must be local and on the same ORACLE_HOME.</span></span><br><span class="line"><span class="comment"># Default value : none</span></span><br><span class="line"><span class="comment"># Mandatory     : YES</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 源数据库的SID</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">SOURCEDB</span> = <span class="string">&quot;orcl&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SYSDBAUSERNAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : A user with DBA role.</span></span><br><span class="line"><span class="comment"># Default value : none</span></span><br><span class="line"><span class="comment"># Mandatory     : YES, if no OS authentication</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#SYSDBAUSERNAME = &quot;sys&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SYSDBAPASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : The password of the DBA user.</span></span><br><span class="line"><span class="comment">#         You can also specify the password at the command prompt instead of here.</span></span><br><span class="line"><span class="comment"># Default value : none</span></span><br><span class="line"><span class="comment"># Mandatory     : YES</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#SYSDBAPASSWORD = &quot;password&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : TEMPLATENAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Name for the new template.</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 新模版的名字</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">TEMPLATENAME</span> = <span class="string">&quot;My Clone TEMPLATE&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DATAFILEJARLOCATION</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Location of the data file jar </span></span><br><span class="line"><span class="comment"># Valid values  : Directory where the new compressed datafile jar will be placed</span></span><br><span class="line"><span class="comment"># Default value : $ORACLE_HOME/assistants/dbca/templates</span></span><br><span class="line"><span class="comment"># Mandatory     : NO</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#DATAFILEJARLOCATION = </span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------*** End of createCloneTemplate section ***------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># DELETEDATABASE section is used when DELETE_TYPE is defined as &quot;deleteDatabase&quot;. </span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 当操作类型是删除数据库DELETEDATABASE会启动下面的选项</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">[<span class="variable constant_">DELETEDATABASE</span>]</span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SOURCEDB</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : The source database is the SID </span></span><br><span class="line"><span class="comment">#         This database must be local and on the same ORACLE_HOME.</span></span><br><span class="line"><span class="comment"># Default value : none</span></span><br><span class="line"><span class="comment"># Mandatory     : YES</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 源数据库的SID</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">SOURCEDB</span> = <span class="string">&quot;orcl&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SYSDBAUSERNAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : A user with DBA role.</span></span><br><span class="line"><span class="comment"># Default value : none</span></span><br><span class="line"><span class="comment"># Mandatory     : YES, if no OS authentication</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#SYSDBAUSERNAME = &quot;sys&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SYSDBAPASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : The password of the DBA user.</span></span><br><span class="line"><span class="comment">#         You can also specify the password at the command prompt instead of here.</span></span><br><span class="line"><span class="comment"># Default value : none</span></span><br><span class="line"><span class="comment"># Mandatory     : YES, if no OS authentication</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#SYSDBAPASSWORD = &quot;password&quot;</span></span><br><span class="line"><span class="comment">#-----------------------*** End of deleteDatabase section ***------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># GENERATESCRIPTS section </span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 生成脚本的选项</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">[generateScripts]</span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : TEMPLATENAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Name of the template</span></span><br><span class="line"><span class="comment"># Valid values  : Template name as seen in DBCA</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 模版的名字</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">TEMPLATENAME</span> = <span class="string">&quot;New Database&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : GDBNAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Global database name of the database</span></span><br><span class="line"><span class="comment"># Valid values  : &lt;db_name&gt;.&lt;db_domain&gt; - when database domain isn&#x27;t NULL</span></span><br><span class="line"><span class="comment">#                 &lt;db_name&gt;             - when database domain is NULL</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 全局数据库的名字</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">GDBNAME</span> = <span class="string">&quot;orcl11.us.oracle.com&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SCRIPTDESTINATION </span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Location of the scripts</span></span><br><span class="line"><span class="comment"># Valid values  : Directory for all the scripts</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#SCRIPTDESTINATION =</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------*** End of deleteDatabase section ***------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># CONFIGUREDATABASE section is used when OPERATION_TYPE is defined as &quot;configureDatabase&quot;. </span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 当操作类型是配置数据库CONFIGUREDATABASE会启用下面的选项</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">[<span class="variable constant_">CONFIGUREDATABASE</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SOURCEDB</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : The source database is the SID </span></span><br><span class="line"><span class="comment">#         This database must be local and on the same ORACLE_HOME.</span></span><br><span class="line"><span class="comment"># Default value : none</span></span><br><span class="line"><span class="comment"># Mandatory     : YES</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#SOURCEDB = &quot;orcl&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SYSDBAUSERNAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : A user with DBA role.</span></span><br><span class="line"><span class="comment"># Default value : none</span></span><br><span class="line"><span class="comment"># Mandatory     : YES, if no OS authentication</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#SYSDBAUSERNAME = &quot;sys&quot;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SYSDBAPASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : The password of the DBA user.</span></span><br><span class="line"><span class="comment">#         You can also specify the password at the command prompt instead of here.</span></span><br><span class="line"><span class="comment"># Default value : none</span></span><br><span class="line"><span class="comment"># Mandatory     : YES, if no OS authentication</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#SYSDBAPASSWORD =</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : REGISTERWITHDIRSERVICE</span></span><br><span class="line"><span class="comment"># Datatype      : Boolean</span></span><br><span class="line"><span class="comment"># Description   : Specifies whether to register with Directory Service.</span></span><br><span class="line"><span class="comment"># Valid values  : TRUE \ FALSE</span></span><br><span class="line"><span class="comment"># Default value : FALSE</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#REGISTERWITHDIRSERVICE= TRUE</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : UNREGISTERWITHDIRSERVICE</span></span><br><span class="line"><span class="comment"># Datatype      : Boolean</span></span><br><span class="line"><span class="comment"># Description   : Specifies whether to unregister with Directory Service.</span></span><br><span class="line"><span class="comment"># Valid values  : TRUE \ FALSE</span></span><br><span class="line"><span class="comment"># Default value : FALSE</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#UNREGISTERWITHDIRSERVICE= TRUE</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : REGENERATEDBPASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : Boolean</span></span><br><span class="line"><span class="comment"># Description   : Specifies whether regenerate database password in OID/Wallet</span></span><br><span class="line"><span class="comment"># Valid values  : TRUE \ FALSE</span></span><br><span class="line"><span class="comment"># Default value : FALSE</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#REGENERATEDBPASSWORD= TRUE</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DIRSERVICEUSERNAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Specifies the name of the directory service user</span></span><br><span class="line"><span class="comment"># Mandatory     : YES, if the any of the reg/unreg/regenPasswd options specified</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#DIRSERVICEUSERNAME= &quot;name&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DIRSERVICEPASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : The password of the directory service user.</span></span><br><span class="line"><span class="comment">#         You can also specify the password at the command prompt instead of here.</span></span><br><span class="line"><span class="comment"># Mandatory     : YES, if the any of the reg/unreg/regenPasswd options specified</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#DIRSERVICEPASSWORD= &quot;password&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : WALLETPASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : The password for wallet to created or modified.</span></span><br><span class="line"><span class="comment">#         You can also specify the password at the command prompt instead of here.</span></span><br><span class="line"><span class="comment"># Mandatory     : YES, if the any of the reg/unreg/regenPasswd options specified</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#WALLETPASSWORD= &quot;password&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DISABLESECURITYCONFIGURATION</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Database Security Settings</span></span><br><span class="line"><span class="comment"># Valid values  : ALL|NONE|AUDIT|PASSWORD_PROFILE</span></span><br><span class="line"><span class="comment"># Default value : NONE</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#DISABLESECURITYCONFIGURATION = &quot;NONE&quot;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : ENABLESECURITYCONFIGURATION</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Database Security Settings</span></span><br><span class="line"><span class="comment"># Valid values  : true|false</span></span><br><span class="line"><span class="comment"># Default value : true</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#ENABLESECURITYCONFIGURATION = &quot;true&quot;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : EMCONFIGURATION</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Enterprise Manager Configuration Type</span></span><br><span class="line"><span class="comment"># Valid values  : CENTRAL|LOCAL|ALL|NOBACKUP|NOEMAIL|NONE</span></span><br><span class="line"><span class="comment"># Default value : NONE</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#EMCONFIGURATION = &quot;NONE&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SYSMANPASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Password for SYSMAN user</span></span><br><span class="line"><span class="comment"># Valid values  : Check Oracle11g Administrator&#x27;s Guide</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes, if LOCAL specified for EMCONFIGURATION</span></span><br><span class="line"><span class="comment">#----------------------------------------------------------------------------SYSMANPASSWORD = &quot;ORACLE1234&quot;</span></span><br><span class="line"><span class="variable constant_">SYSMANPASSWORD</span> = <span class="string">&quot;Oracle1234&quot;</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DBSNMPPASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Password for DBSNMP user</span></span><br><span class="line"><span class="comment"># Valid values  : Check Oracle11g Administrator&#x27;s Guide</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes, if EMCONFIGURATION is specified</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#DBSNMPPASSWORD = &quot;password&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : CENTRALAGENT</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Grid Control Central Agent Oracle Home</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes, if CENTRAL is specified for EMCONFIGURATION</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#CENTRALAGENT = </span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : HOSTUSERNAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Host user name for EM backup job</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes, if ALL or NOEMAIL are specified for EMCONFIGURATION</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#HOSTUSERNAME = </span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : HOSTUSERPASSWORD</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Host user password for EM backup job</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes, if ALL or NOEMAIL are specified for EMCONFIGURATION</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#HOSTUSERPASSWORD= </span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : BACKUPSCHEDULE</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Daily backup schedule in the form of hh:mm</span></span><br><span class="line"><span class="comment"># Default value : 2:00</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes, if ALL or NOEMAIL are specified for EMCONFIGURATION</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#BACKUPSCHEDULE=</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SMTPSERVER</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Outgoing mail (SMTP) server for email notifications</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes, if ALL or NOBACKUP are specified for EMCONFIGURATION</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#SMTPSERVER =</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : EMAILADDRESS</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Email address for email notifications</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes, if ALL or NOBACKUP are specified for EMCONFIGURATION</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#EMAILADDRESS =</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------*** End of CONFIGUREDATABASE section ***------------------------</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># ADDINSTANCE section is used when OPERATION_TYPE is defined as &quot;addInstance&quot;. </span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 当操作类型选择的是添加实例ADDINSTANCE会启动下面的选项</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">[<span class="variable constant_">ADDINSTANCE</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DB_UNIQUE_NAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : DB Unique Name of the RAC database</span></span><br><span class="line"><span class="comment"># Valid values  : &lt;db_unique_name&gt;</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># RAC数据库的唯一的名称</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">DB_UNIQUE_NAME</span> = <span class="string">&quot;orcl11g.us.oracle.com&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : INSTANCENAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : RAC instance name to be added</span></span><br><span class="line"><span class="comment"># Valid values  : Check Oracle11g Administrator&#x27;s Guide</span></span><br><span class="line"><span class="comment"># Default value : &lt;sid_prefix&gt;+&lt;highest_current_thread+1&gt;</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#INSTANCENAME = &quot;orcl1&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : NODELIST</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Node on which to add new instance </span></span><br><span class="line"><span class="comment">#                 (in 10gR2, instance addition is supported on 1 node at a time)</span></span><br><span class="line"><span class="comment"># Valid values  : Cluster node name</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加新实例的节点</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">NODELIST</span>=</span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : OBFUSCATEDPASSWORDS</span></span><br><span class="line"><span class="comment"># Datatype      : Boolean</span></span><br><span class="line"><span class="comment"># Description   : Set to true if passwords are encrypted</span></span><br><span class="line"><span class="comment"># Valid values  : TRUE\FALSE</span></span><br><span class="line"><span class="comment"># Default value : FALSE</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#OBFUSCATEDPASSWORDS = FALSE</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SYSDBAUSERNAME </span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : A user with DBA role.</span></span><br><span class="line"><span class="comment"># Default value : none</span></span><br><span class="line"><span class="comment"># Mandatory     : YES</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用的角色是sys</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">SYSDBAUSERNAME</span> = <span class="string">&quot;sys&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SYSDBAPASSWORD </span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : The password of the DBA user.</span></span><br><span class="line"><span class="comment"># Default value : none</span></span><br><span class="line"><span class="comment"># Mandatory     : YES</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#SYSDBAPASSWORD = &quot;password&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------*** End of ADDINSTANCE section ***------------------------</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># DELETEINSTANCE section is used when OPERATION_TYPE is defined as &quot;deleteInstance&quot;. </span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 当选择的操作类型是删除实例DELETEINSTANCE会启动下面选项</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line">[<span class="variable constant_">DELETEINSTANCE</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : DB_UNIQUE_NAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : DB Unique Name of the RAC database</span></span><br><span class="line"><span class="comment"># Valid values  : &lt;db_unique_name&gt;</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># RAC数据库的唯一名字</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">DB_UNIQUE_NAME</span> = <span class="string">&quot;orcl11g.us.oracle.com&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : INSTANCENAME</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : RAC instance name to be deleted</span></span><br><span class="line"><span class="comment"># Valid values  : Check Oracle11g Administrator&#x27;s Guide</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : Yes</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 要删除的RAC实例名</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">INSTANCENAME</span> = <span class="string">&quot;orcl11g&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : NODELIST</span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : Node on which instance to be deleted (SID) is located</span></span><br><span class="line"><span class="comment"># Valid values  : Cluster node name</span></span><br><span class="line"><span class="comment"># Default value : None</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#NODELIST=</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : OBFUSCATEDPASSWORDS</span></span><br><span class="line"><span class="comment"># Datatype      : Boolean</span></span><br><span class="line"><span class="comment"># Description   : Set to true if passwords are encrypted</span></span><br><span class="line"><span class="comment"># Valid values  : TRUE\FALSE</span></span><br><span class="line"><span class="comment"># Default value : FALSE</span></span><br><span class="line"><span class="comment"># Mandatory     : No</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#OBFUSCATEDPASSWORDS = FALSE</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SYSDBAUSERNAME </span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : A user with DBA role.</span></span><br><span class="line"><span class="comment"># Default value : none</span></span><br><span class="line"><span class="comment"># Mandatory     : YES</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用的数据库角色</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="variable constant_">SYSDBAUSERNAME</span> = <span class="string">&quot;sys&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># Name          : SYSDBAPASSWORD </span></span><br><span class="line"><span class="comment"># Datatype      : String</span></span><br><span class="line"><span class="comment"># Description   : The password of the DBA user.</span></span><br><span class="line"><span class="comment"># Default value : none</span></span><br><span class="line"><span class="comment"># Mandatory     : YES</span></span><br><span class="line"><span class="comment">#-----------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#SYSDBAPASSWORD = &quot;password&quot;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#-----------------------*** End of DELETEINSTANCE section ***------------------------</span></span><br></pre></td></tr></table></figure><h2 id="切换到oracle用户创建实例"><a href="#切换到oracle用户创建实例" class="headerlink" title="切换到oracle用户创建实例"></a>切换到oracle用户创建实例</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 使用dbca工具创建实例</span><br><span class="line">dbca -silent -responseFile /home/oracle/response/dbca.rsp</span><br></pre></td></tr></table></figure><p><img src="https://img.chensir.ink/chensir-pics/202206091143838.png" alt="oracle3"></p><p>创建多个实例，只需要将dbca.rsp复制一个对其进行修改，使用dbca工具进行创建即可。</p><p>切换实例方法：</p><p>假如创建了两个实例：orcl1，orcl2</p><p>切换实例：export ORACLE_SID&#x3D;orcl1l<code>、</code>export ORACLE_SID&#x3D;orcl2</p><p>然后进入sqlplus启动实例：<code> sqlplus / as sysdba</code> </p><p>查看当前实例信息：<code> show parameter name</code></p><p>启动实例：<code>startup</code><br>关闭实例：<code>shutdown</code></p><h1 id="Oracle监听配置"><a href="#Oracle监听配置" class="headerlink" title="Oracle监听配置"></a>Oracle监听配置</h1><p>安装网络监听器：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">/data/u01/app/oracle/product/11.2.0/dbhome_1/bin/netca /silent /responsefile /home/oracle/response/netca.rsp</span><br></pre></td></tr></table></figure><h2 id="listener-ora"><a href="#listener-ora" class="headerlink" title="listener.ora"></a>listener.ora</h2><p>Listener.ora:用于服务端，用于提示服务端监听哪些实例.</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vim /data/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora</span><br></pre></td></tr></table></figure><p>具体配置参考如👇</p><figure class="highlight kotlin"><table><tr><td class="code"><pre><span class="line"># listener.ora Network Configuration File: /<span class="keyword">data</span>/u01/app/oracle/product/<span class="number">11.2</span><span class="number">.0</span>/dbhome_1/network/admin/listener.ora</span><br><span class="line"># Generated <span class="keyword">by</span> Oracle configuration tools.</span><br><span class="line"></span><br><span class="line">SID_LIST_LISTENER =</span><br><span class="line">    (SID_LIST =</span><br><span class="line">        (SID_DESC =</span><br><span class="line">            (GLOBAL_DBNAME = orcl)</span><br><span class="line">            (ORACLE_HOME = /<span class="keyword">data</span>/u01/app/oracle/product/<span class="number">11.2</span><span class="number">.0</span>/dbhome_1)</span><br><span class="line">            (SID_NAME = orcl)</span><br><span class="line">        )</span><br><span class="line">      # 多个实例写法</span><br><span class="line">        (SID_DESC =</span><br><span class="line">            (GLOBAL_DBNAME = orcl2)</span><br><span class="line">            (ORACLE_HOME = /<span class="keyword">data</span>/u01/app/oracle/product/<span class="number">11.2</span><span class="number">.0</span>/dbhome_1)</span><br><span class="line">            (SID_NAME = tsorcl)</span><br><span class="line">        )</span><br><span class="line">    )</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">LISTENER =</span><br><span class="line">  (DESCRIPTION_LIST =</span><br><span class="line">    (DESCRIPTION =</span><br><span class="line">      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))</span><br><span class="line">      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = <span class="number">1521</span>))</span><br><span class="line">    )</span><br><span class="line">  )</span><br><span class="line"></span><br><span class="line">ADR_BASE_LISTENER = /<span class="keyword">data</span>/u01/app/oracle</span><br></pre></td></tr></table></figure><h2 id="tnsnames-ora"><a href="#tnsnames-ora" class="headerlink" title="tnsnames.ora"></a>tnsnames.ora</h2><p>tnsnames.ora：用于客户端,提示客户端从哪个监听实例连接。没有的话新建一个即可。</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vim /data/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora</span><br></pre></td></tr></table></figure><p>具体配置参考如👇</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># tnsnames.ora Network Configuration File: /data/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora</span></span><br><span class="line"><span class="comment"># Generated by Oracle configuration tools.</span></span><br><span class="line"></span><br><span class="line">LISTENER_TSORCL =</span><br><span class="line">  (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">TSORCL =</span><br><span class="line">  (DESCRIPTION =</span><br><span class="line">    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))</span><br><span class="line">    (CONNECT_DATA =</span><br><span class="line">      (SERVER = DEDICATED)</span><br><span class="line">      (SERVICE_NAME = orcl)</span><br><span class="line">    )</span><br><span class="line">  )</span><br><span class="line">  <span class="comment"># 多个实例写法</span></span><br><span class="line">  (DESCRIPTION =</span><br><span class="line">    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))</span><br><span class="line">    (CONNECT_DATA =</span><br><span class="line">      (SERVER = DEDICATED)</span><br><span class="line">      (SERVICE_NAME = orcl2)</span><br><span class="line">    )</span><br><span class="line">  )</span><br></pre></td></tr></table></figure><h1 id="配置开机自启"><a href="#配置开机自启" class="headerlink" title="配置开机自启"></a>配置开机自启</h1><p>安装好Oracle数据库后: 执行 <code>dbstart</code>和<code>dbshut</code>会提示：</p><figure class="highlight cpp"><table><tr><td class="code"><pre><span class="line">ORACLE_HOME_LISTNER is <span class="keyword">not</span> SET, unable to <span class="keyword">auto</span>-start Oracle Net Listener</span><br><span class="line">Usage: /u01/app/oracle/oracle/product/<span class="number">10.2</span><span class="number">.0</span>/db_1/bin/dbstart ORACLE_HOME</span><br></pre></td></tr></table></figure><p>错误原因是：dbstart脚本文件中ORACLE_HOME_LISTNER的设置有问题</p><p>解决办法：</p><ul><li>修改dbstart：<code>vim /data/u01/app/oracle/product/11.2.0/dbhome_1/bin/dbstart</code></li></ul><figure class="highlight ruby"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 将 ORACLE_HOME_LISTNER=$1 修改为 ORACLE_HOME_LISTNER=$ORACLE_HOME</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 修改前</span></span><br><span class="line"><span class="variable constant_">ORACLE_HOME_LISTNER</span>=<span class="variable">$1</span></span><br><span class="line"><span class="comment"># 修改后</span></span><br><span class="line"><span class="variable constant_">ORACLE_HOME_LISTNER</span>=<span class="regexp">/data/u</span>01/app/oracle/product/<span class="number">11.2</span>.<span class="number">0</span>/dbhome_1</span><br></pre></td></tr></table></figure><ul><li>修改&#x2F;etc&#x2F;oratab文件：<code>vim /etc/oratab</code></li></ul><figure class="highlight kotlin"><table><tr><td class="code"><pre><span class="line"># 修改前</span><br><span class="line">orcl:/<span class="keyword">data</span>/u01/app/oracle/product/<span class="number">11.2</span><span class="number">.0</span>/dbhome_1:N</span><br><span class="line"># 实例<span class="number">2</span></span><br><span class="line">orcl2:/<span class="keyword">data</span>/u01/app/oracle/product/<span class="number">11.2</span><span class="number">.0</span>/dbhome_1:N</span><br><span class="line"></span><br><span class="line"># 修改后</span><br><span class="line">orcl:/<span class="keyword">data</span>/u01/app/oracle/product/<span class="number">11.2</span><span class="number">.0</span>/dbhome_1:Y</span><br><span class="line"># 实例<span class="number">2</span></span><br><span class="line">orcl2:/<span class="keyword">data</span>/u01/app/oracle/product/<span class="number">11.2</span><span class="number">.0</span>/dbhome_1:Y</span><br></pre></td></tr></table></figure><p>**切换到root用户：**将lsnrctl start和dbstart添加到rc.local文件中</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vim /etc/rc.d/rc.local</span><br></pre></td></tr></table></figure><p>在结尾处增加👇内容</p><figure class="highlight kotlin"><table><tr><td class="code"><pre><span class="line">su oracle -lc /<span class="keyword">data</span>/u01/app/oracle/product/<span class="number">11.2</span><span class="number">.0</span>/dbhome_1/bin/lsnrctl start</span><br><span class="line">su oracle -lc /<span class="keyword">data</span>/u01/app/oracle/product/<span class="number">11.2</span><span class="number">.0</span>/dbhome_1/bin/dbstart</span><br></pre></td></tr></table></figure><p>最后 执行 <code>chmod 777 /etc/rc.d/rc.local</code></p><p>至此Oracle11gR2安装完成。（测试连接：本教程所有密码为Oracle1234，创建实例的配置文件有提到。）</p><h1 id="可能会遇到的问题"><a href="#可能会遇到的问题" class="headerlink" title="可能会遇到的问题"></a>可能会遇到的问题</h1><h2 id="ORA-01017-invalid-username-password-logon-denied"><a href="#ORA-01017-invalid-username-password-logon-denied" class="headerlink" title="ORA-01017: invalid username&#x2F;password; logon denied"></a>ORA-01017: invalid username&#x2F;password; logon denied</h2><p>invalid username&#x2F;password; logon denied 错误(程序中的用户和密码无法登录，登录被拒)。<br>Oracle 11g 版本</p><p>初次安装使用报错：</p><p>解决方案：创建新用户：</p><ul><li><p>打开sqlplus 以系统身份登录：<code>sqlplus / as sysdba</code></p></li><li><p>创建新用户：</p><p>语法：create user 用户名 identified by 密码;</p></li><li><p>为刚创建的用户解锁</p><p>语法：alter user 用户名 account unlock;</p></li><li><p>授予新登陆的用户创建权限</p><p> 语法：grant create session to 用户名 ;</p></li><li><p>其他权限设置：</p><p> 授予新创建用户数据库管理员权限：</p><p> 语法：grant dba to 用户名;</p></li><li><p>为用户授予其他权限：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW , DROP ANY  VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE, DBA, CONNECT,RESOURCE,CREATE SESSION TO root;</span><br></pre></td></tr></table></figure></li><li><p>删除用户语法：<code>drop user 用户名</code>;</p></li><li><p>如果用户拥有数据表，则不能直接删除，要用上关键字cascade：<code> drop user 用户名 cascade;</code></p></li></ul><p>整体步骤：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">sqlplus / as sysdba</span><br><span class="line">create user 用户名 identified by 密码;</span><br><span class="line">alter user  用户名 account unlock; </span><br><span class="line">grant create session to 用户名;</span><br><span class="line">GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW , DROP ANY  VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE, DBA, CONNECT,RESOURCE,CREATE SESSION TO 用户名;</span><br></pre></td></tr></table></figure><h2 id="ORA-12899"><a href="#ORA-12899" class="headerlink" title="ORA-12899"></a>ORA-12899</h2><p>安装完Oracle将测试环境数据库导入本地结果报错ORA-12899。</p><p>出现原因：字符集引起的,中文在UTF-8中占3个字节,ZHS16GBK中占2个字节,而源dmp文件字符集是ZHS16GBK库里倒出来的数据,现在要导入到目标字符集为UTF-8的库里,所以会出现ORA-12899。</p><p>解决方法：修改一下Oracle的字符集即可。</p><p>打开sqlplus 以系统身份登录：<code>sqlplus / as sysdba</code></p><p>按顺序执行👇</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">SQL&gt; SHUTDOWN IMMEDIATE</span><br><span class="line"></span><br><span class="line">SQL&gt; STARTUP MOUNT</span><br><span class="line"></span><br><span class="line">SQL&gt; ALTER SYSTEM ENABLE RESTRICTED SESSION;</span><br><span class="line"></span><br><span class="line">SQL&gt; ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;</span><br><span class="line"></span><br><span class="line">SQL&gt; ALTER SYSTEM SET AQ_TM_PROCESSES=0;</span><br><span class="line"></span><br><span class="line">SQL&gt; ALTER DATABASE OPEN;</span><br><span class="line"></span><br><span class="line">SQL&gt; ALTER DATABASE CHARACTER SET ZHS16GBK ;</span><br><span class="line">ALTER DATABASE CHARACTER SET ZHS16GBK</span><br><span class="line">*</span><br><span class="line">ERROR at line 1:</span><br><span class="line">ORA-12712: new character set must be a superset of old character set</span><br><span class="line"># 报字符集不兼容，此时下INTERNAL_USE指令不对字符集超集进行检查：</span><br><span class="line"></span><br><span class="line">SQL&gt; ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;</span><br><span class="line"></span><br><span class="line">SQL&gt; SHUTDOWN IMMEDIATE</span><br><span class="line"></span><br><span class="line">SQL&gt; STARTUP</span><br></pre></td></tr></table></figure><p>这时候ORA-12899的问题已经彻底解决，可以导入数据了。</p><p><img src="https://img.chensir.ink/chensir-pics/202206091144944.png" alt="oracle4"></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;安装Oracle11gR2准备&quot;&gt;&lt;a href=&quot;#安装Oracle11gR2准备&quot; class=&quot;headerlink&quot; title=&quot;安装Oracle11gR2准备&quot;&gt;&lt;/a&gt;安装Oracle11gR2准备&lt;/h1&gt;&lt;h2 id=&quot;安装所需依赖：&quot;&gt;&lt;a</summary>
        
      
    
    
    
    <category term="Oracle" scheme="https://chensir.ink/categories/Oracle/"/>
    
    
    <category term="Oracle" scheme="https://chensir.ink/tags/Oracle/"/>
    
  </entry>
  
  <entry>
    <title>Centos7 配置秘钥实现免密登录</title>
    <link href="https://chensir.ink/2021/06/06/Centos7-%E9%85%8D%E7%BD%AE%E7%A7%98%E9%92%A5%E5%AE%9E%E7%8E%B0%E5%85%8D%E5%AF%86%E7%99%BB%E5%BD%95/"/>
    <id>https://chensir.ink/2021/06/06/Centos7-%E9%85%8D%E7%BD%AE%E7%A7%98%E9%92%A5%E5%AE%9E%E7%8E%B0%E5%85%8D%E5%AF%86%E7%99%BB%E5%BD%95/</id>
    <published>2021-06-06T02:22:30.000Z</published>
    <updated>2025-11-26T14:04:32.725Z</updated>
    
    <content type="html"><![CDATA[<div class="note purple no-icon flat"><p><strong>大体流程：本地生成秘钥&#x3D;&gt;将秘钥上传至服务器</strong></p></div><h3 id="本地电脑生成秘钥"><a href="#本地电脑生成秘钥" class="headerlink" title="本地电脑生成秘钥"></a>本地电脑生成秘钥</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">ssh-keygen -t rsa -C <span class="string">&quot;邮箱地址 例：*****.@163.com&quot;</span></span><br></pre></td></tr></table></figure><p>一路回车即可，所有都默认就可以生成秘钥，引号内是唯一邮箱，可以作为以后Git远程仓库使用。结果如下图。</p><p><img src="https://img.chensir.ink/chensir-pics/202206091139794.png" alt="mm-1"></p><p>生成之后，查看生成后的公钥和私钥</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">ls</span> ~/.ssh</span><br></pre></td></tr></table></figure><p>可以看到有两个文件：id_rsa（私钥）、id_rsa.pub（公钥）</p><h3 id="登录远程服务器"><a href="#登录远程服务器" class="headerlink" title="登录远程服务器"></a>登录远程服务器</h3><p>查看 ~ 目录下是否有 .ssh 目录，~目录 指的是当前用户的主目录名 （&#x2F;home&#x2F;用户名）</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">ls</span> -al ~</span><br></pre></td></tr></table></figure><p>如果没有 .ssh 可以创建该目录</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p ~/.ssh</span><br></pre></td></tr></table></figure><p>或者 可以执行下面的命令 按照提示输入yes 再输入密码即可，.ssh 目录是用来存储 本台机器ssh访问其他服务器信息的，没有访问其他机器是没有.ssh 目录的</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">ssh localhost</span><br></pre></td></tr></table></figure><h3 id="上传生成的公钥"><a href="#上传生成的公钥" class="headerlink" title="上传生成的公钥"></a>上传生成的公钥</h3><p>将刚刚生成的公钥上传至服务器的 ~&#x2F;.ssh 目录下</p><p>在本地 使用 scp 命令 ： <code>scp 需要发送的文件路径 目标路径</code></p><p>将本地生成的公钥 放到服务器用户主目录下的.ssh目录里 并命名为 authorized_keys</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">scp ~/.ssh/id_rsa.pub 用户名@服务器ip地址:/用户主目录名/.ssh/authorized_keys</span><br></pre></td></tr></table></figure><p>这样就完成了 再次登录服务器就不需要输入密码了。</p><h3 id="设置禁用密码登录"><a href="#设置禁用密码登录" class="headerlink" title="设置禁用密码登录"></a>设置禁用密码登录</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">sudo</span> vim /etc/ssh/sshd_config</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 禁止密码登录。原先为PasswordAuthentication yes</span><br><span class="line">PasswordAuthentication no    </span><br><span class="line"></span><br><span class="line"># 禁止 root 登录，看情况是否需要。原先为PermitRootLogin yes</span><br><span class="line">PermitRootLogin no </span><br></pre></td></tr></table></figure><h3 id="重启sshd服务"><a href="#重启sshd服务" class="headerlink" title="重启sshd服务"></a>重启sshd服务</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">service restart sshd.service</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;div class=&quot;note purple no-icon flat&quot;&gt;&lt;p&gt;&lt;strong&gt;大体流程：本地生成秘钥&amp;#x3D;&amp;gt;将秘钥上传至服务器&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;h3 id=&quot;本地电脑生成秘钥&quot;&gt;&lt;a href=&quot;#本地电脑生成秘钥&quot;</summary>
        
      
    
    
    
    <category term="Linux" scheme="https://chensir.ink/categories/Linux/"/>
    
    
    <category term="生成秘钥" scheme="https://chensir.ink/tags/%E7%94%9F%E6%88%90%E7%A7%98%E9%92%A5/"/>
    
    <category term="免密登录" scheme="https://chensir.ink/tags/%E5%85%8D%E5%AF%86%E7%99%BB%E5%BD%95/"/>
    
  </entry>
  
  <entry>
    <title>Centos7 安装分布式文件存储—fastDFS（单机）</title>
    <link href="https://chensir.ink/2021/06/06/Centos7-%E5%AE%89%E8%A3%85%E5%88%86%E5%B8%83%E5%BC%8F%E6%96%87%E4%BB%B6%E5%AD%98%E5%82%A8%E2%80%94fastDFS%EF%BC%88%E5%8D%95%E6%9C%BA%EF%BC%89/"/>
    <id>https://chensir.ink/2021/06/06/Centos7-%E5%AE%89%E8%A3%85%E5%88%86%E5%B8%83%E5%BC%8F%E6%96%87%E4%BB%B6%E5%AD%98%E5%82%A8%E2%80%94fastDFS%EF%BC%88%E5%8D%95%E6%9C%BA%EF%BC%89/</id>
    <published>2021-06-06T02:21:33.000Z</published>
    <updated>2025-11-26T14:04:32.723Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>FastDFS 支持集群部署，这里我仅仅使用一台虚拟机来进行测试，会对集群部署的点进行讲解（Nginx、单点 Tracker Server、单点 Storage Server 进行安装）。我会先安装 Nginx，然后安装单点 Tracker Server、单点 Storage Server ，最后整合 FastDFS-Nginx-Module。</p></blockquote><ul><li><p>服务器：centos7</p></li><li><p>Nginx：nginx-1.12.2</p></li><li><p>FastDFS：FastDFS_v5.05</p></li><li><p>FastDFS-Nginx-Module：fastdfs-nginx-module_v1.16</p></li><li><p>libfastcommon：libfastcommonV1.0.7</p><p>资源下载：<a href="https://pan.baidu.com/s/1X2fgZyWfgcV5kaweUYZk3A">百度网盘链接</a> algl</p></li></ul><p>将下载好的资源 上传到服务器</p><h1 id="安装Nginx"><a href="#安装Nginx" class="headerlink" title="安装Nginx"></a>安装Nginx</h1><p>详见<a href="https://chensir.ink/d05a05edcbf3/">《Centos7 离线安装Nginx及配置HTTPS》</a> </p><h1 id="FastDFS安装"><a href="#FastDFS安装" class="headerlink" title="FastDFS安装"></a>FastDFS安装</h1><h2 id="安装依赖库"><a href="#安装依赖库" class="headerlink" title="安装依赖库"></a>安装依赖库</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">yum install gcc-c++</span><br><span class="line">yum -y install libevent</span><br></pre></td></tr></table></figure><h2 id="安装-libfastcommon"><a href="#安装-libfastcommon" class="headerlink" title="安装 libfastcommon"></a>安装 libfastcommon</h2><p>libfastcommon 是 FastDFS 官方提供的，libfastcommon 包含了 FastDFS 运行所需要的一些基础库。该库上面我有提供下载地址。</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">tar -zxvf libfastcommonV1.0.7.tar.gz</span><br><span class="line">cd libfastcommon-1.0.7/</span><br><span class="line">./make.sh</span><br><span class="line">./make.sh install</span><br></pre></td></tr></table></figure><p>注意：libfastcommon 安装好后会自动将库文件拷贝至 &#x2F;usr&#x2F;lib64 下，由于 FastDFS 程序引用usr&#x2F;lib 目录所以需要将 &#x2F;usr&#x2F;lib64 下的库文件拷贝至 &#x2F;usr&#x2F;lib 下。</p><h2 id="编译并安装"><a href="#编译并安装" class="headerlink" title="编译并安装"></a>编译并安装</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 解压</span><br><span class="line">tar -zxvf FastDFS_v5.05.tar.gz</span><br><span class="line">cd FastDFS</span><br><span class="line"># make</span><br><span class="line">./make.sh</span><br><span class="line">./make.sh install</span><br></pre></td></tr></table></figure><p>安装成功将安装目录下的 conf 下的文件拷贝到 &#x2F;etc&#x2F;fdfs&#x2F; 下：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cp -a conf/* /etc/fdfs/</span><br></pre></td></tr></table></figure><h2 id="配置Tracker"><a href="#配置Tracker" class="headerlink" title="配置Tracker"></a>配置Tracker</h2><p>先创建 FastDFS目录：(修改配置文件时需要该目录)</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">mkdir -p /home/FastDFS</span><br></pre></td></tr></table></figure><p>修改 tracker.conf   <code>vi /etc/fdfs/tracker.conf</code></p><p>修改内容如下</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">base_path=/home/yuqing/FastDFS 改为：base_path=/home/FastDFS</span><br><span class="line">http.server_port=8080 改为 http.server_port=80</span><br></pre></td></tr></table></figure><h2 id="启动Tracker"><a href="#启动Tracker" class="headerlink" title="启动Tracker"></a>启动Tracker</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 启动命令</span><br><span class="line">/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart</span><br><span class="line"></span><br><span class="line"># 查看是否启动</span><br><span class="line">ps -ef | grep fdfs</span><br></pre></td></tr></table></figure><h2 id="配置Storage"><a href="#配置Storage" class="headerlink" title="配置Storage"></a>配置Storage</h2><p>创建文件存储目录fdfs_storage</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">mkdir -p /home/FastDFS/fdfs_storage</span><br></pre></td></tr></table></figure><p>修改storage.conf  <code>vi /etc/fdfs/storage.conf</code></p><p>修改内容如下：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">group_name=group1</span><br><span class="line">base_path=/home/yuqing/FastDFS 改为 base_path=/home/FastDFS</span><br><span class="line"></span><br><span class="line">store_path0=/home/yuqing/FastDFS 改为store_path0=/home/FastDFS/fdfs_storage</span><br><span class="line">#如果有多个挂载磁盘则定义多个store_path，如下</span><br><span class="line">#store_path1=.....</span><br><span class="line">#store_path2=......</span><br><span class="line"></span><br><span class="line">tracker_server=192.168.1.217:22122   # 配置 Tracker 服务器:IP</span><br><span class="line">#如果有多个则配置多个 Tracker </span><br><span class="line">#tracker_server=192.168.1.218:22122</span><br><span class="line">#tracker_server=192.168.1.219:22122</span><br><span class="line"></span><br><span class="line">#配置http端口</span><br><span class="line">http.server_port=80</span><br></pre></td></tr></table></figure><h2 id="启动Storage"><a href="#启动Storage" class="headerlink" title="启动Storage"></a>启动Storage</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 启动命令</span><br><span class="line">/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart</span><br><span class="line"></span><br><span class="line"># 查看是否启动</span><br><span class="line">ps -ef | grep fdfs</span><br></pre></td></tr></table></figure><h2 id="上传图片测试"><a href="#上传图片测试" class="headerlink" title="上传图片测试"></a>上传图片测试</h2><p>将一张名为 picture.jpg 的图片上传到 &#x2F;root 目录下，使用这张图片进行上传图片测试。</p><p>FastDFS 安装成功可通过 &#x2F;usr&#x2F;bin&#x2F;fdfs_test 测试上传、下载等操作。这里我们需要修改 &#x2F;etc&#x2F;fdfs&#x2F;client.conf 配置文件：<code>vi /etc/fdfs/client.conf</code></p><p>修改内容如下：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">base_path=/home/yuqing/fastdfs 改为 base_path=/home/FastDFS</span><br><span class="line">tracker_server 改为 tracker_server=192.168.1.217:22122</span><br></pre></td></tr></table></figure><p>使用👇格式命令上传文件</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">#命令格式</span><br><span class="line">/usr/bin/fdfs_test 客户端配置文件地址  upload  上传文件</span><br><span class="line"></span><br><span class="line">#测试命令</span><br><span class="line">/usr/bin/fdfs_test /etc/fdfs/client.conf upload /root picture.jpg</span><br></pre></td></tr></table></figure><p>上传成功后会显示上传图片等信息，可以根据返回信息中提供文件信息去 &#x2F;home&#x2F;FastDFS&#x2F;fdfs_storage&#x2F; 目录下查看我们刚刚上传好的图片。至此说明 FastDFS 的单点 Tracker 和 单点 Storage 都已经安装成功了。</p><h2 id="配置FastDFS-Nginx-Module"><a href="#配置FastDFS-Nginx-Module" class="headerlink" title="配置FastDFS-Nginx-Module"></a>配置FastDFS-Nginx-Module</h2><p>我们已经安装和测试好了 FastDFS，但是如果我们上传的是图片，那我们如何在浏览器中查看图片呢？这个就需要结合 Nginx 来进行配置了，目前我们把 FastDFS 和 Nginx 都安装好了，那么还需要一个 FastDFS-Nginx-Module 模块来完成这个任务，接下来我们就一起来配置一下 FastDFS-Nginx-Module 模块。</p><h3 id="解压-fastdfs-nginx-module-v1-16-tar-gz，修改-config-文件路径"><a href="#解压-fastdfs-nginx-module-v1-16-tar-gz，修改-config-文件路径" class="headerlink" title="解压 fastdfs-nginx-module_v1.16.tar.gz，修改 config 文件路径"></a>解压 fastdfs-nginx-module_v1.16.tar.gz，修改 config 文件路径</h3><p>解压FastDFS-Nginx-Module：<code>tar -zxvf fastdfs-nginx-module_v1.16.tar.gz</code></p><p>进入安装目录下的 src 文件夹： cd fastdfs-nginx-module&#x2F;src&#x2F;</p><p>修改config: <code>vi config</code></p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">#将：</span><br><span class="line">CORE_INCS=&quot;$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/&quot;</span><br><span class="line">CORE_LIBS=&quot;$CORE_LIBS -L/usr/local/lib -lfastcommon -lfdfsclient&quot;</span><br><span class="line">#修改为：</span><br><span class="line">CORE_INCS=&quot;$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/&quot;</span><br><span class="line">CORE_LIBS=&quot;$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient&quot;</span><br><span class="line">#去掉了路径中的local</span><br></pre></td></tr></table></figure><h2 id="设置配置文件"><a href="#设置配置文件" class="headerlink" title="设置配置文件"></a>设置配置文件</h2><p>将 fastdfs-nginx-module&#x2F;src 下的 mod_fastdfs.conf 拷贝至 &#x2F;etc&#x2F;fdfs&#x2F; 下，并修改mod_fastdfs.conf 的内容</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cp mod_fastdfs.conf /etc/fdfs/</span><br><span class="line"></span><br><span class="line">vim /etc/fdfs/mod_fastdfs.conf</span><br><span class="line"></span><br><span class="line">#------------------------修改内容------------------------</span><br><span class="line">base_path=/home/FastDFS</span><br><span class="line"></span><br><span class="line">tracker_server=192.168.1.217:22122</span><br><span class="line">#如果有多台，继续配置即可，例如：tracker_server=192.168.1.218:22122</span><br><span class="line"></span><br><span class="line">url_have_group_name=true #url中包含group名称</span><br><span class="line"></span><br><span class="line">store_path0=/home/FastDFS/fdfs_storage   #指定文件存储路径</span><br><span class="line">#如果有多个，如下配置：store_path1=/home/FastDFS/fdfs_storage1</span><br><span class="line"></span><br><span class="line">#将 libfdfsclient.so 拷贝至 /usr/lib 下：</span><br><span class="line">cp /usr/lib64/libfdfsclient.so /usr/lib/</span><br><span class="line"></span><br><span class="line">#创建 nginx/client 目录</span><br><span class="line">mkdir -p /var/temp/nginx/client</span><br></pre></td></tr></table></figure><h3 id="添加-FastDFS-Nginx-Module-模块"><a href="#添加-FastDFS-Nginx-Module-模块" class="headerlink" title="添加 FastDFS-Nginx-Module 模块"></a>添加 FastDFS-Nginx-Module 模块</h3><p>配置完成后，然后进入 Nginx 安装目录，执行添加模块命令：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">#进入nginx安装目录</span><br><span class="line">cd /***/nginx-1.12.2 # ***对应的路径</span><br><span class="line"></span><br><span class="line">#执行添加模块命令</span><br><span class="line">./configure --add-module=/***/fastdfs-nginx-module/src</span><br><span class="line">make &amp;&amp; make install</span><br></pre></td></tr></table></figure><h3 id="修改-Nginx-配置文件，测试图片访问"><a href="#修改-Nginx-配置文件，测试图片访问" class="headerlink" title="修改 Nginx 配置文件，测试图片访问"></a>修改 Nginx 配置文件，测试图片访问</h3><p><code>vi /usr/local/nginx/conf/nginx.conf</code></p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">        listen       80;</span><br><span class="line">        server_name  192.168.1.217;</span><br><span class="line"></span><br><span class="line">        location /group1/M00/&#123;</span><br><span class="line">                root /home/FastDFS/fdfs_storage/data;</span><br><span class="line">                ngx_fastdfs_module;</span><br><span class="line">        &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="重启Nginx"><a href="#重启Nginx" class="headerlink" title="重启Nginx"></a>重启Nginx</h3><p><code>systemctl restart nginx.service</code></p><p>测试：之前测试FastDFS上传过一张图片，上传成功后返回图片地址，用浏览器打开看图片是否显示即可，至此 FastDFS-Nginx-Module 配置完成。如果访问不了，请在防火墙开启80端口的访问权限。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;FastDFS 支持集群部署，这里我仅仅使用一台虚拟机来进行测试，会对集群部署的点进行讲解（Nginx、单点 Tracker Server、单点 Storage Server 进行安装）。我会先安装 Nginx，然后安装单点 Tracker</summary>
        
      
    
    
    
    <category term="fastDFS" scheme="https://chensir.ink/categories/fastDFS/"/>
    
    
    <category term="fastDFS" scheme="https://chensir.ink/tags/fastDFS/"/>
    
  </entry>
  
  <entry>
    <title>Centos7 离线安装 MySQL5.7.31（tar包安装）</title>
    <link href="https://chensir.ink/2021/06/06/Centos7-%E7%A6%BB%E7%BA%BF%E5%AE%89%E8%A3%85-MySQL5-7-31-tar%E5%8C%85%E5%AE%89%E8%A3%85/"/>
    <id>https://chensir.ink/2021/06/06/Centos7-%E7%A6%BB%E7%BA%BF%E5%AE%89%E8%A3%85-MySQL5-7-31-tar%E5%8C%85%E5%AE%89%E8%A3%85/</id>
    <published>2021-06-06T02:20:58.000Z</published>
    <updated>2025-11-26T14:04:32.748Z</updated>
    
    <content type="html"><![CDATA[<h1 id="单机版"><a href="#单机版" class="headerlink" title="单机版"></a>单机版</h1><h2 id="卸载自带MariaDB"><a href="#卸载自带MariaDB" class="headerlink" title="卸载自带MariaDB"></a>卸载自带MariaDB</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 查看系统自带的MariaDB</span><br><span class="line">[root@mysql_master ~]# rpm -qa |grep mariadb</span><br><span class="line"> mariadb-libs-5.5.56-2.el7.x86_64</span><br><span class="line"> </span><br><span class="line"># 卸载系统自带的MariaDB</span><br><span class="line">[root@mysql_master ~]# rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64</span><br><span class="line"></span><br><span class="line"># 删除 /etc/my.cnf配置文件</span><br><span class="line">[root@mysql_master ~]# rm -rf /etc/my.cnf</span><br><span class="line"></span><br><span class="line"># 检查MySQL是否存在</span><br><span class="line"># 执行下面的命令 没有返回值说明 MySQL不存在</span><br><span class="line">rpm -qa |grep mysql</span><br></pre></td></tr></table></figure><h2 id="创建MySQL用户组和用户"><a href="#创建MySQL用户组和用户" class="headerlink" title="创建MySQL用户组和用户"></a>创建MySQL用户组和用户</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 创建MySQL用户组和用户 并在/home文件加下 创建mysql用户主目录</span><br><span class="line">adduser mysql</span><br><span class="line"></span><br><span class="line"># 修改MySQL用户登录密码 按照提示输入两次密码即可</span><br><span class="line">passwd mysql</span><br></pre></td></tr></table></figure><h2 id="下载MySQL安装包"><a href="#下载MySQL安装包" class="headerlink" title="下载MySQL安装包"></a>下载MySQL安装包</h2><p>下载地址：<a href="https://dev.mysql.com/downloads/mysql/5.7.html#downloads">https://dev.mysql.com/downloads/mysql/5.7.html#downloads</a></p><p><img src="https://img.chensir.ink/chensir-pics/202206091126925.png" alt="mysq-v"></p><h2 id="上传MySQL安装包并解压"><a href="#上传MySQL安装包并解压" class="headerlink" title="上传MySQL安装包并解压"></a>上传MySQL安装包并解压</h2><p>上传刚下载的 mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz 到服务器 <code>/usr/local/mysql</code> 目录下 并解压</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">tar -zxvf /usr/local/mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz</span><br></pre></td></tr></table></figure><p>解压之后的文件名不够优雅修改一下：<code>mv /usr/local/mysql-5.7.31-linux-glibc2.12-x86_64 mysql</code></p><h2 id="修改配置文件"><a href="#修改配置文件" class="headerlink" title="修改配置文件"></a>修改配置文件</h2><p>新建my.cnf：<code>vi /etc/my.cnf</code></p><p>编辑内容如下：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[mysql]</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">设置mysql客户端默认字符集</span></span><br><span class="line">default-character-set=utf8</span><br><span class="line"></span><br><span class="line">[mysqld]</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">设置3306端口</span></span><br><span class="line">port = 3306</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">设置mysql的安装目录</span></span><br><span class="line">basedir=/usr/local/mysql</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">设置mysql数据库的数据的存放目录</span></span><br><span class="line">datadir=/usr/local/mysql/data</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">允许最大连接数</span></span><br><span class="line">max_connections=200</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">服务端使用的字符集默认为8比特编码的latin1字符集</span></span><br><span class="line">character-set-server=utf8</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建新表时将使用的默认存储引擎</span></span><br><span class="line">default-storage-engine=INNODB</span><br><span class="line">lower_case_table_names=1</span><br><span class="line">max_allowed_packet=16M</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">开启binlog</span></span><br><span class="line">server-id = 1</span><br><span class="line">log-bin=/usr/local/mysql/log/mysql-bin</span><br><span class="line"></span><br><span class="line">explicit_defaults_for_timestamp=true</span><br><span class="line">pid-file = /usr/local/mysql/mysql.pid</span><br><span class="line">log_error = /usr/local/mysql/log/error.log</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">跳过mysql密码验证</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">skip-grant-tables</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">解决mysql版本导致的sql_model=only_full_group_by问题</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION</span></span><br><span class="line">[mysql.server]</span><br><span class="line">user=mysql</span><br></pre></td></tr></table></figure><h2 id="创建配置文件中涉及到的目录"><a href="#创建配置文件中涉及到的目录" class="headerlink" title="创建配置文件中涉及到的目录"></a>创建配置文件中涉及到的目录</h2><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建mysql数据库的数据的存放目录 data</span></span><br><span class="line">mkdir -p /usr/local/mysql/data</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建mysql记录日志的文件夹 <span class="built_in">log</span></span></span><br><span class="line">mkdir -p /usr/local/mysql/log</span><br></pre></td></tr></table></figure><h2 id="更改Mysql目录所属用户"><a href="#更改Mysql目录所属用户" class="headerlink" title="更改Mysql目录所属用户"></a>更改Mysql目录所属用户</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 变更mysql目录所属用户为 mysql</span><br><span class="line">chown mysql:mysql -R /usr/local/mysql</span><br></pre></td></tr></table></figure><h2 id="执行安装命令"><a href="#执行安装命令" class="headerlink" title="执行安装命令"></a>执行安装命令</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 执行mysql安装命令 执行之后会有警告 不影响继续安装</span><br><span class="line">/usr/local/mysql/bin/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/</span><br></pre></td></tr></table></figure><h2 id="软链接"><a href="#软链接" class="headerlink" title="软链接"></a>软链接</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 拷贝软链接</span></span><br><span class="line"><span class="built_in">cp</span> /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld</span><br><span class="line"></span><br><span class="line"><span class="comment"># 赋予可执行权限</span></span><br><span class="line"><span class="built_in">chmod</span> +x /etc/init.d/mysqld</span><br></pre></td></tr></table></figure><h2 id="启动服务"><a href="#启动服务" class="headerlink" title="启动服务"></a>启动服务</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">service mysqld start</span><br></pre></td></tr></table></figure><h2 id="设置开机自启"><a href="#设置开机自启" class="headerlink" title="设置开机自启"></a>设置开机自启</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># chkconfig命令主要用来更新（启动或停止）和查询系统服务的运行级信息</span><br><span class="line"># --level </span><br><span class="line"># 等级0表示：表示关机</span><br><span class="line"># 等级1表示：单用户模式</span><br><span class="line"># 等级2表示：无网络连接的多用户命令行模式</span><br><span class="line"># 等级3表示：有网络连接的多用户命令行模式</span><br><span class="line"># 等级4表示：不可用</span><br><span class="line"># 等级5表示：带图形界面的多用户模式</span><br><span class="line"># 等级6表示：重新启动</span><br><span class="line"># on 开 ， off 关 ，系统默认只对 3，4，5等级有效，reset 重置服务的启动信息 对所有运行级有效</span><br><span class="line"># --add 增加所指定的系统服务，让chkconfig指令得以管理它，并同时在系统启动的叙述文件内增加相关数据。</span><br><span class="line"># --del 删除所指定的系统服务，不再由chkconfig指令管理，并同时在系统启动的叙述文件内删除相关数据。</span><br><span class="line"></span><br><span class="line">chkconfig --level 35 mysqld on</span><br><span class="line">chmod +x /etc/rc.d/init.d/mysqld</span><br><span class="line"># 加所指定的系统服务</span><br><span class="line">chkconfig --add mysqld</span><br><span class="line"># 查看mysql的运行状态</span><br><span class="line">service mysqld status</span><br></pre></td></tr></table></figure><h2 id="配置环境变量"><a href="#配置环境变量" class="headerlink" title="配置环境变量"></a>配置环境变量</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 编辑 /etc/profie文件</span><br><span class="line">vi /etc/profile</span><br><span class="line"></span><br><span class="line"># 添加内容如下</span><br><span class="line">#set mysql environment</span><br><span class="line">export PATH=$PATH:/usr/local/mysql/bin</span><br><span class="line"></span><br><span class="line"># 使其生效</span><br><span class="line">source /etc/profile</span><br></pre></td></tr></table></figure><h2 id="获取数据库初始密码"><a href="#获取数据库初始密码" class="headerlink" title="获取数据库初始密码"></a>获取数据库初始密码</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cat /root/.mysql_secret</span><br></pre></td></tr></table></figure><h2 id="修改密码"><a href="#修改密码" class="headerlink" title="修改密码"></a>修改密码</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 登录mysql服务 输入密码进入</span><br><span class="line">mysql -uroot -p</span><br><span class="line"></span><br><span class="line"># 修改用户名密码为 123456</span><br><span class="line">set PASSWORD = PASSWORD(&#x27;123456&#x27;);</span><br><span class="line"></span><br><span class="line"># 刷新 使其生效</span><br><span class="line">flush privileges;</span><br></pre></td></tr></table></figure><h2 id="配置访问权限"><a href="#配置访问权限" class="headerlink" title="配置访问权限"></a>配置访问权限</h2><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">选择mysql数据库</span></span><br><span class="line">use mysql;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">修改 user表中 root用户 host字段值为 % “%”代表任意机器可以访问该数据库</span></span><br><span class="line">update user set host=&#x27;%&#x27; where user=&#x27;root&#x27;;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查一下修改是否成功</span></span><br><span class="line">select host,user from user;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">以下结果说明 修改成功</span></span><br><span class="line">+-----------+---------------+</span><br><span class="line">| host      | user          |</span><br><span class="line">+-----------+---------------+</span><br><span class="line">| %         | root          |</span><br><span class="line">| localhost | mysql.session |</span><br><span class="line">| localhost | mysql.sys     |</span><br><span class="line">+-----------+---------------+</span><br><span class="line">3 rows in set (0.00 sec)</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">刷新 使修改生效</span></span><br><span class="line">flush privileges;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看是否开启 binlog:</span></span><br><span class="line">show variables like &#x27;%log_bin%&#x27;;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">以下结果 binlog开启</span></span><br><span class="line">+---------------------------------+--------------------------------------+</span><br><span class="line">| Variable_name                   | Value                                |</span><br><span class="line">+---------------------------------+--------------------------------------+</span><br><span class="line">| log_bin                         | ON                                   |</span><br><span class="line">| log_bin_basename                | /usr/local/mysql/log/mysql-bin       |</span><br><span class="line">| log_bin_index                   | /usr/local/mysql/log/mysql-bin.index |</span><br><span class="line">| log_bin_trust_function_creators | OFF                                  |</span><br><span class="line">| log_bin_use_v1_row_events       | OFF                                  |</span><br><span class="line">| sql_log_bin                     | ON                                   |</span><br><span class="line">+---------------------------------+--------------------------------------+</span><br></pre></td></tr></table></figure><p><strong>至此数据库安装完成！</strong></p><h2 id="忘记密码"><a href="#忘记密码" class="headerlink" title="忘记密码"></a>忘记密码</h2><h3 id="修改配置文件-1"><a href="#修改配置文件-1" class="headerlink" title="修改配置文件"></a>修改配置文件</h3><p>增加跳过密码验证的配置</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 修改配置文件 vi /etc/my.cnf</span><br><span class="line"></span><br><span class="line"># 跳过mysql密码验证</span><br><span class="line">skip-grant-tables</span><br></pre></td></tr></table></figure><h3 id="重启Mysql服务"><a href="#重启Mysql服务" class="headerlink" title="重启Mysql服务"></a>重启Mysql服务</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">service mysqld restart</span><br></pre></td></tr></table></figure><h3 id="登录mysql修改密码"><a href="#登录mysql修改密码" class="headerlink" title="登录mysql修改密码"></a>登录mysql修改密码</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 1.登录mysql服务 </span><br><span class="line">mysql -uroot -p</span><br><span class="line"></span><br><span class="line"># 2.提示输入密码 直接回车即可</span><br><span class="line"></span><br><span class="line"># 3.执行刷新 (如果不执行刷新直接修改密码 会提示错误)</span><br><span class="line">flush privileges;</span><br><span class="line"></span><br><span class="line"># 4.修改root用户密码</span><br><span class="line">ALTER USER &#x27;root&#x27;@&#x27;localhost&#x27; IDENTIFIED BY &#x27;123456&#x27;;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;单机版&quot;&gt;&lt;a href=&quot;#单机版&quot; class=&quot;headerlink&quot; title=&quot;单机版&quot;&gt;&lt;/a&gt;单机版&lt;/h1&gt;&lt;h2 id=&quot;卸载自带MariaDB&quot;&gt;&lt;a href=&quot;#卸载自带MariaDB&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="MySQL5.7" scheme="https://chensir.ink/categories/MySQL5-7/"/>
    
    
    <category term="安装MySQL5.7" scheme="https://chensir.ink/tags/%E5%AE%89%E8%A3%85MySQL5-7/"/>
    
  </entry>
  
</feed>
