<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>浅小兮</title>
  
  <subtitle>多喜乐，常安宁</subtitle>
  <link href="http://zxwlove.xyz/atom.xml" rel="self"/>
  
  <link href="http://zxwlove.xyz/"/>
  <updated>2025-03-09T12:46:36.443Z</updated>
  <id>http://zxwlove.xyz/</id>
  
  <author>
    <name>浅小兮</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Docker命令-卷命令</title>
    <link href="http://zxwlove.xyz/posts/docker10.html"/>
    <id>http://zxwlove.xyz/posts/docker10.html</id>
    <published>2025-04-20T02:10:10.000Z</published>
    <updated>2025-03-09T12:46:36.443Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><h1>docker volume 命令</h1><hr><p><code>docker volume</code> 命令用于管理 Docker 卷（volume）。卷是用于持久化数据的文件系统，可以在容器之间共享和重用。通过使用卷，数据可以在容器停止或删除时仍然保留。</p><h3 id="常用-docker-volume-命令">常用 <code>docker volume</code> 命令</h3><ol><li class="lvl-3"><p><code>docker volume ls</code>: 列出所有卷</p></li><li class="lvl-3"><p><code>docker volume inspect</code>: 查看卷的详细信息</p></li><li class="lvl-3"><p><code>docker volume create</code>: 创建一个新卷</p></li><li class="lvl-3"><p><code>docker volume rm</code>: 删除一个或多个卷</p></li><li class="lvl-3"><p><code>docker volume prune</code>: 删除未使用的卷</p></li></ol><h3 id="docker-volume-ls-命令"><code>docker volume ls</code> 命令</h3><p>列出所有卷。</p><p><code>docker volume ls</code></p><p>输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">DRIVER              VOLUME NAME</span><br><span class="line">local               my_volume</span><br><span class="line">local               another_volume</span><br></pre></td></tr></table></figure><h3 id="docker-volume-inspect-命令">docker volume inspect 命令</h3><p>查看指定卷的详细信息。</p><p><code>docker volume inspect my_volume</code></p><p>输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">[</span><br><span class="line">    &#123;</span><br><span class="line">        &quot;CreatedAt&quot;: &quot;2024-07-23T00:00:00Z&quot;,</span><br><span class="line">        &quot;Driver&quot;: &quot;local&quot;,</span><br><span class="line">        &quot;Labels&quot;: &#123;&#125;,</span><br><span class="line">        &quot;Mountpoint&quot;: &quot;/var/lib/docker/volumes/my_volume/_data&quot;,</span><br><span class="line">        &quot;Name&quot;: &quot;my_volume&quot;,</span><br><span class="line">        &quot;Options&quot;: &#123;&#125;,</span><br><span class="line">        &quot;Scope&quot;: &quot;local&quot;</span><br><span class="line">    &#125;</span><br><span class="line">]</span><br></pre></td></tr></table></figure><h3 id="docker-volume-create-命令">docker volume create 命令</h3><p>创建一个新卷。</p><p><code>docker volume create my_volume</code></p><p>常用参数</p><ul class="lvl-0"><li class="lvl-2"><p><code>--driver</code>: 指定卷驱动程序（默认为 <code>local</code>）。</p></li><li class="lvl-2"><p><code>--label</code>: 为卷添加标签。</p></li><li class="lvl-2"><p><code>-o, --opt</code>: 为卷指定驱动程序选项。</p></li></ul><p>示例：</p><p><code>docker volume create --name my_volume --label project=my_project</code></p><h3 id="docker-volume-rm-命令">docker volume rm 命令</h3><p>删除一个或多个卷。</p><p><code>docker volume rm my_volume</code></p><p>删除多个卷：</p><p><code>docker volume rm volume1 volume2</code></p><h3 id="docker-volume-prune-命令">docker volume prune 命令</h3><p>删除未使用的卷。</p><p><code>docker volume prune</code></p><h3 id="使用场景">使用场景</h3><ul class="lvl-0"><li class="lvl-2"><p>持久化数据: 卷用于持久化数据，即使容器被删除，数据仍然保留。</p></li><li class="lvl-2"><p>共享数据: 卷可以在多个容器之间共享数据。</p></li><li class="lvl-2"><p>备份和恢复: 卷可以用于备份和恢复容器数据。</p></li><li class="lvl-2"><p>分离数据和应用: 卷使数据和应用程序分离，便于管理和迁移。</p></li></ul><p><code>docker volume</code> 命令集提供了强大的数据管理功能，允许用户创建、配置和管理 Docker 卷。通过使用这些命令，用户可以实现数据的持久化、共享和备份，满足各种数据管理需求。</p>]]></content>
    
    
    <summary type="html">docker</summary>
    
    
    
    <category term="学习" scheme="http://zxwlove.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="笔记" scheme="http://zxwlove.xyz/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="学习" scheme="http://zxwlove.xyz/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="Docker" scheme="http://zxwlove.xyz/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Docker命令-网络命令</title>
    <link href="http://zxwlove.xyz/posts/docker09.html"/>
    <id>http://zxwlove.xyz/posts/docker09.html</id>
    <published>2025-04-01T02:10:10.000Z</published>
    <updated>2025-03-09T12:46:17.721Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><h1>docker network 命令</h1><hr><p><code>docker network</code> 命令用于管理 Docker 网络。这些命令可以创建、列出、删除和检查网络，帮助用户在 Docker 容器之间建立通信。</p><h3 id="常用-docker-network-命令">常用 <code>docker network</code> 命令</h3><ol><li class="lvl-3"><p><code>docker network ls</code>: 列出所有网络</p></li><li class="lvl-3"><p><code>docker network inspect</code>: 查看网络详细信息</p></li><li class="lvl-3"><p><code>docker network create</code>: 创建一个新网络</p></li><li class="lvl-3"><p><code>docker network rm</code>: 删除一个或多个网络</p></li><li class="lvl-3"><p><code>docker network connect</code>: 将一个容器连接到一个网络</p></li><li class="lvl-3"><p><code>docker network disconnect</code>: 将一个容器从一个网络断开</p></li></ol><h3 id="docker-network-ls-命令"><code>docker network ls</code> 命令</h3><p>列出所有网络。</p><p><code>docker network ls</code></p><p>输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">NETWORK ID          NAME                DRIVER              SCOPE</span><br><span class="line">b649b57f5bc5        bridge              bridge              local</span><br><span class="line">7e8c2d2c0b5a        host                host                local</span><br><span class="line">6a9c8d69bfb2        none                null                local</span><br></pre></td></tr></table></figure><h3 id="docker-network-inspect-命令"><code>docker network inspect</code> 命令</h3><p>查看指定网络的详细信息。</p><p>输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">[</span><br><span class="line">    &#123;</span><br><span class="line">        &quot;Name&quot;: &quot;my_network&quot;,</span><br><span class="line">        &quot;Id&quot;: &quot;b649b57f5bc5&quot;,</span><br><span class="line">        &quot;Created&quot;: &quot;2024-07-23T00:00:00.000000000Z&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;: &#123;&#125;,</span><br><span class="line">            &quot;Config&quot;: [</span><br><span class="line">                &#123;</span><br><span class="line">                    &quot;Subnet&quot;: &quot;172.18.0.0/16&quot;,</span><br><span class="line">                    &quot;Gateway&quot;: &quot;172.18.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;Containers&quot;: &#123;&#125;,</span><br><span class="line">        &quot;Options&quot;: &#123;&#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><h3 id="docker-network-create-命令"><code>docker network create</code> 命令</h3><p>创建一个新网络。</p><p><code>docker network create my_network</code></p><p>常用参数</p><ul class="lvl-0"><li class="lvl-2"><p><code>--driver</code>: 指定网络驱动程序（如 <code>bridge</code>、<code>host</code>、<code>overlay</code>）。</p></li><li class="lvl-2"><p><code>--subnet</code>: 指定子网。</p></li><li class="lvl-2"><p><code>--gateway</code>: 指定网关。</p></li><li class="lvl-2"><p><code>--ip-range</code>: 指定可用 IP 地址范围。</p></li><li class="lvl-2"><p><code>--ipv6</code>: 启用 IPv6。</p></li><li class="lvl-2"><p><code>--label</code>: 为网络添加标签。</p></li></ul><p>示例：</p><p><code>docker network create --driver bridge --subnet 192.168.1.0/24 my_network</code></p><h3 id="docker-network-rm-命令"><code>docker network rm</code> 命令</h3><p>删除一个或多个网络。</p><p><code>docker network rm my_network</code></p><p>删除多个网络：</p><p><code>docker network rm network1 network2</code></p><h3 id="docker-network-connect-命令"><code>docker network connect</code> 命令</h3><p>将一个容器连接到一个网络。</p><p><code>docker network connect my_network my_container</code></p><h3 id="docker-network-disconnect-命令"><code>docker network disconnect</code> 命令</h3><p>将一个容器从一个网络断开。</p><p><code>docker network disconnect my_network my_container</code></p><h3 id="使用场景">使用场景</h3><ul class="lvl-0"><li class="lvl-2"><p>容器间通信: 通过自定义网络，容器可以在不同主机上安全地相互通信。</p></li><li class="lvl-2"><p>隔离环境: 使用不同的网络来隔离容器环境，提高安全性。</p></li><li class="lvl-2"><p>高级网络配置: 使用桥接、覆盖等网络驱动程序实现复杂的网络拓扑结构。</p></li></ul><p><code>docker network</code> 命令集提供了强大的网络管理功能，允许用户创建、配置和管理 Docker 容器之间的网络连接。通过使用这些命令，用户可以实现容器之间的隔离、通信和网络配置，满足各种复杂的网络需求。</p>]]></content>
    
    
    <summary type="html">docker</summary>
    
    
    
    <category term="学习" scheme="http://zxwlove.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="笔记" scheme="http://zxwlove.xyz/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="学习" scheme="http://zxwlove.xyz/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="Docker" scheme="http://zxwlove.xyz/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Docker命令-Docker Compose</title>
    <link href="http://zxwlove.xyz/posts/docker08.html"/>
    <id>http://zxwlove.xyz/posts/docker08.html</id>
    <published>2025-03-28T02:10:10.000Z</published>
    <updated>2025-03-09T12:45:38.169Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><h1>docker compose run 命令</h1><hr><p>docker compose run 命令用于启动一个新容器并运行一个特定的服务，而不启动整个 Compose 文件中定义的所有服务。</p><p>docker compose run 命令允许你在单个服务上执行任务，如运行一次性命令或调试。</p><p>与 docker compose up 的区别在于，run 命令只会运行指定的服务，不会启动依赖它的其他服务。</p><h3 id="语法">语法</h3><p><code>docker compose run [OPTIONS] SERVICE [COMMAND] [ARGS...]</code></p><ul class="lvl-0"><li class="lvl-2"><p>SERVICE：Compose 文件中定义的服务名称。</p></li><li class="lvl-2"><p>COMMAND 和 ARGS：可选参数，指定要在容器内运行的命令及其参数。</p></li></ul><p>OPTIONS 选项：</p><ul class="lvl-0"><li class="lvl-2"><p><code>--rm</code>：运行后自动删除容器。</p></li><li class="lvl-2"><p><code>-d</code>：以分离模式运行容器。</p></li><li class="lvl-2"><p><code>-T</code>：禁用伪TTY。</p></li></ul><h3 id="实例">实例</h3><p>1、运行一个特定服务的命令</p><p><code>docker compose run web python manage.py migrate</code></p><p>这个命令将在 web 服务的容器中执行 python <a href="http://manage.py">manage.py</a> migrate 命令，而不启动其他服务。</p><p>2、自动删除容器</p><p><code>docker compose run --rm web bash</code></p><p>这个命令会运行 web 服务并启动一个 Bash 终端，任务完成后会删除容器。</p><p>docker compose run 非常适合用来在服务中执行一次性任务，而不影响其他服务的运行。</p><h1>docker compose rm 命令</h1><hr><p>docker compose rm 命令用于删除已停止的服务容器。</p><p>docker compose rm 命令不会删除运行中的容器，主要用于清理已停止或不再需要的容器，以释放系统资源。</p><h3 id="语法-2">语法</h3><p><code>docker compose rm [OPTIONS] [SERVICE...]</code></p><ul class="lvl-0"><li class="lvl-2"><p>SERVICE（可选）：要删除的服务容器的名称。如果不指定服务名称，将删除所有已停止的服务容器。</p></li></ul><p>OPTIONS 选项：</p><ul class="lvl-0"><li class="lvl-2"><p><code>-f, --force</code>：强制删除容器，而不提示用户确认。</p></li><li class="lvl-2"><p><code>-s, --stop</code>：首先停止正在运行的容器，然后删除它们。</p></li><li class="lvl-2"><p><code>-v, --volumes</code>：同时删除与容器关联的卷（volume）。</p></li></ul><h3 id="实例-2">实例</h3><p>1、删除所有已停止的服务容器</p><p><code>docker compose rm</code></p><p>会列出并提示是否删除所有停止的服务容器。</p><p>2、强制删除所有已停止的服务容器</p><p><code>docker compose rm -f</code></p><p>直接删除停止的容器，不会提示用户确认。</p><p>3、删除特定服务的已停止容器</p><p><code>docker compose rm web</code></p><p>仅删除 web 服务的已停止容器。</p><p>4、删除并清理相关卷</p><p><code>docker compose rm -v</code></p><p>删除已停止的容器并同时删除与之关联的卷。</p><h1>docker compose ps 命令</h1><hr><p>docker compose ps 命令用于列出与 Docker Compose 项目相关的容器及其状态。</p><p>docker compose ps 能显示当前项目中所有服务容器的运行状态、端口映射等信息。</p><h3 id="语法-3">语法</h3><p><code>docker compose ps [OPTIONS] [SERVICE...]</code></p><ul class="lvl-0"><li class="lvl-2"><p>SERVICE（可选）：指定要查看状态的服务名称。如果不指定，将列出所有服务的容器状态。</p></li></ul><p>OPTIONS 选项：</p><ul class="lvl-0"><li class="lvl-2"><p><code>-a, --all</code>：列出所有容器，包括已停止的容器。</p></li><li class="lvl-2"><p><code>-q, --quiet</code>：仅显示容器 ID，不显示其他信息。</p></li><li class="lvl-2"><p><code>--services</code>：仅列出服务名称，不显示容器的详细信息。</p></li><li class="lvl-2"><p><code>--filter</code>：根据条件过滤输出结果。例如，可以按照状态过滤容器。</p></li></ul><h3 id="输出信息">输出信息</h3><ul class="lvl-0"><li class="lvl-2"><p>Name：容器名称。</p></li><li class="lvl-2"><p>Command：容器中运行的命令。</p></li><li class="lvl-2"><p>State：容器的状态（如 Up、Exited）。</p></li><li class="lvl-2"><p>Ports：容器的端口映射。</p></li></ul><h3 id="实例-3">实例</h3><p>1、列出所有运行中的容器</p><p><code>docker compose ps</code></p><p>显示当前项目中正在运行的容器及其状态。</p><p>2、列出所有容器（包括已停止的容器）</p><p><code>docker compose ps -a</code></p><p>包括停止的容器在内，列出所有容器的状态。</p><p>3、仅显示容器 ID</p><p><code>docker compose ps -q</code></p><p>只返回容器的 ID，不包括其他详细信息。</p><p>4、列出所有服务的名称</p><p><code>docker compose ps --services</code></p><p>只显示服务名称，而不列出容器的详细信息。</p><p>5、根据状态过滤容器</p><p><code>docker compose ps --filter &quot;status=running&quot;</code></p><p>仅列出状态为&quot;running&quot;的容器。</p><h1>docker compose build 命令</h1><hr><p>docker compose build 命令用于根据 docker-compose.yml 文件中的定义，构建服务的镜像。</p><p>docker compose build 会从指定的 Dockerfile 或 build 上下文中构建镜像，并为所有服务准备好容器。</p><h3 id="语法-4">语法</h3><p><code>docker compose build [OPTIONS] [SERVICE...]</code></p><ul class="lvl-0"><li class="lvl-2"><p>SERVICE（可选）：指定要构建的服务名称。如果不指定，将为所有服务构建镜像。</p></li></ul><p>OPTIONS 选项：</p><ul class="lvl-0"><li class="lvl-2"><p><code>--no-cache</code>：在构建过程中不使用缓存层，强制从头开始构建镜像。</p></li><li class="lvl-2"><p><code>--pull</code>：始终尝试从注册表中拉取最新的基础镜像。</p></li><li class="lvl-2"><p><code>--build-arg</code>：传递构建时的变量（类似于 Docker 的 <code>--build-arg</code> 选项）。</p></li><li class="lvl-2"><p><code>--progress</code>：指定构建的进度样式（<code>auto</code>、<code>plain</code>、<code>tty</code>），影响显示的输出方式。</p></li><li class="lvl-2"><p><code>--parallel</code>：并行构建多个服务镜像以提高速度。</p></li><li class="lvl-2"><p><code>--no-rm</code>：构建失败时，保留中间容器（默认在成功或失败后都会删除中间容器）。</p></li></ul><h3 id="实例-4">实例</h3><p>1、为所有服务构建镜像</p><p><code>docker compose build</code></p><p>根据 docker-compose.yml 中的配置，为所有服务构建镜像。</p><p>2、构建特定服务的镜像</p><p><code>docker compose build web</code></p><p>仅为 web 服务构建镜像。</p><p>3、不使用缓存构建镜像</p><p><code>docker compose build --no-cache</code></p><p>强制 Docker 从头构建所有镜像，不使用之前构建的缓存层。</p><p>4、从最新基础镜像构建</p><p><code>docker compose build --pull</code></p><p>确保 Docker 拉取最新的基础镜像，而不是使用本地镜像。</p><p>5、传递构建变量</p><p><code>docker compose build --build-arg NODE_ENV=production</code></p><p>通过 --build-arg 传递构建时所需的变量，例如传递 NODE_ENV 环境变量。</p><h1>docker compose up 命令</h1><hr><p>docker compose up 命令用于启动 Docker Compose 项目中定义的所有服务容器，并确保它们按照 docker-compose.yml 文件中的配置运行。</p><p>docker compose up 命令不仅会启动服务，还会自动构建尚未构建的镜像（如有必要），创建网络和卷，并以容器的形式启动服务。</p><h3 id="语法-5">语法</h3><p><code>docker compose up [OPTIONS] [SERVICE...]</code></p><ul class="lvl-0"><li class="lvl-2"><p>SERVICE（可选）：可以指定一个或多个服务，仅启动这些服务。如果不指定，将启动所有服务。</p></li></ul><p>OPTIONS 选项：</p><ul class="lvl-0"><li class="lvl-2"><p><code>-d, --detach</code>：以后台模式运行容器，类似于在 <code>docker run</code> 中使用 <code>-d</code> 选项。</p></li><li class="lvl-2"><p><code>--build</code>：在启动之前强制重新构建镜像，即使镜像已存在。</p></li><li class="lvl-2"><p><code>--no-build</code>：阻止在启动时构建镜像，即使镜像不存在也不构建。</p></li><li class="lvl-2"><p><code>--force-recreate</code>：强制重新创建容器，即使它们已经存在且内容未发生变化。</p></li><li class="lvl-2"><p><code>--no-recreate</code>：如果容器已经存在，则不重新创建它们（默认行为是如果配置文件变化则重新创建）。</p></li><li class="lvl-2"><p><code>--remove-orphans</code>：移除不再在 Compose 文件中定义的孤立容器。</p></li><li class="lvl-2"><p><code>-V, --renew-anon-volumes</code>：重新创建匿名卷（删除旧的卷并创建新的）。</p></li></ul><h3 id="实例-5">实例</h3><p>1、启动所有服务并附加到控制台</p><p><code>docker compose up</code></p><p>启动 Compose 文件中定义的所有服务，并将日志输出显示在当前终端中。</p><p>2、在后台模式运行服务</p><p><code>docker compose up -d</code></p><p>以后台（分离）模式运行所有服务，终端不会输出服务的日志。</p><p>3、仅启动指定服务</p><p><code>docker compose up web</code></p><p>只启动 web 服务，而不启动其他服务。</p><p>4、启动服务并强制重建镜像</p><p><code>docker compose up --build</code></p><p>在启动服务之前，强制重新构建服务镜像。</p><p>5、启动服务并强制重新创建容器</p><p><code>docker compose up --force-recreate</code></p><p>强制重新创建服务容器，即使之前的容器存在且未发生更改。</p><p>6、启动服务并移除不再存在于 Compose 文件中的孤立容器</p><p><code>docker compose up --remove-orphans</code></p><p>移除任何不再在当前 docker-compose.yml 文件中定义的容器。</p><h1>docker compose ls 命令</h1><hr><p>docker compose ls 命令用于列出当前系统中所有 Docker Compose 项目及其状态。</p><p>docker compose ls 命令可以帮助你快速查看有哪些 Compose 项目正在运行或处于其他状态。</p><h3 id="语法-6">语法</h3><p><code>docker compose ls [OPTIONS]</code></p><p>OPTIONS 选项：</p><ul class="lvl-0"><li class="lvl-2"><p><code>--all</code>：显示所有项目，包括未启动的项目。</p></li><li class="lvl-2"><p><code>--filter</code>：根据条件过滤输出结果。例如，可以按状态过滤。</p></li><li class="lvl-2"><p><code>--format</code>：指定输出格式（如 <code>table</code>、<code>json</code> 等）。</p></li><li class="lvl-2"><p><code>--quiet</code>：只显示项目名称，而不显示其他信息。</p></li></ul><p>输出信息：</p><p><code>docker compose ls</code> 的输出信息包括以下字段：</p><ul class="lvl-0"><li class="lvl-2"><p>Name：项目名称。</p></li><li class="lvl-2"><p>Status：项目的状态（例如 <code>running</code>、<code>exited</code> 等）。</p></li><li class="lvl-2"><p>Config Files：与项目相关联的 <code>docker-compose.yml</code> 文件的路径。</p></li></ul><h3 id="实例-6">实例</h3><p>1、列出所有运行的 Docker Compose 项目</p><p><code>docker compose ls</code></p><p>显示当前正在运行的所有项目及其状态。</p><p>2、列出所有项目（包括未启动的）</p><p><code>docker compose ls --all</code></p><p>显示包括未启动的项目在内的所有 Compose 项目。</p><p>3、仅显示项目名称</p><p><code>docker compose ls --quiet</code></p><p>只返回项目名称，而不包括详细信息。</p><p>4、按状态过滤项目</p><p><code>docker compose ls --filter &quot;status=running&quot;</code></p><p>仅显示状态为 running 的项目。</p><h1>docker compose start 命令</h1><hr><p>docker compose start 命令用于启动已存在但目前处于停止状态的 Docker Compose 服务容器。</p><p>与 docker compose up 不同，它不会创建新的容器或重新构建镜像，只会启动已经创建但停止的容器。</p><h3 id="语法-7">语法</h3><p><code>docker compose start [SERVICE...]</code></p><ul class="lvl-0"><li class="lvl-2"><p>SERVICE（可选）：指定要启动的服务名称。如果不指定，将启动所有已停止的服务容器。</p></li></ul><h3 id="实例-7">实例</h3><p>1、启动所有已停止的服务</p><p><code>docker compose start</code></p><p>这将启动所有当前处于停止状态的容器。</p><p>2、启动特定服务</p><p><code>docker compose start web</code></p><p>仅启动 web 服务的容器，而不影响其他服务。</p><h1>docker compose restart 命令</h1><hr><p>docker compose restart 命令命令用于重启一个或多个服务。</p><p>与 docker compose restart 命令会停止正在运行的服务容器，然后重新启动它们。</p><p>如果你需要更新配置或者只是想简单地重启服务而不需要重建容器，那么 restart 是很有用的。</p><h3 id="语法-8">语法</h3><p><code>docker compose restart [SERVICE...]</code></p><ul class="lvl-0"><li class="lvl-2"><p>SERVICE（可选）：可以指定要重启的一个或多个服务名称。如果不指定服务名称，则会重启所有在 docker-compose.yml 文件中定义的服务。</p></li></ul><h3 id="实例-8">实例</h3><p>1、重启所有服务：</p><p><code>docker-compose restart</code></p><p>2、重启特定的服务（例如名为 web 和 db 的服务）：</p><p><code>docker-compose restart web db</code></p><p>确保你在包含 docker-compose.yml 文件的目录中执行这些命令，或者通过 -f 参数指定 docker-compose.yml 文件的位置。例如，如果你的 docker-compose.yml 文件不在当前目录下，你可以这样指定文件位置：</p><p><code>docker-compose -f /path/to/docker-compose.yml restart</code></p><p>这样做可以让你控制哪个 docker-compose.yml 文件被用来管理服务。</p>]]></content>
    
    
    <summary type="html">docker</summary>
    
    
    
    <category term="学习" scheme="http://zxwlove.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="笔记" scheme="http://zxwlove.xyz/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="学习" scheme="http://zxwlove.xyz/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="Docker" scheme="http://zxwlove.xyz/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Docker命令-info_version</title>
    <link href="http://zxwlove.xyz/posts/docker07.html"/>
    <id>http://zxwlove.xyz/posts/docker07.html</id>
    <published>2025-03-15T02:10:10.000Z</published>
    <updated>2025-03-09T12:45:21.340Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><h1>docker info 命令</h1><hr><p>docker info 命令用于显示 Docker 系统的详细信息，包括 Docker 版本、存储驱动、镜像数量、容器数量以及其他重要的配置信息。</p><p>docker info 命令非常有用，可以帮助用户了解 Docker 环境的总体状态。</p><h3 id="语法">语法</h3><p><code>docker info [OPTIONS]</code></p><h3 id="实例">实例</h3><p>查看docker系统信息。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line">$ docker info</span><br><span class="line">Client:</span><br><span class="line"> Context:    default</span><br><span class="line"> Debug Mode: false</span><br><span class="line"> Plugins:</span><br><span class="line">  buildx: Docker Buildx (Docker Inc., 0.8.1)</span><br><span class="line">  compose: Docker Compose (Docker Inc., 2.3.3)</span><br><span class="line"></span><br><span class="line">Server:</span><br><span class="line"> Containers: 3</span><br><span class="line">  Running: 1</span><br><span class="line">  Paused: 0</span><br><span class="line">  Stopped: 2</span><br><span class="line"> Images: 10</span><br><span class="line"> Server Version: 20.10.7</span><br><span class="line"> Storage Driver: overlay2</span><br><span class="line">  Backing Filesystem: extfs</span><br><span class="line">  Supports d_type: true</span><br><span class="line">  Native Overlay Diff: true</span><br><span class="line"> Logging Driver: json-file</span><br><span class="line"> Cgroup Driver: cgroupfs</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</span><br><span class="line">  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog</span><br><span class="line"> Swarm: inactive</span><br><span class="line"> Runtimes: runc</span><br><span class="line"> Default Runtime: runc</span><br><span class="line"> Init Binary: docker-init</span><br><span class="line"> containerd version: d71fcd7d8303cbf684402823e425e9dd2e99285d</span><br><span class="line"> runc version: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7</span><br><span class="line"> init version: de40ad0</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">  selinux</span><br><span class="line"> Kernel Version: 5.10.25-linuxkit</span><br><span class="line"> Operating System: Docker Desktop</span><br><span class="line"> OSType: linux</span><br><span class="line"> Architecture: x86_64</span><br><span class="line"> CPUs: 2</span><br><span class="line"> Total Memory: 1.942GiB</span><br><span class="line"> Name: docker-desktop</span><br><span class="line"> ID: 3WZ2:ZQ7K:6K4E:6ZCR:YITZ:GH2S:6NUB:HTB5:OS7K:AAUI:K7CC:JZL3</span><br><span class="line"> Docker Root Dir: /var/lib/docker</span><br><span class="line"> Debug Mode: true</span><br><span class="line">  File Descriptors: 45</span><br><span class="line">  Goroutines: 49</span><br><span class="line">  System Time: 2024-07-23T09:41:47.2527914Z</span><br><span class="line">  EventsListeners: 4</span><br><span class="line"> HTTP Proxy: http://proxy.example.com:80</span><br><span class="line"> HTTPS Proxy: https://proxy.example.com:443</span><br><span class="line"> No Proxy: localhost,127.0.0.1,docker-registry.example.com</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"> Registry Mirrors:</span><br><span class="line"> Live Restore Enabled: false</span><br><span class="line"></span><br><span class="line">WARNING: No swap limit support</span><br></pre></td></tr></table></figure><h3 id="输出解释">输出解释</h3><p>Client: Docker 客户端的相关信息。</p><ul class="lvl-0"><li class="lvl-2"><p><code>Context</code>: 当前 Docker 上下文。</p></li><li class="lvl-2"><p><code>Debug Mode</code>: 客户端是否开启调试模式。</p></li><li class="lvl-2"><p><code>Plugins</code>: 安装的客户端插件，如 <code>buildx</code> 和 <code>compose</code>。</p></li></ul><p>Server: Docker 服务端（守护进程）的相关信息。</p><ul class="lvl-0"><li class="lvl-2"><p><code>Containers</code>: 容器的总数。</p><ul class="lvl-2"><li class="lvl-6"><code>Running</code>: 运行中的容器数量。</li><li class="lvl-6"><code>Paused</code>: 暂停中的容器数量。</li><li class="lvl-6"><code>Stopped</code>: 停止的容器数量。</li></ul></li><li class="lvl-2"><p><code>Images</code>: 镜像的总数。</p></li><li class="lvl-2"><p><code>Server Version</code>: Docker 服务端的版本号。</p></li><li class="lvl-2"><p><code>Storage Driver</code>: 使用的存储驱动（如 <code>overlay2</code>）。</p></li><li class="lvl-2"><p><code>Backing Filesystem</code>: 后端文件系统类型。</p></li><li class="lvl-2"><p><code>Supports d_type</code>: 是否支持 <code>d_type</code>。</p></li><li class="lvl-2"><p><code>Native Overlay Diff</code>: 是否支持原生 Overlay 文件系统。</p></li><li class="lvl-2"><p><code>Logging Driver</code>: 使用的日志驱动（如 <code>json-file</code>）。</p></li><li class="lvl-2"><p><code>Cgroup Driver</code>: 使用的 Cgroup 驱动（如 <code>cgroupfs</code>）。</p></li><li class="lvl-2"><p><code>Cgroup Version</code>: Cgroup 的版本（如 <code>1</code>）。</p></li><li class="lvl-2"><p><code>Plugins</code>: 服务端插件列表，包括卷、网络和日志插件。</p></li><li class="lvl-2"><p><code>Swarm</code>: Swarm 模式的状态（如 <code>inactive</code>）。</p></li><li class="lvl-2"><p><code>Runtimes</code>: 支持的运行时（如 <code>runc</code>）。</p></li><li class="lvl-2"><p><code>Default Runtime</code>: 默认运行时（如 <code>runc</code>）。</p></li><li class="lvl-2"><p><code>Init Binary</code>: 初始化二进制文件（如 <code>docker-init</code>）。</p></li><li class="lvl-2"><p><code>containerd version</code>: 使用的 <code>containerd</code> 版本。</p></li><li class="lvl-2"><p><code>runc version</code>: 使用的 <code>runc</code> 版本。</p></li><li class="lvl-2"><p><code>init version</code>: 使用的 <code>init</code> 版本。</p></li><li class="lvl-2"><p><code>Security Options</code>: 启用的安全选项（如 <code>seccomp</code> 和 <code>selinux</code>）。</p></li><li class="lvl-2"><p><code>Kernel Version</code>: 内核版本。</p></li><li class="lvl-2"><p><code>Operating System</code>: 操作系统名称。</p></li><li class="lvl-2"><p><code>OSType</code>: 操作系统类型（如 <code>linux</code>）。</p></li><li class="lvl-2"><p><code>Architecture</code>: 系统架构（如 <code>x86_64</code>）。</p></li><li class="lvl-2"><p><code>CPUs</code>: CPU 数量。</p></li><li class="lvl-2"><p><code>Total Memory</code>: 总内存。</p></li><li class="lvl-2"><p><code>Name</code>: Docker 主机名。</p></li><li class="lvl-2"><p><code>ID</code>: Docker 实例 ID。</p></li><li class="lvl-2"><p><code>Docker Root Dir</code>: Docker 根目录。</p></li><li class="lvl-2"><p><code>Debug Mode</code>: 服务端是否开启调试模式。</p><ul class="lvl-2"><li class="lvl-6"><code>File Descriptors</code>: 文件描述符数量。</li><li class="lvl-6"><code>Goroutines</code>: Goroutines 数量。</li><li class="lvl-6"><code>System Time</code>: 系统时间。</li><li class="lvl-6"><code>EventsListeners</code>: 事件监听器数量。</li></ul></li><li class="lvl-2"><p><code>HTTP Proxy</code>: 配置的 HTTP 代理。</p></li><li class="lvl-2"><p><code>HTTPS Proxy</code>: 配置的 HTTPS 代理。</p></li><li class="lvl-2"><p><code>No Proxy</code>: 不使用代理的地址列表。</p></li><li class="lvl-2"><p><code>Registry</code>: 使用的注册表地址。</p></li><li class="lvl-2"><p><code>Labels</code>: 配置的标签。</p></li><li class="lvl-2"><p><code>Experimental</code>: 是否启用了实验性功能。</p></li><li class="lvl-2"><p><code>Insecure Registries</code>: 配置的不安全注册表列表。</p></li><li class="lvl-2"><p><code>Registry Mirrors</code>: 注册表镜像列表。</p></li><li class="lvl-2"><p><code>Live Restore Enabled</code>: 是否启用了实时恢复功能。</p></li></ul><p>WARNING: 警告信息（如没有启用 swap 限制支持）。</p><h1>docker version 命令</h1><hr><p>docker version 命令用于显示 Docker 客户端和服务端的版本信息。</p><p>docker version 命令可以帮助你确认当前安装的 Docker 版本以及客户端和服务器的详细版本信息。</p><p>另外还有一个 <font style="color:rgb(51, 51, 51);background-color:rgb(236, 234, 230);">docker --version 命令是用于显示 Docker 的版本信息。</font></p><h3 id="语法-2">语法</h3><p><code>docker version [OPTIONS]</code></p><p>OPTIONS说明：</p><ul class="lvl-0"><li class="lvl-2"><p>-f :指定返回值的模板文件。</p></li></ul><h3 id="实例-2">实例</h3><p>显示 Docker 版本信息。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">$ docker version</span><br><span class="line">Client: Docker Engine - Community</span><br><span class="line"> Version:           20.10.7</span><br><span class="line"> API version:       1.41</span><br><span class="line"> Go version:        go1.13.15</span><br><span class="line"> Git commit:        f0df350</span><br><span class="line"> Built:             Wed Jun  2 11:57:37 2021</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.7</span><br><span class="line">  API version:      1.41 (minimum version 1.12)</span><br><span class="line">  Go version:       go1.13.15</span><br><span class="line">  Git commit:       b0f5bc3</span><br><span class="line">  Built:            Wed Jun  2 11:55:47 2021</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.4.6</span><br><span class="line">  GitCommit:        d71fcd7d8303cbf684402823e425e9dd2e99285d</span><br><span class="line"> runc:</span><br><span class="line">  Version:          1.0.0-rc95</span><br><span class="line">  GitCommit:        b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7</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><h3 id="输出解释-2">输出解释</h3><p>Client: Docker 客户端的相关信息。</p><ul class="lvl-0"><li class="lvl-2"><p><code>Version</code>: 客户端的版本号。</p></li><li class="lvl-2"><p><code>API version</code>: API 的版本号。</p></li><li class="lvl-2"><p><code>Go version</code>: 编译 Docker 客户端所用的 Go 语言版本。</p></li><li class="lvl-2"><p><code>Git commit</code>: 该版本对应的 Git 提交 ID。</p></li><li class="lvl-2"><p><code>Built</code>: 构建日期。</p></li><li class="lvl-2"><p><code>OS/Arch</code>: 操作系统和架构。</p></li><li class="lvl-2"><p><code>Context</code>: 当前 Docker 上下文。</p></li><li class="lvl-2"><p><code>Experimental</code>: 是否启用了实验性功能。</p></li></ul><p>Server: Docker 服务端（守护进程）的相关信息。</p><ul class="lvl-0"><li class="lvl-2"><p><code>Engine</code>:</p><ul class="lvl-2"><li class="lvl-6"><code>Version</code>: 服务端的版本号。</li><li class="lvl-6"><code>API version</code>: API 的版本号（以及支持的最低版本）。</li><li class="lvl-6"><code>Go version</code>: 编译 Docker 服务端所用的 Go 语言版本。</li><li class="lvl-6"><code>Git commit</code>: 该版本对应的 Git 提交 ID。</li><li class="lvl-6"><code>Built</code>: 构建日期。</li><li class="lvl-6"><code>OS/Arch</code>: 操作系统和架构。</li><li class="lvl-6"><code>Experimental</code>: 是否启用了实验性功能。</li></ul></li><li class="lvl-2"><p><code>containerd</code>: Docker 使用的 containerd 版本和 Git 提交 ID。</p></li><li class="lvl-2"><p><code>runc</code>: Docker 使用的 runc 版本和 Git 提交 ID。</p></li><li class="lvl-2"><p><code>docker-init</code>: Docker 使用的 docker-init 版本和 Git 提交 ID。</p></li></ul>]]></content>
    
    
    <summary type="html">docker</summary>
    
    
    
    <category term="学习" scheme="http://zxwlove.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="笔记" scheme="http://zxwlove.xyz/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="学习" scheme="http://zxwlove.xyz/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="Docker" scheme="http://zxwlove.xyz/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Docker命令-本地镜像管理</title>
    <link href="http://zxwlove.xyz/posts/docker06.html"/>
    <id>http://zxwlove.xyz/posts/docker06.html</id>
    <published>2025-03-03T02:10:10.000Z</published>
    <updated>2025-03-09T12:44:47.437Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><h1>Docker images 命令</h1><hr><p><code>docker images</code> 命令用于列出本地的 Docker 镜像。</p><p>通过 <code>docker images</code> 命令，用户可以查看所有已下载或构建的 Docker 镜像的详细信息，如仓库名称、标签、镜像 ID、创建时间和大小。</p><h3 id="语法">语法</h3><p><code>docker images [OPTIONS] [REPOSITORY[:TAG]]</code></p><p>OPTIONS 说明：</p><ul class="lvl-0"><li class="lvl-2"><p><code>-a, --all</code>: 显示所有镜像（包括中间层镜像）。</p></li><li class="lvl-2"><p><code>--digests</code>: 显示镜像的摘要信息。</p></li><li class="lvl-2"><p><code>-f, --filter</code>: 过滤输出，基于提供的条件。</p></li><li class="lvl-2"><p><code>--format</code>: 使用 Go 模板格式化输出。</p></li><li class="lvl-2"><p><code>--no-trunc</code>: 显示完整的镜像 ID。</p></li><li class="lvl-2"><p><code>-q, --quiet</code>: 只显示镜像 ID。</p></li></ul><p>列出所有本地镜像:</p><p><code>docker images</code></p><p>列出带有摘要信息的镜像:</p><p><code>docker images --digests</code></p><p>列出所有镜像（包括中间层镜像）:</p><p><code>docker images --all</code></p><p>使用过滤条件列出镜像:</p><p><code>docker images --filter &quot;dangling=true&quot;</code></p><p>只显示镜像 ID:</p><p><code>docker images --quiet</code></p><p>使用自定义格式输出:</p><p><code>docker images --format &quot;table &#123;&#123;.Repository&#125;&#125;\t&#123;&#123;.Tag&#125;&#125;\t&#123;&#123;.ID&#125;&#125;\t&#123;&#123;.Size&#125;&#125;&quot;</code></p><h3 id="实例">实例</h3><p>查看本地镜像列表:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">runoob@runoob:~$ docker images</span><br><span class="line">REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE</span><br><span class="line">mymysql                 v1                  37af1236adef        5 minutes ago       329 MB</span><br><span class="line">runoob/ubuntu           v4                  1c06aa18edee        2 days ago          142.1 MB</span><br><span class="line">&lt;none&gt;                  &lt;none&gt;              5c6e1090e771        2 days ago          165.9 MB</span><br><span class="line">httpd                   latest              ed38aaffef30        11 days ago         195.1 MB</span><br><span class="line">alpine                  latest              4e38e38c8ce0        2 weeks ago         4.799 MB</span><br><span class="line">mongo                   3.2                 282fd552add6        3 weeks ago         336.1 MB</span><br><span class="line">redis                   latest              4465e4bcad80        3 weeks ago         185.7 MB</span><br><span class="line">php                     5.6-fpm             025041cd3aa5        3 weeks ago         456.3 MB</span><br><span class="line">python                  3.5                 045767ddf24a        3 weeks ago         684.1 MB</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>列出本地镜像中 REPOSITORY 为 ubuntu的 镜像列表:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">root@runoob:~# docker images  ubuntu</span><br><span class="line">REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE</span><br><span class="line">ubuntu              14.04               90d5884b1ee0        9 weeks ago         188 MB</span><br><span class="line">ubuntu              15.10               4e3b13c8a266        3 months ago        136.3 MB</span><br></pre></td></tr></table></figure><p>带有摘要信息的输出:</p><p><code>docker images --digests</code></p><p>输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">REPOSITORY          TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZE</span><br><span class="line">ubuntu              latest              sha256:8c53f09a9c6f1e85e10a8ffb649dd9de28b9be4994e792bd96fca152527bba03   2d13d07a40a3        2 weeks ago         72.9MB</span><br><span class="line">nginx               stable              sha256:1c4f40db5d1c8e5e09d28e501ad167d7c2d91b8908f6f1d9c97d1c67c5f9a69b   5a34e9e5d33b        3 weeks ago         133MB</span><br><span class="line">hello-world         latest              sha256:feda4427b0b5d9d84545dcb38e736a5226e5bb6228c61b0b6b28cb7483a14b68   feb5d9fea6a5        4 weeks ago         13.3kB</span><br></pre></td></tr></table></figure><p>使用过滤条件输出:</p><p><code>docker images --filter &quot;dangling=true&quot;</code></p><p>示例输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE</span><br><span class="line">&lt;none&gt;              &lt;none&gt;              7db03500db4f        5 weeks ago         65.3MB</span><br></pre></td></tr></table></figure><p>自定义格式输出:</p><p><code>docker images --format &quot;table &#123;&#123;.Repository&#125;&#125;\t&#123;&#123;.Tag&#125;&#125;\t&#123;&#123;.ID&#125;&#125;\t&#123;&#123;.Size&#125;&#125;&quot;</code></p><p>输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">REPOSITORY          TAG                 IMAGE ID            SIZE</span><br><span class="line">ubuntu              latest              2d13d07a40a3        72.9MB</span><br><span class="line">nginx               stable              5a34e9e5d33b        133MB</span><br><span class="line">hello-world         latest              feb5d9fea6a5        13.3kB</span><br></pre></td></tr></table></figure><h3 id="常用场景">常用场景</h3><ul class="lvl-0"><li class="lvl-2"><p>管理镜像: 列出本地镜像，了解当前可用的镜像。</p></li><li class="lvl-2"><p>过滤镜像: 使用过滤选项查找特定条件的镜像，如悬空镜像（未打标签的镜像）。</p></li><li class="lvl-2"><p>镜像 ID 管理: 只获取镜像 ID 以便于后续操作，如删除镜像。</p></li></ul><p><code>docker images</code> 命令是 Docker 镜像管理中非常基础且重要的命令。通过该命令，用户可以查看本地所有镜像的详细信息，进行镜像的管理和维护。使用各种选项和格式，可以灵活地过滤和格式化输出，以满足不同的管理需求。</p><h1>Docker rmi 命令</h1><hr><p><code>docker rmi</code> 命令用于删除一个或多个 Docker 镜像。</p><p><code>docker rmi</code> 命令对于管理本地存储的镜像非常有用，帮助用户清理不再需要的镜像，释放存储空间。</p><h3 id="语法-2">语法</h3><p><code>docker rmi [OPTIONS] IMAGE [IMAGE...]</code></p><p>参数说明：</p><ul class="lvl-0"><li class="lvl-2"><p><code>IMAGE</code>: 要删除的镜像的名称或 ID。可以是镜像名、镜像 ID 或镜像摘要。</p></li><li class="lvl-2"><p><code>OPTIONS</code>: 可选参数，用来控制命令的行为。</p></li></ul><p>常用选项：</p><ul class="lvl-0"><li class="lvl-2"><p><code>-a</code>, <code>--all-tags</code>: 指定仓库名称时，删除该仓库下的所有镜像。</p></li><li class="lvl-2"><p><code>-f</code>, <code>--force</code>: 强制删除镜像，即使该镜像被容器使用。</p></li><li class="lvl-2"><p><code>--help</code>: 打印帮助信息并退出。</p></li><li class="lvl-2"><p><code>--no-prune</code>: 不删除悬空的父镜像。</p></li><li class="lvl-2"><p><code>-q</code>, <code>--quiet</code>: 安静模式，不显示删除镜像的详细信息。</p></li></ul><p>删除单个镜像</p><p><code>docker rmi ubuntu:latest</code></p><p>删除名为 ubuntu 的 latest 标签的镜像。</p><p>删除多个镜像</p><p><code>docker rmi ubuntu:latest nginx:latest</code></p><p>删除 ubuntu 和 nginx 的 latest 标签的镜像。</p><p>删除镜像的多个标签</p><p><code>docker rmi ubuntu:latest ubuntu:18.04</code></p><p>删除 ubuntu 镜像的 latest 和 18.04 标签。</p><p>删除所有标签的镜像</p><p><code>docker rmi -a ubuntu</code></p><p>删除 ubuntu 仓库下的所有镜像。</p><p>强制删除镜像</p><p><code>docker rmi -f ubuntu:latest</code></p><p>强制删除 ubuntu 的 latest 标签的镜像，即使它正在被使用。</p><p>删除悬空的镜像</p><p><code>docker rmi -d</code></p><p>删除所有没有标签的悬空镜像。</p><p>安静模式删除所有镜像</p><p><code>docker rmi -q $(docker images -q)</code></p><p>使用安静模式删除所有镜像，不显示删除的镜像信息。</p><p>删除指定仓库的所有镜像</p><p><code>docker rmi -a myrepo</code></p><p>删除 myrepo 仓库下的所有镜像。</p><p>删除镜像并保留其子镜像</p><p><code>docker rmi --no-prune ubuntu:latest</code></p><p>删除 ubuntu:latest 镜像，但保留其子镜像。</p><h3 id="实例-2">实例</h3><p>查看现有镜像：</p><p><code>docker images</code></p><p>输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE</span><br><span class="line">my_image            latest              d1e1b5a3a8a9        3 days ago          128MB</span><br><span class="line">my_image1           latest              c3a4f5a3a8b8        4 days ago          256MB</span><br><span class="line">my_image2           latest              a9e1d3a7c9b9        5 days ago          512MB</span><br></pre></td></tr></table></figure><p>删除一个镜像：</p><p><code>docker rmi my_image</code></p><p>输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Untagged: my_image:latest</span><br><span class="line">Deleted: sha256:d1e1b5a3a8a9...</span><br></pre></td></tr></table></figure><p>删除多个镜像：</p><p><code>docker rmi my_image1 my_image2</code></p><p>输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Untagged: my_image1:latest</span><br><span class="line">Deleted: sha256:c3a4f5a3a8b8...</span><br><span class="line">Untagged: my_image2:latest</span><br><span class="line">Deleted: sha256:a9e1d3a7c9b9...</span><br></pre></td></tr></table></figure><h3 id="常用场景-2">常用场景</h3><ul class="lvl-0"><li class="lvl-2"><p>清理无用镜像: 删除不再需要的镜像，以释放存储空间。</p></li><li class="lvl-2"><p>镜像管理: 管理和维护本地镜像库，确保只保留需要的镜像。</p></li><li class="lvl-2"><p>强制删除: 在镜像被容器使用时，强制删除它们（谨慎使用）。</p></li></ul><h3 id="注意事项">注意事项</h3><ul class="lvl-0"><li class="lvl-2"><p>强制删除镜像（使用 <code>-f</code> 选项）时，可能会导致依赖于该镜像的容器无法运行，因此应谨慎使用。</p></li><li class="lvl-2"><p>默认情况下，<code>docker rmi</code> 会删除未使用的父镜像，如果不希望这样做，可以使用 <code>--no-prune</code> 选项。</p></li></ul><p><code>docker rmi</code> 命令是 Docker 镜像管理中非常重要的工具。通过该命令，用户可以删除不再需要的镜像，释放存储空间，并保持本地镜像库的整洁。使用适当的选项，可以灵活地管理镜像的删除过程。</p><h1>Docker tag 命令</h1><hr><p><code>docker tag</code> 命令用于创建本地镜像的别名（tag），通过为镜像打标签，可以使用更容易记忆的名字或版本号来标识和管理镜像。</p><h3 id="语法-3">语法</h3><p><code>docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]</code></p><ul class="lvl-0"><li class="lvl-2"><p><code>SOURCE_IMAGE[:TAG]</code>: 源镜像名称和标签，标签默认为 <code>latest</code>。</p></li><li class="lvl-2"><p><code>TARGET_IMAGE[:TAG]</code>: 目标镜像名称和标签，标签默认为 <code>latest</code>。</p></li></ul><p>1、为镜像打标签</p><p><code>docker tag myimage:1.0 myrepo/myimage:latest</code></p><p>这会将本地 myimage:1.0 镜像标记为 myrepo/myimage:latest。</p><p>2、为镜像打多个标签</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">docker tag myimage:1.0 myrepo/myimage:stable</span><br><span class="line">docker tag myimage:1.0 myrepo/myimage:v1.0</span><br></pre></td></tr></table></figure><p>这会将 myimage:1.0 分别标记为 myrepo/myimage:stable 和 myrepo/myimage:v1.0。</p><p>3、为镜像打标签以推送到 Docker Hub</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">docker tag myimage:1.0 myusername/myimage:1.0</span><br><span class="line">docker push myusername/myimage:1.0</span><br></pre></td></tr></table></figure><p>这会将 myimage:1.0 镜像标记为 myusername/myimage:1.0 并推送到 Docker Hub。</p><hr><h2 id="实例-3">实例</h2><h3 id="为镜像打标签">为镜像打标签</h3><p>1、列出本地镜像</p><p><code>docker images</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">REPOSITORY          TAG       IMAGE ID       CREATED        SIZE</span><br><span class="line">myimage             1.0       123456789abc   2 days ago     500MB</span><br></pre></td></tr></table></figure><p>2、为镜像打标签</p><p><code>docker tag myimage:1.0 myrepo/myimage:latest</code></p><p>3、验证标签</p><p><code>docker images</code></p><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">REPOSITORY          TAG       IMAGE ID       CREATED        SIZE</span><br><span class="line">myimage             1.0       123456789abc   2 days ago     500MB</span><br><span class="line">myrepo/myimage      latest    123456789abc   2 days ago     500MB</span><br></pre></td></tr></table></figure><h3 id="注意事项-2">注意事项</h3><ul class="lvl-0"><li class="lvl-2"><p>标签只是镜像的别名，不会创建新的镜像层，因此不会占用额外的存储空间。</p></li><li class="lvl-2"><p>标签应该简洁且具有描述性，以便于识别和管理镜像版本。</p></li><li class="lvl-2"><p>在使用标签时，确保命名符合注册表的命名规范。</p></li></ul><p><code>docker tag</code> 命令是管理 Docker 镜像的重要工具，通过为镜像打标签，可以方便地标识、管理和发布不同版本的镜像。这个命令适用于各种场景，包括版本管理、镜像发布和镜像复制。在使用时，确保标签命名规范和描述性，以提高镜像管理的效率和可维护性。</p><h1>Docker build 命令</h1><hr><p><code>docker build</code> 命令用于从 Dockerfile 构建 Docker 镜像。</p><p><code>docker build</code> 命令通过读取 Dockerfile 中定义的指令，逐步构建镜像，并将最终结果保存到本地镜像库中。</p><h3 id="语法-4">语法</h3><p><code>docker build [OPTIONS] PATH | URL | -</code></p><ul class="lvl-0"><li class="lvl-2"><p><code>PATH</code>: 包含 Dockerfile 的目录路径或 <code>.</code>（当前目录）。</p></li><li class="lvl-2"><p><code>URL</code>: 指向包含 Dockerfile 的远程存储库地址（如 Git 仓库）。</p></li><li class="lvl-2"><p><code>-</code>: 从标准输入读取 Dockerfile。</p></li></ul><p>常用选项：</p><ul class="lvl-0"><li class="lvl-2"><p><code>-t, --tag</code>: 为构建的镜像指定名称和标签。</p></li><li class="lvl-2"><p><code>-f, --file</code>: 指定 Dockerfile 的路径（默认是 <code>PATH</code> 下的 <code>Dockerfile</code>）。</p></li><li class="lvl-2"><p><code>--build-arg</code>: 设置构建参数。</p></li><li class="lvl-2"><p><code>--no-cache</code>: 不使用缓存层构建镜像。</p></li><li class="lvl-2"><p><code>--rm</code>: 构建成功后删除中间容器（默认开启）。</p></li><li class="lvl-2"><p><code>--force-rm</code>: 无论构建成功与否，一律删除中间容器。</p></li><li class="lvl-2"><p><code>--pull</code>: 始终尝试从注册表拉取最新的基础镜像。</p></li></ul><p>更多选项说明：</p><ul class="lvl-0"><li class="lvl-2"><p><code>--build-arg=[]</code>: 设置构建镜像时的变量。</p></li><li class="lvl-2"><p><code>--cpu-shares</code>: 设置 CPU 使用权重。</p></li><li class="lvl-2"><p><code>--cpu-period</code>: 限制 CPU CFS 周期。</p></li><li class="lvl-2"><p><code>--cpu-quota</code>: 限制 CPU CFS 配额。</p></li><li class="lvl-2"><p><code>--cpuset-cpus</code>: 指定可使用的 CPU ID。</p></li><li class="lvl-2"><p><code>--cpuset-mems</code>: 指定可使用的内存节点 ID。</p></li><li class="lvl-2"><p><code>--disable-content-trust</code>: 忽略内容信任验证（默认启用）。</p></li><li class="lvl-2"><p><code>-f</code>: 指定 Dockerfile 的路径。</p></li><li class="lvl-2"><p><code>--force-rm</code>: 强制在构建过程中删除中间容器。</p></li><li class="lvl-2"><p><code>--isolation</code>: 使用指定的容器隔离技术。</p></li><li class="lvl-2"><p><code>--label=[]</code>: 设置镜像的元数据。</p></li><li class="lvl-2"><p><code>-m</code>: 设置内存的最大值。</p></li><li class="lvl-2"><p><code>--memory-swap</code>: 设置交换空间的最大值（内存 + 交换空间），<code>-1</code> 表示不限制交换空间。</p></li><li class="lvl-2"><p><code>--no-cache</code>: 构建镜像时不使用缓存。</p></li><li class="lvl-2"><p><code>--pull</code>: 尝试拉取基础镜像的最新版本。</p></li><li class="lvl-2"><p><code>--quiet, -q</code>: 安静模式，构建成功后只输出镜像 ID。</p></li><li class="lvl-2"><p><code>--rm</code>: 构建成功后删除中间容器（默认启用）。</p></li><li class="lvl-2"><p><code>--shm-size</code>: 设置 <code>/dev/shm</code> 的大小，默认值为 64M。</p></li><li class="lvl-2"><p><code>--ulimit</code>: 设置 Ulimit 配置。</p></li><li class="lvl-2"><p><code>--squash</code>: 将 Dockerfile 中所有步骤压缩为一层。</p></li><li class="lvl-2"><p><code>--tag, -t</code>: 为镜像指定名称和标签，格式为 <code>name:tag</code> 或 <code>name</code>；可以在一次构建中为一个镜像设置多个标签。</p></li><li class="lvl-2"><p><code>--network</code>: 在构建期间设置 <code>RUN</code> 指令的网络模式，默认值为 <code>default</code>。</p></li></ul><p>1、构建镜像</p><p><code>docker build -t myimage:latest .</code></p><p>这会从当前目录读取 Dockerfile 并构建一个名为 myimage:latest 的镜像。</p><p>2、指定 Dockerfile 路径</p><p><code>docker build -f /path/to/Dockerfile -t myimage:latest .</code></p><p>这会从 /path/to/ 目录读取 Dockerfile 并构建一个名为 myimage:latest 的镜像。</p><p>3、设置构建参数</p><p><code>docker build --build-arg HTTP_PROXY=[http://proxy.example.com](http://proxy.example.com) -t myimage:latest .</code></p><p>这会在构建过程中使用 HTTP_PROXY 环境变量。</p><p>4、不使用缓存层构建镜像</p><p><code>docker build --no-cache -t myimage:latest .</code></p><p>这会在构建镜像时忽略所有缓存层，确保每一步都重新执行。</p><h3 id="实例-使用-Dockerfile-构建镜像">实例 - 使用 Dockerfile 构建镜像</h3><p>1、创建 Dockerfile，内容如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line"># Dockerfile 示例</span><br><span class="line">FROM ubuntu:20.04</span><br><span class="line">LABEL maintainer=&quot;yourname@example.com&quot;</span><br><span class="line">RUN apt-get update &amp;&amp; apt-get install -y nginx</span><br><span class="line">COPY index.html /var/www/html/index.html</span><br><span class="line">CMD [&quot;nginx&quot;, &quot;-g&quot;, &quot;daemon off;&quot;]</span><br></pre></td></tr></table></figure><p>2、构建镜像</p><p><code>docker build -t mynginx:latest .</code></p><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">Sending build context to Docker daemon  3.072kB</span><br><span class="line">Step 1/5 : FROM ubuntu:20.04</span><br><span class="line">20.04: Pulling from library/ubuntu</span><br><span class="line">...</span><br><span class="line">Step 2/5 : LABEL maintainer=&quot;yourname@example.com&quot;</span><br><span class="line">...</span><br><span class="line">Step 3/5 : RUN apt-get update &amp;&amp; apt-get install -y nginx</span><br><span class="line">...</span><br><span class="line">Step 4/5 : COPY index.html /var/www/html/index.html</span><br><span class="line">...</span><br><span class="line">Step 5/5 : CMD [&quot;nginx&quot;, &quot;-g&quot;, &quot;daemon off;&quot;]</span><br><span class="line">...</span><br><span class="line">Successfully built 123456789abc</span><br><span class="line">Successfully tagged mynginx:latest</span><br></pre></td></tr></table></figure><p>3、验证镜像</p><p><code>docker images</code></p><p>输出示例：</p><h3 id="注意事项-3">注意事项</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">REPOSITORY   TAG       IMAGE ID       CREATED          SIZE</span><br><span class="line">mynginx      latest    123456789abc   10 minutes ago   200MB</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>确保 Dockerfile 语法正确，并按照顺序执行每一步。</p></li><li class="lvl-2"><p>使用 <code>.dockerignore</code> 文件排除不需要的文件和目录，以减少构建上下文的大小。</p></li><li class="lvl-2"><p>在生产环境中，尽量使用精简的基础镜像以减小镜像体积和提高安全性。</p></li><li class="lvl-2"><p>避免在 Dockerfile 中暴露敏感信息（如密码、密钥）。</p></li></ul><p><code>docker build</code> 命令是构建 Docker 镜像的核心工具，通过定义清晰的 Dockerfile，可以自动化地构建应用程序的运行环境和依赖。在使用时，确保合理设置选项和优化 Dockerfile，以提高构建效率和镜像质量。</p><h1>Docker history 命令</h1><hr><p><code>docker history</code> 命令用于查看指定镜像的历史层信息，它显示了镜像创建过程中的每一层，包括创建时间、创建者、大小和注释等信息。</p><h3 id="语法-5">语法</h3><p><code>docker history [OPTIONS] IMAGE</code></p><ul class="lvl-0"><li class="lvl-2"><p><code>IMAGE</code>: 要查看历史记录的镜像名称或 ID。</p></li></ul><p>OPTIONS 说明：</p><ul class="lvl-0"><li class="lvl-2"><p><code>-H, --human</code>: 以人类可读的格式显示镜像大小（默认启用）。</p></li><li class="lvl-2"><p><code>--no-trunc</code>: 显示完整的输出，不截断信息。</p></li><li class="lvl-2"><p><code>-q, --quiet</code>: 仅显示镜像 ID。</p></li></ul><h2 id="实例-4">实例</h2><p>1、查看镜像历史</p><p><code>docker history myimage:latest</code></p><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT</span><br><span class="line">sha256:123abc456def 2 days ago          /bin/sh -c #(nop)  CMD [&quot;nginx&quot; &quot;-g&quot; &quot;daemon…   0B</span><br><span class="line">sha256:789ghi012jkl 2 days ago          /bin/sh -c #(nop)  COPY file:abc123 in /var/…   1.5kB</span><br><span class="line">sha256:345mno678pqr 2 days ago          /bin/sh -c apt-get update &amp;&amp; apt-get install…   45.3MB</span><br><span class="line">sha256:678stu901vwx 2 days ago          /bin/sh -c #(nop)  LABEL maintainer=yourname…   0B</span><br><span class="line">sha256:901yza234bcd 2 days ago          /bin/sh -c #(nop)  FROM ubuntu:20.04           72.9MB</span><br></pre></td></tr></table></figure><p>2、显示完整输出</p><p><code>docker history --no-trunc myimage:latest</code></p><p>3、仅显示镜像 ID</p><p><code>docker history -q myimage:latest</code></p><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">sha256:123abc456def</span><br><span class="line">sha256:789ghi012jkl</span><br><span class="line">sha256:345mno678pqr</span><br><span class="line">sha256:678stu901vwx</span><br><span class="line">sha256:901yza234bcd</span><br></pre></td></tr></table></figure><h3 id="操作实例">操作实例</h3><p>构建一个简单的镜像</p><p>1、创建一个 Dockerfile：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"># 使用 Ubuntu 作为基础镜像</span><br><span class="line">FROM ubuntu:20.04</span><br><span class="line"></span><br><span class="line"># 添加维护者信息</span><br><span class="line">LABEL maintainer=&quot;yourname@example.com&quot;</span><br><span class="line"></span><br><span class="line"># 更新包列表并安装 Nginx</span><br><span class="line">RUN apt-get update &amp;&amp; apt-get install -y nginx</span><br><span class="line"></span><br><span class="line"># 复制自定义网页到 Nginx 的默认网页目录</span><br><span class="line">COPY index.html /var/www/html/</span><br><span class="line"></span><br><span class="line"># 设置启动时的默认命令</span><br><span class="line">CMD [&quot;nginx&quot;, &quot;-g&quot;, &quot;daemon off;&quot;]</span><br></pre></td></tr></table></figure><p>2、构建镜像：</p><p><code>docker build -t mynginx:latest .</code></p><p>3、查看镜像历史</p><p><code>docker history mynginx:latest</code></p><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT</span><br><span class="line">sha256:123abc456def 1 minute ago        /bin/sh -c #(nop)  CMD [&quot;nginx&quot; &quot;-g&quot; &quot;daemon…   0B</span><br><span class="line">sha256:789ghi012jkl 1 minute ago        /bin/sh -c #(nop)  COPY file:abc123 in /var/…   1.5kB</span><br><span class="line">sha256:345mno678pqr 1 minute ago        /bin/sh -c apt-get update &amp;&amp; apt-get install…   45.3MB</span><br><span class="line">sha256:678stu901vwx 1 minute ago        /bin/sh -c #(nop)  LABEL maintainer=yourname…   0B</span><br><span class="line">sha256:901yza234bcd 1 minute ago        /bin/sh -c #(nop)  FROM ubuntu:20.04</span><br></pre></td></tr></table></figure><h3 id="注意事项-4">注意事项</h3><ul class="lvl-0"><li class="lvl-2"><p>镜像历史信息包括每一层的创建指令和大小，有助于了解镜像的构建过程和内容。</p></li><li class="lvl-2"><p>使用 <code>--no-trunc</code> 选项可以查看完整的创建指令，避免信息截断。</p></li><li class="lvl-2"><p>在构建复杂镜像时，通过查看历史记录，可以帮助识别和优化 Dockerfile 中的冗余步骤。</p></li></ul><p><code>docker history</code> 命令是一个强大的工具，可以帮助开发者和运维人员了解镜像的构建历史和每一层的详细信息。通过查看镜像历史，可以更好地调试、优化和审计 Docker 镜像，确保镜像的高效和安全。</p><h1>Docker save 命令</h1><hr><p><code>docker save</code> 命令用于将一个或多个 Docker 镜像保存到一个 tar 归档文件中，以便在其他环境中分发或备份。</p><h3 id="语法-6">语法</h3><p><code>docker save [OPTIONS] IMAGE [IMAGE...]</code></p><ul class="lvl-0"><li class="lvl-2"><p><code>IMAGE</code>: 要保存的一个或多个镜像名称或 ID。</p></li></ul><p>OPTIONS 说明：</p><ul class="lvl-0"><li class="lvl-2"><p><code>-o, --output</code>: 指定输出文件的路径。</p></li></ul><p>1、保存单个镜像到文件</p><p><code>docker save -o myimage.tar myimage:latest</code></p><p>这将 myimage:latest 镜像保存为 myimage.tar 文件。</p><p>2、保存多个镜像到同一个文件</p><p><code>docker save -o multiple_images.tar myimage:latest anotherimage:latest</code></p><p>这将 myimage:latest 和 anotherimage:latest 镜像保存到 multiple_images.tar 文件中。</p><h2 id="实例-5">实例</h2><h3 id="构建一个示例镜像">构建一个示例镜像</h3><p>1、创建一个 Dockerfile：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"># 使用 Ubuntu 作为基础镜像</span><br><span class="line">FROM ubuntu:20.04</span><br><span class="line"></span><br><span class="line"># 添加维护者信息</span><br><span class="line">LABEL maintainer=&quot;yourname@example.com&quot;</span><br><span class="line"></span><br><span class="line"># 更新包列表并安装 Nginx</span><br><span class="line">RUN apt-get update &amp;&amp; apt-get install -y nginx</span><br><span class="line"></span><br><span class="line"># 复制自定义网页到 Nginx 的默认网页目录</span><br><span class="line">COPY index.html /var/www/html/</span><br><span class="line"></span><br><span class="line"># 设置启动时的默认命令</span><br><span class="line">CMD [&quot;nginx&quot;, &quot;-g&quot;, &quot;daemon off;&quot;]</span><br></pre></td></tr></table></figure><p>构建镜像：</p><p><code>docker build -t mynginx:latest .</code></p><p>2、保存镜像到文件</p><p><code>docker save -o mynginx.tar mynginx:latest</code></p><p>这将 mynginx:latest 镜像保存为 mynginx.tar 文件。</p><p>3、验证保存的文件</p><p><code>ls -lh mynginx.tar</code></p><p>输出示例：</p><p><code>-rw-r--r-- 1 user user 200M Jul 24 14:00 mynginx.tar</code></p><p>4、加载保存的镜像</p><p>要将保存的镜像加载到另一个 Docker 环境中，可以使用 docker load 命令：</p><p><code>docker load -i mynginx.tar</code></p><h3 id="注意事项-5">注意事项</h3><ul class="lvl-0"><li class="lvl-2"><p>保存镜像时，会包含镜像的所有层，因此生成的 tar 文件可能会很大。</p></li><li class="lvl-2"><p>如果保存多个镜像到同一个文件中，使用 <code>docker load</code> 命令时会加载所有包含的镜像。</p></li><li class="lvl-2"><p>为了减少文件大小，可以在保存前使用 <code>docker image prune</code> 命令清理未使用的镜像和层。</p></li></ul><p><code>docker save</code> 命令是一个方便的工具，用于将 Docker 镜像保存为 tar 文件，以便于备份、分发和迁移。通过结合 <code>docker load</code> 命令，可以轻松地在不同环境中恢复和使用保存的镜像。</p><h1>Docker load 命令</h1><hr><p><code>docker load</code> 命令用于从由 <code>docker save</code> 命令生成的 tar 文件中加载 Docker 镜像。它可以将存档中的镜像和所有层加载到 Docker 中，使其可以在新环境中使用。</p><h3 id="语法-7">语法</h3><p><code>docker load [OPTIONS]</code></p><p>OPTIONS 说明：</p><ul class="lvl-0"><li class="lvl-2"><p><code>-i, --input</code>: 指定输入文件的路径。</p></li><li class="lvl-2"><p><code>-q, --quiet</code>: 安静模式，减少输出信息。</p></li></ul><p>1、从文件加载镜像</p><p><code>docker load -i myimage.tar</code></p><p>这将从 myimage.tar 文件中加载镜像。</p><p>2、从标准输入加载镜像</p><p><code>cat myimage.tar | docker load</code></p><p>这将通过管道从标准输入加载镜像。</p><h2 id="实例-6">实例</h2><p>1、构建和保存镜像</p><p>首先，构建一个示例镜像并保存，创建 Dockerfile：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"># 使用 Ubuntu 作为基础镜像</span><br><span class="line">FROM ubuntu:20.04</span><br><span class="line"></span><br><span class="line"># 添加维护者信息</span><br><span class="line">LABEL maintainer=&quot;yourname@example.com&quot;</span><br><span class="line"></span><br><span class="line"># 更新包列表并安装 Nginx</span><br><span class="line">RUN apt-get update &amp;&amp; apt-get install -y nginx</span><br><span class="line"></span><br><span class="line"># 复制自定义网页到 Nginx 的默认网页目录</span><br><span class="line">COPY index.html /var/www/html/</span><br><span class="line"></span><br><span class="line"># 设置启动时的默认命令</span><br><span class="line">CMD [&quot;nginx&quot;, &quot;-g&quot;, &quot;daemon off;&quot;]</span><br></pre></td></tr></table></figure><p>构建镜像：</p><p><code>docker build -t mynginx:latest .</code></p><p>保存镜像到文件：</p><p><code>docker save -o mynginx.tar mynginx:latest</code></p><p>2、加载镜像</p><p>从文件加载镜像：</p><p><code>docker load -i mynginx.tar</code></p><p>3、验证加载的镜像</p><p><code>docker images</code></p><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE</span><br><span class="line">mynginx             latest              123abc456def        1 minute ago        200MB</span><br></pre></td></tr></table></figure><h3 id="注意事项-6">注意事项</h3><ul class="lvl-0"><li class="lvl-2"><p>加载的镜像包括其所有层和元数据，与保存时的状态完全一致。</p></li><li class="lvl-2"><p>使用 <code>docker load</code> 时，所有包含在 tar 文件中的镜像都会被加载。</p></li><li class="lvl-2"><p>加载过程中可能需要较长时间，具体取决于镜像的大小和系统性能。</p></li></ul><p><code>docker load</code> 命令是从保存的 tar 文件中恢复 Docker 镜像的便捷方法。通过结合 <code>docker save</code> 和 <code>docker load</code>，用户可以轻松地在不同环境中备份、分发和迁移 Docker 镜像。</p><h1>Docker import 命令</h1><hr><p><code>docker import</code> 命令用于从一个 tar 文件或 URL 导入容器快照，从而创建一个新的 Docker 镜像。</p><p>与 <code>docker load</code> 不同，<code>docker import</code> 可以从容器快照中创建新的镜像，而不需要保留镜像的历史和元数据。</p><h3 id="语法-8">语法</h3><p><code>docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]</code></p><ul class="lvl-0"><li class="lvl-2"><p><code>file|URL|-</code>: 输入文件的路径、本地文件或 URL，或者使用 <code>-</code> 从标准输入读取。</p></li><li class="lvl-2"><p><code>[REPOSITORY[:TAG]]</code>: （可选）为导入的镜像指定仓库和标签。</p></li></ul><p>OPTIONS 说明：</p><ul class="lvl-0"><li class="lvl-2"><p><code>-c, --change</code>: 在导入过程中应用 Dockerfile 指令，如 <code>CMD</code>、<code>ENTRYPOINT</code>、<code>ENV</code> 等。</p></li><li class="lvl-2"><p><code>-m, --message</code>: 为导入的镜像添加注释。</p></li></ul><p>1、从本地 tar 文件导入镜像</p><p><code>docker import mycontainer.tar mynewimage:latest</code></p><p>这将从 mycontainer.tar 文件导入镜像，并命名为 mynewimage:latest。</p><p>2、从 URL 导入镜像</p><p><code>docker import [http://example.com/mycontainer.tar](http://example.com/mycontainer.tar) mynewimage:latest</code></p><p>这将从指定的 URL 导入镜像，并命名为 mynewimage:latest。</p><p>3、从标准输入导入镜像</p><p><code>cat mycontainer.tar | docker import - mynewimage:latest</code></p><p>这将通过管道从标准输入读取 tar 文件并导入镜像。</p><p>4、在导入过程中应用变更</p><p><code>docker import -c &quot;ENV LANG=en_US.UTF-8&quot; -c &quot;CMD /bin/bash&quot; mycontainer.tar mynewimage:latest</code></p><p>这将从 mycontainer.tar 导入镜像，并在过程中设置环境变量 LANG 和命令 CMD。</p><h2 id="实例-7">实例</h2><p>1、导出容器快照</p><p>首先，创建并运行一个容器：</p><p><code>docker run -d --name mycontainer ubuntu:20.04 sleep 3600</code></p><p>导出容器快照：</p><p><code>docker export mycontainer -o mycontainer.tar</code></p><p>2、导入容器快照</p><p>从 tar 文件导入镜像：</p><p><code>docker import mycontainer.tar mynewimage:latest</code></p><p>3、验证导入的镜像</p><p><code>docker images</code></p><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">REPOSITORY     TAG       IMAGE ID            CREATED             SIZE</span><br><span class="line">mynewimage     latest    123abc456def        1 minute ago        72.9MB</span><br></pre></td></tr></table></figure><p>4、运行导入的镜像</p><p><code>docker run -it mynewimage:latest /bin/bash</code></p><h3 id="注意事项-7">注意事项</h3><ul class="lvl-0"><li class="lvl-2"><p><code>docker import</code> 创建的镜像不会保留原始镜像的历史和元数据。</p></li><li class="lvl-2"><p>使用 <code>-c</code> 选项可以在导入过程中应用 Dockerfile 指令，从而自定义新镜像的配置。</p></li><li class="lvl-2"><p>导入的 tar 文件必须是使用 <code>docker export</code> 创建的容器快照，或者是兼容的其他格式。</p></li></ul><p><code>docker import</code> 命令是一种从容器快照创建新镜像的灵活方法，适用于迁移、恢复和自定义 Docker 镜像的场景。通过使用 <code>docker import</code>，用户可以轻松地从容器快照生成新的镜像，并在导入过程中应用额外的配置。</p>]]></content>
    
    
    <summary type="html">docker</summary>
    
    
    
    <category term="学习" scheme="http://zxwlove.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="笔记" scheme="http://zxwlove.xyz/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="学习" scheme="http://zxwlove.xyz/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="Docker" scheme="http://zxwlove.xyz/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Docker命令-镜像仓库</title>
    <link href="http://zxwlove.xyz/posts/docker05.html"/>
    <id>http://zxwlove.xyz/posts/docker05.html</id>
    <published>2025-02-25T02:10:10.000Z</published>
    <updated>2025-03-09T12:44:03.559Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><h1>Docker login/logout 命令</h1><hr><p><code>docker login</code> 和 <code>docker logout</code> 命令用于管理 Docker 客户端与 Docker 注册表的身份验证。通过 <code>docker login</code> 命令，用户可以登录到 Docker 注册表，访问和推送镜像；通过 <code>docker logout</code> 命令，用户可以退出登录。</p><ul class="lvl-0"><li class="lvl-2"><p>docker login : 登陆到 一个Docker 镜像仓库，如果未指定镜像仓库地址，默认为官方仓库 Docker Hub</p></li><li class="lvl-2"><p>docker logout : 登出一个D ocker 镜像仓库，如果未指定镜像仓库地址，默认为官方仓库 Docker Hub</p></li></ul><hr><h2 id="docker-login">docker login</h2><p><code>docker login</code> 命令用于登录到 Docker 注册表。</p><p>默认情况下，它登录到 Docker Hub，但也可以登录到其他 Docker 注册表。</p><h3 id="语法">语法</h3><p><code>docker login [OPTIONS] [SERVER]</code></p><ul class="lvl-0"><li class="lvl-2"><p><code>SERVER</code>: Docker 注册表的服务器地址（默认是 Docker Hub）。</p></li><li class="lvl-2"><p><code>-u, --username</code>: 登录用户名。</p></li><li class="lvl-2"><p><code>-p, --password</code>: 登录密码（不推荐在命令行使用）。</p></li><li class="lvl-2"><p><code>--password-stdin</code>: 从标准输入读取密码。</p></li></ul><h3 id="使用示例">使用示例</h3><p>1、登录到 Docker Hub</p><p><code>docker login</code></p><p>提示输入 Docker Hub 用户名和密码。</p><p>2、登录到 Docker Hub（指定用户名）</p><p><code>docker login --username myusername</code></p><p>3、提示输入 Docker Hub 密码。</p><p>从标准输入读取密码：</p><p><code>echo &quot;mypassword&quot; | docker login --username myusername --password-stdin</code></p><p>从标准输入读取密码，避免在命令行明文输入密码。</p><p>4、登录到自定义注册表</p><p><code>docker login myregistry.com</code></p><p>提示输入自定义注册表的用户名和密码。</p><hr><h2 id="docker-logout">docker logout</h2><p><code>docker logout</code> 命令用于退出当前登录的 Docker 注册表。默认情况下，它退出 Docker Hub，但也可以指定其他注册表。</p><h3 id="语法-2">语法</h3><p><code>docker logout [SERVER]</code></p><ul class="lvl-0"><li class="lvl-2"><p><code>SERVER</code>: Docker 注册表的服务器地址（默认是 Docker Hub）。</p></li></ul><h3 id="使用示例-2">使用示例</h3><p>1、退出 Docker Hub</p><p><code>docker logout</code></p><p>退出当前用户在 Docker Hub 的登录状态。</p><p>2、退出自定义注册表</p><p><code>docker logout myregistry.com</code></p><p>退出当前用户在 <a href="http://myregistry.com">myregistry.com</a> 的登录状态。</p><hr><h2 id="操作实例">操作实例</h2><p>1、登录 Docker Hub</p><p><code>docker login</code></p><p>输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Username: myusername</span><br><span class="line">Password: </span><br><span class="line">Login Succeeded</span><br></pre></td></tr></table></figure><p>2、从标准输入读取密码登录 Docker Hub</p><p><code>echo &quot;mypassword&quot; | docker login --username myusername --password-stdin</code></p><p>输出：</p><p>Login Succeeded</p><p>3、登录自定义注册表</p><p><code>docker login myregistry.com</code></p><p>输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Username: myusername</span><br><span class="line">Password: </span><br><span class="line">Login Succeeded</span><br></pre></td></tr></table></figure><p>4、退出 Docker Hub</p><p><code>docker logout</code></p><p>输出：</p><p><code>Removing login credentials for [https://index.docker.io/v1/](https://index.docker.io/v1/)</code></p><p>5、退出自定义注册表</p><p><code>docker logout myregistry.com</code></p><p>输出：</p><p><code>Removing login credentials for myregistry.com</code></p><h3 id="注意事项">注意事项</h3><ul class="lvl-0"><li class="lvl-2"><p>不推荐在命令行直接使用 <code>-p</code> 选项输入密码，因为这样密码会以明文形式暴露在命令历史记录中。</p></li><li class="lvl-2"><p>使用 <code>--password-stdin</code> 可以避免密码明文暴露，增强安全性。</p></li><li class="lvl-2"><p>确保在公共或共享环境中执行 <code>docker logout</code>，以防止其他用户访问您的账户。</p></li></ul><h1>Docker pull 命令</h1><hr><p><code>docker pull</code> 命令用于从 Docker 注册表（例如 Docker Hub）中拉取（下载）镜像到本地。</p><p><code>docker pull</code> 命令允许用户获取所需的镜像以便在本地运行容器。</p><h3 id="语法-3">语法</h3><p><code>docker pull [OPTIONS] NAME[:TAG|@DIGEST]</code></p><ul class="lvl-0"><li class="lvl-2"><p><code>NAME</code>: 镜像名称，通常包含注册表地址（如 <code>docker.io/library/ubuntu</code>）。</p></li><li class="lvl-2"><p><code>TAG</code>（可选）: 镜像标签，默认为 <code>latest</code>。</p></li><li class="lvl-2"><p><code>DIGEST</code>（可选）: 镜像的 SHA256 摘要。</p></li></ul><p>常用选项：</p><ul class="lvl-0"><li class="lvl-2"><p><code>--all-tags, -a</code>: 下载指定镜像的所有标签。</p></li><li class="lvl-2"><p><code>--disable-content-trust</code>: 跳过镜像签名验证。</p></li></ul><p>1、拉取默认标签（latest）的镜像</p><p><code>docker pull ubuntu</code></p><p>这会从 Docker Hub 拉取名为 ubuntu 的镜像，标签默认为 latest。</p><p>2、拉取特定标签的镜像</p><p><code>docker pull ubuntu:20.04</code></p><p>这会从 Docker Hub 拉取名为 ubuntu 的镜像，标签为 20.04。</p><p>3、拉取特定摘要的镜像</p><p><code>docker pull ubuntu@sha256:12345abcdef...</code></p><p>这会拉取具有特定 SHA256 摘要的 ubuntu 镜像。</p><p>4、拉取所有标签的镜像</p><p><code>docker pull --all-tags ubuntu</code></p><p>这会拉取 ubuntu 镜像的所有可用标签。</p><p>5、从自定义注册表拉取镜像</p><p><code>docker pull myregistry.com/myrepo/myimage:mytag</code></p><p>这会从 <a href="http://myregistry.com">myregistry.com</a> 注册表中拉取 myrepo 仓库中的 myimage 镜像，标签为 mytag。</p><h3 id="实例">实例</h3><p>1、拉取 Ubuntu 镜像：</p><p><code>docker pull ubuntu</code></p><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">Using default tag: latest</span><br><span class="line">latest: Pulling from library/ubuntu</span><br><span class="line">Digest: sha256:12345abcdef...</span><br><span class="line">Status: Downloaded newer image for ubuntu:latest</span><br><span class="line">docker.io/library/ubuntu:latest</span><br></pre></td></tr></table></figure><p>2、拉取指定标签的 Ubuntu 镜像</p><p><code>docker pull ubuntu:20.04</code></p><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">20.04: Pulling from library/ubuntu</span><br><span class="line">Digest: sha256:67890abcdef...</span><br><span class="line">Status: Downloaded newer image for ubuntu:20.04</span><br><span class="line">docker.io/library/ubuntu:20.04</span><br></pre></td></tr></table></figure><h3 id="注意事项-2">注意事项</h3><ul class="lvl-0"><li class="lvl-2"><p>默认标签为 <code>latest</code>，但最好显式指定标签以避免拉取意外的版本。</p></li><li class="lvl-2"><p>确保有足够的磁盘空间来存储拉取的镜像。</p></li><li class="lvl-2"><p>在生产环境中，建议使用镜像的摘要（digest）以确保镜像的唯一性和一致性。</p></li></ul><p><code>docker pull</code> 命令是获取 Docker 镜像的基本工具，通过指定镜像名称、标签或摘要，可以从 Docker 注册表中下载所需的镜像。</p><h1>Docker push 命令</h1><hr><p><code>docker push</code> 命令用于将本地构建的 Docker 镜像推送（上传）到 Docker 注册表（如 Docker Hub 或私有注册表）。这使得镜像可以在其他系统或环境中共享和使用。</p><h3 id="语法-4">语法</h3><p><code>docker push [OPTIONS] NAME[:TAG]</code></p><ul class="lvl-0"><li class="lvl-2"><p><code>NAME</code>: 镜像名称，通常包含注册表地址（如 <code>docker.io/myrepo/myimage</code>）。</p></li><li class="lvl-2"><p><code>TAG</code>（可选）: 镜像标签，默认为 <code>latest</code>。</p></li></ul><p>OPTIONS 说明：</p><ul class="lvl-0"><li class="lvl-2"><p>–disable-content-trust :忽略镜像的校验,默认开启</p></li></ul><p>1、推送默认标签（latest）的镜像</p><p><code>docker push myrepo/myimage</code></p><p>这会将本地的 myrepo/myimage:latest 镜像推送到 Docker Hub。</p><p>2、推送特定标签的镜像</p><p><code>docker push myrepo/myimage:1.0</code></p><p>这会将本地的 myrepo/myimage:1.0 镜像推送到 Docker Hub。</p><p>3、推送到自定义注册表</p><p><code>docker push myregistry.com/myrepo/myimage:mytag</code></p><p>这会将本地的 myrepo/myimage:mytag 镜像推送到 <a href="http://myregistry.com">myregistry.com</a> 注册表。</p><h2 id="实例-2">实例</h2><h3 id="推送镜像到-Docker-Hub">推送镜像到 Docker Hub</h3><p>1、登录到 Docker Hub</p><p><code>docker login</code></p><p>2、构建一个镜像</p><p><code>docker build -t myrepo/myimage:1.0 .</code></p><p>3、推送镜像到 Docker Hub</p><p><code>docker push myrepo/myimage:1.0</code></p><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">The push refers to repository [docker.io/myrepo/myimage]</span><br><span class="line">d1e017099d17: Pushed</span><br><span class="line">1.0: digest: sha256:12345abcdef... size: 1234</span><br></pre></td></tr></table></figure><h3 id="推送镜像到自定义注册表">推送镜像到自定义注册表</h3><p>1、登录到自定义注册表</p><p><code>docker login myregistry.com</code></p><p>2、构建一个镜像</p><p><code>docker build -t myregistry.com/myrepo/myimage:mytag .</code></p><p>3、推送镜像到自定义注册表</p><p><code>docker push myregistry.com/myrepo/myimage:mytag</code></p><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">The push refers to repository [myregistry.com/myrepo/myimage]</span><br><span class="line">d1e017099d17: Pushed</span><br><span class="line">mytag: digest: sha256:67890abcdef... size: 5678</span><br></pre></td></tr></table></figure><h3 id="注意事项-3">注意事项</h3><ul class="lvl-0"><li class="lvl-2"><p>确保已登录到目标注册表（使用 <code>docker login</code> 命令）。</p></li><li class="lvl-2"><p>在推送镜像之前，确保镜像标签正确，并符合注册表的命名规范。</p></li><li class="lvl-2"><p>推送操作需要网络连接，镜像大小和网络速度会影响推送时间。</p></li><li class="lvl-2"><p>对于私有注册表，确保拥有相应的访问权限和配置信息。</p></li></ul><p><code>docker push</code> 命令是将本地 Docker 镜像推送到注册表的关键工具，通过使用这个命令，用户可以方便地共享、部署和管理 Docker 镜像。在使用时，确保正确登录和标签设置，以保证镜像能够正确推送到目标注册表。</p><h1>Docker search 命令</h1><hr><p><code>docker search</code> 命令用于在 Docker Hub 或其他注册表中搜索镜像。</p><p><code>docker search</code> 命令帮助用户查找和获取所需的镜像，并提供了对搜索结果进行过滤和排序的功能。</p><h3 id="语法-5">语法</h3><p><code>docker search [OPTIONS] TERM</code></p><ul class="lvl-0"><li class="lvl-2"><p><code>TERM</code>: 要搜索的关键字。</p></li></ul><p>常用选项：</p><ul class="lvl-0"><li class="lvl-2"><p>–automated :只列出 automated build类型的镜像；</p></li><li class="lvl-2"><p>–no-trunc :显示完整的镜像描述；</p></li><li class="lvl-2"><p>-f &lt;过滤条件&gt;:列出收藏数不小于指定值的镜像。</p></li></ul><p>1、搜索镜像</p><p><code>docker search ubuntu</code></p><p>这会在 Docker Hub 中搜索包含关键字 ubuntu 的镜像。</p><p>2、限制返回的搜索结果数量</p><p><code>docker search --limit 5 ubuntu</code></p><p>这会在 Docker Hub 中搜索包含关键字 ubuntu 的镜像，并只返回前 5 个结果。</p><p>3、过滤搜索结果</p><p><code>docker search --filter stars=50 ubuntu</code></p><p>这会在 Docker Hub 中搜索包含关键字 ubuntu 的镜像，并只返回 stars 数不低于 50 的镜像。</p><p>4、不截断输出</p><p><code>docker search --no-trunc ubuntu</code></p><p>这会在 Docker Hub 中搜索包含关键字 ubuntu 的镜像，并显示完整的镜像描述。</p><p>5、自定义格式输出</p><p><code>docker search --format &quot;&#123;&#123;.Name&#125;&#125;: &#123;&#123;.StarCount&#125;&#125; stars&quot; ubuntu</code></p><p>这会在 Docker Hub 中搜索包含关键字 ubuntu 的镜像，并以指定格式显示镜像名称和 star 数。</p><h3 id="实例-3">实例</h3><p>1、搜索 Ubuntu 镜像</p><p>docker search ubuntu输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">NAME                             DESCRIPTION                                     STARS   OFFICIAL  AUTOMATED</span><br><span class="line">ubuntu                           Ubuntu is a Debian-based Linux operating sys…   10000   [OK]</span><br><span class="line">dorowu/ubuntu-desktop-lxde-vnc   Ubuntu with openssh-server and NoVNC            4000               [OK]</span><br><span class="line">rastasheep/ubuntu-sshd           Dockerized SSH service, built on top of offi…   2000               [OK]</span><br></pre></td></tr></table></figure><p>参数说明：</p><p>NAME: 镜像仓库源的名称</p><p>DESCRIPTION: 镜像的描述</p><p>OFFICIAL: 是否 docker 官方发布</p><p>stars: 类似 Github 里面的 star，表示点赞、喜欢的意思。</p><p>AUTOMATED: 自动构建。</p><p>2、限制返回结果数量</p><p>docker search --limit 3 ubuntu输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED</span><br><span class="line">ubuntu                            Ubuntu is a Debian-based Linux operating sys…   10000     [OK]</span><br><span class="line">dorowu/ubuntu-desktop-lxde-vnc    Ubuntu with openssh-server and NoVNC            4000                 [OK]</span><br><span class="line">rastasheep/ubuntu-sshd            Dockerized SSH service, built on top of offi…   2000                 [OK]</span><br></pre></td></tr></table></figure><p>3、过滤搜索结果</p><p><code>docker search --filter stars=1000 ubuntu</code></p><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">NAME                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED</span><br><span class="line">ubuntu                          Ubuntu is a Debian-based Linux operating sys…   10000     [OK]</span><br><span class="line">dorowu/ubuntu-desktop-lxde-vnc  Ubuntu with openssh-server and NoVNC            4000                 [OK]</span><br><span class="line">rastasheep/ubuntu-sshd          Dockerized SSH service, built on top of offi…   2000                 [OK]</span><br></pre></td></tr></table></figure><h3 id="4、自定义格式输出">4、自定义格式输出</h3><p><code>docker search --format &quot;&#123;&#123;.Name&#125;&#125;: &#123;&#123;.StarCount&#125;&#125; stars&quot; ubuntu</code></p><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">ubuntu: 10000 stars</span><br><span class="line">dorowu/ubuntu-desktop-lxde-vnc: 4000 stars</span><br><span class="line">rastasheep/ubuntu-sshd: 2000 stars</span><br></pre></td></tr></table></figure><h3 id="注意事项-4">注意事项</h3><ul class="lvl-0"><li class="lvl-2"><p>搜索结果可能包含大量镜像，可以使用过滤和排序选项来精简结果。</p></li><li class="lvl-2"><p>确保使用准确的关键字以获取相关结果。</p></li><li class="lvl-2"><p><code>docker search</code> 默认搜索 Docker Hub，若需要搜索其他注册表，需相应配置 Docker 客户端。</p></li></ul><p><code>docker search</code> 命令是查找 Docker 镜像的重要工具，通过指定关键字和选项，用户可以高效地在 Docker 注册表中搜索和获取所需的镜像。这个命令适用于各种场景，包括查找特定功能的镜像、获取高评分镜像以及自定义结果显示。</p>]]></content>
    
    
    <summary type="html">docker</summary>
    
    
    
    <category term="学习" scheme="http://zxwlove.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="笔记" scheme="http://zxwlove.xyz/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="学习" scheme="http://zxwlove.xyz/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="Docker" scheme="http://zxwlove.xyz/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Docker命令-容器的root文件系统（rootfs）命令</title>
    <link href="http://zxwlove.xyz/posts/docker04.html"/>
    <id>http://zxwlove.xyz/posts/docker04.html</id>
    <published>2025-02-10T02:10:10.000Z</published>
    <updated>2025-03-09T12:43:31.206Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><h1>Docker commit 命令</h1><hr><p><code>docker commit</code> 命令用于将容器的当前状态保存为一个新的 Docker 镜像。</p><p><code>docker commit</code> 命令通常用于创建镜像来保存容器的状态，以便在将来可以重用或分发该镜像。</p><h3 id="语法">语法</h3><p>docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]</p><p>OPTIONS说明：</p><ul class="lvl-0"><li class="lvl-2"><p>-a :提交的镜像作者。</p></li><li class="lvl-2"><p>-c :使用 Dockerfile 指令来创建镜像。</p></li><li class="lvl-2"><p>-m :提交时的说明文字。</p></li><li class="lvl-2"><p>-p :提交镜像前暂停容器（默认为 true）。</p></li></ul><p>将容器保存为新镜像:</p><p>docker commit my_container my_new_image</p><p>将名为 my_container 的容器保存为一个名为 my_new_image 的新镜像。</p><p>指定标签:</p><p>docker commit my_container my_new_image:latest</p><p>将容器保存为带有 latest 标签的镜像。</p><p>添加作者信息和提交信息:</p><p>docker commit -a “John Doe” -m “Added new features” my_container my_new_image</p><p>将容器保存为新镜像，并添加作者信息和提交信息。</p><p>在不暂停容器的情况下提交镜像:</p><p>docker commit --pause=false my_container my_new_image</p><p>在不暂停容器的情况下，将其保存为新镜像。</p><h3 id="实例">实例</h3><p>启动一个容器:</p><p>docker run -d -it --name my_container ubuntu bash</p><p>进行一些更改:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">docker exec my_container apt-get update</span><br><span class="line">docker exec my_container apt-get install -y nginx</span><br></pre></td></tr></table></figure><p>提交容器为新镜像:</p><p>docker commit -a “Your Name” -m “Installed nginx” my_container my_new_image</p><p>查看新镜像:</p><p>docker images</p><h3 id="常用场景">常用场景</h3><ul class="lvl-0"><li class="lvl-2"><p>保存工作进度: 在开发或测试过程中，将容器的当前状态保存为镜像，以便稍后可以恢复。</p></li><li class="lvl-2"><p>创建基础镜像: 为特定应用程序或环境配置创建自定义基础镜像。</p></li><li class="lvl-2"><p>分发配置: 将特定配置或应用程序状态保存为镜像，以便分发给其他团队成员或在不同环境中使用。</p></li></ul><p><code>docker commit</code> 命令是一个强大的工具，允许用户将容器的当前状态保存为新的 Docker 镜像。通过使用该命令，用户可以创建自定义镜像，以便在将来重用或分发。添加适当的作者和提交信息，有助于跟踪镜像的历史和变化。</p><h1>Docker cp 命令</h1><hr><p><code>docker cp</code> 命令用于在 Docker 容器和宿主机之间复制文件或目录。</p><p><code>docker cp</code> 命令支持从容器到宿主机，或从宿主机到容器的文件复制操作。</p><h3 id="语法-2">语法</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH</span><br><span class="line">docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><code>SRC_PATH</code>: 源路径（可以是容器内的路径或宿主机的路径）。</p></li><li class="lvl-2"><p><code>CONTAINER</code>: 容器的名称或 ID。</p></li><li class="lvl-2"><p><code>DEST_PATH</code>: 目标路径（可以是容器内的路径或宿主机的路径）。</p></li></ul><p>从容器复制文件到宿主机</p><p>docker cp my_container:/path/in/container /path/on/host</p><p>将容器 my_container 内的 /path/in/container 文件或目录复制到宿主机的 /path/on/host。</p><p>从宿主机复制文件到容器</p><p>docker cp /path/on/host my_container:/path/in/container</p><p>将宿主机上的 /path/on/host 文件或目录复制到容器 my_container 内的 /path/in/container。</p><p>从容器复制目录到宿主机</p><p>docker cp my_container:/path/in/container /path/on/host</p><p>将容器内的 /path/in/container 目录及其内容复制到宿主机的 /path/on/host。</p><p>从宿主机复制目录到容器</p><p>docker cp /path/on/host my_container:/path/in/container</p><p>将宿主机上的 /path/on/host 目录及其内容复制到容器 my_container 内的 /path/in/container。</p><h2 id="实例-2">实例</h2><h3 id="容器复制文件到宿主机">容器复制文件到宿主机</h3><p>启动一个容器并创建一个文件:</p><p>docker run -d --name my_container ubuntu bash -c “echo ‘Hello, Docker!’ &gt; /hello.txt”</p><p>从容器复制文件到宿主机:</p><p>docker cp my_container:/hello.txt ./hello.txt</p><p>将容器内的 /hello.txt 文件复制到当前宿主机目录下。</p><p>查看复制的文件内容:</p><p>cat hello.txt</p><p>输出：</p><p>Hello, Docker!</p><h3 id="从宿主机复制文件到容器">从宿主机复制文件到容器</h3><p>复制一个文件到容器:</p><p>docker cp ./hello.txt my_container:/hello.txt</p><p>将宿主机上的 hello.txt 文件复制到容器内的 /hello.txt。</p><p>进入容器查看文件内容:</p><p>docker exec -it my_container cat /hello.txt</p><p>输出：</p><p>Hello, Docker!</p><h3 id="注意事项">注意事项</h3><ul class="lvl-0"><li class="lvl-2"><p><code>docker cp</code> 命令不会修改源文件或目录，它仅进行复制操作。</p></li><li class="lvl-2"><p>目标路径必须是有效的路径，且宿主机或容器中应有足够的权限进行写入操作。</p></li><li class="lvl-2"><p>在处理大文件或大目录时，复制操作可能需要一些时间。</p></li></ul><p><code>docker cp</code> 命令是 Docker 提供的一个有用工具，用于在容器和宿主机之间复制文件或目录。这个命令适用于备份、配置更新、日志收集等操作，帮助用户方便地管理和操作容器中的文件。</p><h1>Docker diff 命令</h1><hr><p><code>docker diff</code> 命令用于显示 Docker 容器文件系统的变更。它显示自容器创建以来，文件系统中发生的所有修改，包括添加、删除和修改的文件或目录。</p><p><code>docker diff</code> 命令对于调试和理解容器的文件系统变化非常有用。</p><h3 id="语法-3">语法</h3><p>docker diff CONTAINER</p><ul class="lvl-0"><li class="lvl-2"><p><code>CONTAINER</code>: 容器的名称或 ID。</p></li></ul><p><code>docker diff</code> 命令的输出包含以下三种类型的变更：</p><ul class="lvl-0"><li class="lvl-2"><p><code>A</code>: 表示新增的文件或目录。</p></li><li class="lvl-2"><p><code>D</code>: 表示删除的文件或目录。</p></li><li class="lvl-2"><p><code>C</code>: 表示修改过的文件或目录。</p></li></ul><p>查看容器的文件系统变更</p><p>docker diff my_container</p><p>显示名为 my_container 的容器的文件系统变更。</p><h3 id="实例-3">实例</h3><p>启动一个容器并修改文件系统:</p><p>docker run -d --name my_container ubuntu bash -c “echo ‘Hello, Docker!’ &gt; /hello.txt &amp;&amp; sleep 3600”</p><p>查看容器的文件系统变更:</p><p>docker diff my_container</p><p>输出示例：</p><p>A /hello.txt</p><p>此输出表示 /hello.txt 文件在容器文件系统中被新增了。</p><p>删除容器中的文件:</p><p>docker exec my_container rm /hello.txt</p><p>再次查看容器的文件系统变更:</p><p>docker diff my_container</p><p>输出示例：</p><p>D /hello.txt</p><p>此输出表示 /hello.txt 文件在容器文件系统中被删除了。</p><h3 id="注意事项-2">注意事项</h3><ul class="lvl-0"><li class="lvl-2"><p><code>docker diff</code> 命令仅显示容器的文件系统变化，不显示容器内的其他状态信息（如运行的进程）。</p></li><li class="lvl-2"><p>输出信息可能会因容器内文件系统的变化而不断变化，因此应在需要时及时查看。</p></li></ul><p><code>docker diff</code> 命令是一个强大的工具，用于显示 Docker 容器文件系统的变化。通过使用该命令，用户可以轻松查看和了解容器自创建以来所做的文件系统更改，有助于调试、审计和分析容器的行为。</p>]]></content>
    
    
    <summary type="html">docker</summary>
    
    
    
    <category term="学习" scheme="http://zxwlove.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="笔记" scheme="http://zxwlove.xyz/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="学习" scheme="http://zxwlove.xyz/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="Docker" scheme="http://zxwlove.xyz/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Docker命令-容器操作</title>
    <link href="http://zxwlove.xyz/posts/docker03.html"/>
    <id>http://zxwlove.xyz/posts/docker03.html</id>
    <published>2025-01-28T04:12:13.000Z</published>
    <updated>2025-03-09T12:42:59.925Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><h1>Docker ps 命令</h1><hr><p>docker ps 命令用于列出 Docker 容器。</p><p>默认情况下，docker ps 命令只显示运行中的容器，但也可以通过指定选项来显示所有容器，包括停止的容器。</p><h3 id="语法">语法</h3><p>docker ps [OPTIONS]</p><p>OPTIONS说明：</p><ul class="lvl-0"><li class="lvl-2"><p><code>-a, --all</code>: 显示所有容器，包括停止的容器。</p></li><li class="lvl-2"><p><code>-q, --quiet</code>: 只显示容器 ID。</p></li><li class="lvl-2"><p><code>-l, --latest</code>: 显示最近创建的一个容器，包括所有状态。</p></li><li class="lvl-2"><p><code>-n</code>: 显示最近创建的 n 个容器，包括所有状态。</p></li><li class="lvl-2"><p><code>--no-trunc</code>: 不截断输出。</p></li><li class="lvl-2"><p><code>-s, --size</code>: 显示容器的大小。</p></li><li class="lvl-2"><p><code>--filter, -f</code>: 根据条件过滤显示的容器。</p></li><li class="lvl-2"><p><code>--format</code>: 格式化输出。</p></li></ul><h3 id="实例">实例</h3><p>1、列出所有在运行的容器信息</p><p>默认情况下，docker ps 只显示正在运行的容器。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">docker ps</span><br><span class="line">CONTAINER ID   IMAGE          COMMAND                ...  PORTS                    NAMES</span><br><span class="line">09b93464c2f7   nginx:latest   &quot;nginx -g &#x27;daemon off&quot; ...  80/tcp, 443/tcp          myrunoob</span><br><span class="line">96f7f14e99ab   mysql:5.6      &quot;docker-entrypoint.sh&quot; ...  0.0.0.0:3306-&gt;3306/tcp   mymysql</span><br></pre></td></tr></table></figure><p>输出详情介绍：</p><p>CONTAINER ID: 容器 ID。</p><p>IMAGE: 使用的镜像。</p><p>COMMAND: 启动容器时运行的命令。</p><p>CREATED: 容器的创建时间。</p><p>STATUS: 容器状态。</p><p>状态有7种：</p><ul class="lvl-0"><li class="lvl-2"><p>created（已创建）</p></li><li class="lvl-2"><p>restarting（重启中）</p></li><li class="lvl-2"><p>running（运行中）</p></li><li class="lvl-2"><p>removing（迁移中）</p></li><li class="lvl-2"><p>paused（暂停）</p></li><li class="lvl-2"><p>exited（停止）</p></li><li class="lvl-2"><p>dead（死亡）</p></li></ul><p>PORTS: 容器的端口信息和使用的连接类型（tcp\udp）。</p><p>NAMES: 自动分配的容器名称。</p><p>2、列出所有容器，包括停止的容器</p><p><code>docker ps -a</code></p><p>显示所有容器，包括停止的容器。</p><p>3、只显示容器 ID</p><p><code>docker ps -q</code></p><p>只显示容器 ID。</p><p>4、显示最近创建的一个容器</p><p><code>docker ps -l</code></p><p>显示最近创建的一个容器，包括所有状态。</p><p>5、显示最近创建的 n 个容器</p><p><code>docker ps -n 3</code></p><p>显示最近创建的 3 个容器，包括所有状态。</p><p>6、显示容器的大小</p><p><code>docker ps -s</code></p><p>显示容器的大小。</p><p>7、根据条件过滤显示的容器</p><p><code>docker ps -f &quot;status=exited&quot;</code></p><p>显示状态为 exited 的容器。</p><p><code>docker ps -f &quot;name=my_container&quot;</code></p><p>显示名称包含 my_container 的容器。</p><p>8、格式化输出</p><p><code>docker ps --format &quot;table &#123;&#123;.ID&#125;&#125;\t&#123;&#123;.Names&#125;&#125;\t&#123;&#123;.Status&#125;&#125;&quot;</code></p><p>以表格形式显示容器的 ID、名称和状态。</p><h3 id="常见过滤器">常见过滤器</h3><ul class="lvl-0"><li class="lvl-2"><p><code>status</code>: 容器状态（如 <code>running</code>、<code>paused</code>、<code>exited</code>）。</p></li><li class="lvl-2"><p><code>name</code>: 容器名称。</p></li><li class="lvl-2"><p><code>id</code>: 容器 ID。</p></li><li class="lvl-2"><p><code>label</code>: 容器标签。</p></li><li class="lvl-2"><p><code>ancestor</code>: 容器镜像。</p></li></ul><h3 id="使用场景">使用场景</h3><ul class="lvl-0"><li class="lvl-2"><p>监控容器状态: 实时监控运行中的容器状态和资源使用情况。</p></li><li class="lvl-2"><p>调试和管理: 查看所有容器，包括停止的容器，以便进行调试和管理操作。</p></li><li class="lvl-2"><p>自动化脚本: 使用过滤器和格式化选项，便于在自动化脚本中获取特定容器信息。</p></li></ul><h1>docker inspect 命令</h1><hr><p><code>docker inspect</code> 命令用于获取 Docker 对象（容器、镜像、卷、网络等）的详细信息。</p><p><code>docker inspect</code> 命令返回 JSON 格式的详细信息，可以帮助用户了解对象的配置和状态。</p><h3 id="语法-2">语法</h3><p><code>docker inspect [OPTIONS] NAME|ID [NAME|ID...]</code></p><p>OPTIONS 说明：</p><ul class="lvl-0"><li class="lvl-2"><p><code>-f, --format</code>: 使用 Go 模板语法格式化输出。</p></li><li class="lvl-2"><p><code>--type</code>: 返回指定类型的对象信息（可选类型：<code>container</code>、<code>image</code>、<code>network</code>、<code>volume</code>）。</p></li></ul><h3 id="实例-2">实例</h3><p>1、检查容器</p><p><code>docker inspect my_container</code></p><p>返回 my_container 容器的详细信息。</p><p>2、检查镜像</p><p><code>docker inspect my_image</code></p><p>返回 my_image 镜像的详细信息。</p><p>3、检查卷</p><p><code>docker inspect my_volume</code></p><p>返回 my_volume 卷的详细信息。</p><p>4、检查网络</p><p><code>docker inspect my_network</code></p><p>返回 my_network 网络的详细信息。</p><p>5、格式化输出</p><p><code>docker inspect --format '&#123;&#123; .State.Running &#125;&#125;' my_container</code></p><p>返回 my_container 容器的运行状态，格式化输出为布尔值。</p><p>6、检查多个对象</p><p><code>docker inspect my_container my_image</code></p><p>返回 my_container 容器和 my_image 镜像的详细信息。</p><h3 id="实例输出">实例输出</h3><p>容器信息：</p><p><code>docker inspect my_container</code></p><p>输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br></pre></td><td class="code"><pre><span class="line">[</span><br><span class="line">    &#123;</span><br><span class="line">        &quot;Id&quot;: &quot;d2f5e3f19a6a&quot;,</span><br><span class="line">        &quot;Created&quot;: &quot;2024-07-23T00:00:00Z&quot;,</span><br><span class="line">        &quot;Path&quot;: &quot;bash&quot;,</span><br><span class="line">        &quot;Args&quot;: [],</span><br><span class="line">        &quot;State&quot;: &#123;</span><br><span class="line">            &quot;Status&quot;: &quot;running&quot;,</span><br><span class="line">            &quot;Running&quot;: true,</span><br><span class="line">            &quot;Paused&quot;: false,</span><br><span class="line">            &quot;Restarting&quot;: false,</span><br><span class="line">            &quot;OOMKilled&quot;: false,</span><br><span class="line">            &quot;Dead&quot;: false,</span><br><span class="line">            &quot;Pid&quot;: 12345,</span><br><span class="line">            &quot;ExitCode&quot;: 0,</span><br><span class="line">            &quot;Error&quot;: &quot;&quot;,</span><br><span class="line">            &quot;StartedAt&quot;: &quot;2024-07-23T00:00:00Z&quot;,</span><br><span class="line">            &quot;FinishedAt&quot;: &quot;0001-01-01T00:00:00Z&quot;</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;Image&quot;: &quot;sha256:abc123&quot;,</span><br><span class="line">        &quot;ResolvConfPath&quot;: &quot;/var/lib/docker/containers/d2f5e3f19a6a/resolv.conf&quot;,</span><br><span class="line">        &quot;HostnamePath&quot;: &quot;/var/lib/docker/containers/d2f5e3f19a6a/hostname&quot;,</span><br><span class="line">        &quot;HostsPath&quot;: &quot;/var/lib/docker/containers/d2f5e3f19a6a/hosts&quot;,</span><br><span class="line">        &quot;LogPath&quot;: &quot;/var/lib/docker/containers/d2f5e3f19a6a/d2f5e3f19a6a-json.log&quot;,</span><br><span class="line">        &quot;Name&quot;: &quot;/my_container&quot;,</span><br><span class="line">        &quot;RestartCount&quot;: 0,</span><br><span class="line">        &quot;Driver&quot;: &quot;overlay2&quot;,</span><br><span class="line">        &quot;Platform&quot;: &quot;linux&quot;,</span><br><span class="line">        &quot;MountLabel&quot;: &quot;&quot;,</span><br><span class="line">        &quot;ProcessLabel&quot;: &quot;&quot;,</span><br><span class="line">        &quot;AppArmorProfile&quot;: &quot;&quot;,</span><br><span class="line">        &quot;ExecIDs&quot;: null,</span><br><span class="line">        &quot;HostConfig&quot;: &#123;</span><br><span class="line">            &quot;Binds&quot;: null,</span><br><span class="line">            &quot;ContainerIDFile&quot;: &quot;&quot;,</span><br><span class="line">            &quot;LogConfig&quot;: &#123;</span><br><span class="line">                &quot;Type&quot;: &quot;json-file&quot;,</span><br><span class="line">                &quot;Config&quot;: &#123;&#125;</span><br><span class="line">            &#125;,</span><br><span class="line">            &quot;NetworkMode&quot;: &quot;default&quot;,</span><br><span class="line">            &quot;PortBindings&quot;: &#123;&#125;,</span><br><span class="line">            &quot;RestartPolicy&quot;: &#123;</span><br><span class="line">                &quot;Name&quot;: &quot;no&quot;,</span><br><span class="line">                &quot;MaximumRetryCount&quot;: 0</span><br><span class="line">            &#125;,</span><br><span class="line">            &quot;AutoRemove&quot;: false,</span><br><span class="line">            &quot;VolumeDriver&quot;: &quot;&quot;,</span><br><span class="line">            &quot;VolumesFrom&quot;: null,</span><br><span class="line">            &quot;CapAdd&quot;: null,</span><br><span class="line">            &quot;CapDrop&quot;: null,</span><br><span class="line">            &quot;Dns&quot;: [],</span><br><span class="line">            &quot;DnsOptions&quot;: [],</span><br><span class="line">            &quot;DnsSearch&quot;: [],</span><br><span class="line">            &quot;ExtraHosts&quot;: null,</span><br><span class="line">            &quot;GroupAdd&quot;: null,</span><br><span class="line">            &quot;IpcMode&quot;: &quot;private&quot;,</span><br><span class="line">            &quot;Cgroup&quot;: &quot;&quot;,</span><br><span class="line">            &quot;Links&quot;: null,</span><br><span class="line">            &quot;OomScoreAdj&quot;: 0,</span><br><span class="line">            &quot;PidMode&quot;: &quot;&quot;,</span><br><span class="line">            &quot;Privileged&quot;: false,</span><br><span class="line">            &quot;PublishAllPorts&quot;: false,</span><br><span class="line">            &quot;ReadonlyRootfs&quot;: false,</span><br><span class="line">            &quot;SecurityOpt&quot;: null,</span><br><span class="line">            &quot;UTSMode&quot;: &quot;&quot;,</span><br><span class="line">            &quot;UsernsMode&quot;: &quot;&quot;,</span><br><span class="line">            &quot;ShmSize&quot;: 67108864,</span><br><span class="line">            &quot;Runtime&quot;: &quot;runc&quot;,</span><br><span class="line">            &quot;ConsoleSize&quot;: [</span><br><span class="line">                0,</span><br><span class="line">                0</span><br><span class="line">            ],</span><br><span class="line">            &quot;Isolation&quot;: &quot;&quot;,</span><br><span class="line">            &quot;CpuShares&quot;: 0,</span><br><span class="line">            &quot;Memory&quot;: 0,</span><br><span class="line">            &quot;NanoCpus&quot;: 0,</span><br><span class="line">            &quot;CgroupParent&quot;: &quot;&quot;,</span><br><span class="line">            &quot;BlkioWeight&quot;: 0,</span><br><span class="line">            &quot;BlkioWeightDevice&quot;: null,</span><br><span class="line">            &quot;BlkioDeviceReadBps&quot;: null,</span><br><span class="line">            &quot;BlkioDeviceWriteBps&quot;: null,</span><br><span class="line">            &quot;BlkioDeviceReadIOps&quot;: null,</span><br><span class="line">            &quot;BlkioDeviceWriteIOps&quot;: null,</span><br><span class="line">            &quot;CpuPeriod&quot;: 0,</span><br><span class="line">            &quot;CpuQuota&quot;: 0,</span><br><span class="line">            &quot;CpuRealtimePeriod&quot;: 0,</span><br><span class="line">            &quot;CpuRealtimeRuntime&quot;: 0,</span><br><span class="line">            &quot;CpusetCpus&quot;: &quot;&quot;,</span><br><span class="line">            &quot;CpusetMems&quot;: &quot;&quot;,</span><br><span class="line">            &quot;Devices&quot;: null,</span><br><span class="line">            &quot;DiskQuota&quot;: 0,</span><br><span class="line">            &quot;KernelMemory&quot;: 0,</span><br><span class="line">            &quot;MemoryReservation&quot;: 0,</span><br><span class="line">            &quot;MemorySwap&quot;: 0,</span><br><span class="line">            &quot;MemorySwappiness&quot;: null,</span><br><span class="line">            &quot;OomKillDisable&quot;: false,</span><br><span class="line">            &quot;PidsLimit&quot;: null,</span><br><span class="line">            &quot;Ulimits&quot;: null,</span><br><span class="line">            &quot;CpuCount&quot;: 0,</span><br><span class="line">            &quot;CpuPercent&quot;: 0,</span><br><span class="line">            &quot;IOMaximumIOps&quot;: 0,</span><br><span class="line">            &quot;IOMaximumBandwidth&quot;: 0,</span><br><span class="line">            &quot;Mounts&quot;: [],</span><br><span class="line">            &quot;MaskedPaths&quot;: [</span><br><span class="line">                &quot;/proc/asound&quot;,</span><br><span class="line">                &quot;/proc/acpi&quot;,</span><br><span class="line">                &quot;/proc/kcore&quot;,</span><br><span class="line">                &quot;/proc/keys&quot;,</span><br><span class="line">                &quot;/proc/latency_stats&quot;,</span><br><span class="line">                &quot;/proc/timer_list&quot;,</span><br><span class="line">                &quot;/proc/timer_stats&quot;,</span><br><span class="line">                &quot;/proc/sched_debug&quot;,</span><br><span class="line">                &quot;/proc/scsi&quot;,</span><br><span class="line">                &quot;/sys/firmware&quot;</span><br><span class="line">            ],</span><br><span class="line">            &quot;ReadonlyPaths&quot;: [</span><br><span class="line">                &quot;/proc/bus&quot;,</span><br><span class="line">                &quot;/proc/fs&quot;,</span><br><span class="line">                &quot;/proc/irq&quot;,</span><br><span class="line">                &quot;/proc/sys&quot;,</span><br><span class="line">                &quot;/proc/sysrq-trigger&quot;</span><br><span class="line">            ]</span><br><span class="line">        &#125;,</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/l/abc123/diff&quot;,</span><br><span class="line">                &quot;MergedDir&quot;: &quot;/var/lib/docker/overlay2/merged&quot;,</span><br><span class="line">                &quot;UpperDir&quot;: &quot;/var/lib/docker/overlay2/upper&quot;,</span><br><span class="line">                &quot;WorkDir&quot;: &quot;/var/lib/docker/overlay2/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;Mounts&quot;: [],</span><br><span class="line">        &quot;Config&quot;: &#123;</span><br><span class="line">            &quot;Hostname&quot;: &quot;d2f5e3f19a6a&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;&#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">            ],</span><br><span class="line">            &quot;Cmd&quot;: [</span><br><span class="line">                &quot;bash&quot;</span><br><span class="line">            ],</span><br><span class="line">            &quot;Image&quot;: &quot;ubuntu&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;: null,</span><br><span class="line">            &quot;OnBuild&quot;: null,</span><br><span class="line">            &quot;Labels&quot;: &#123;&#125;</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;NetworkSettings&quot;: &#123;</span><br><span class="line">            &quot;Bridge&quot;: &quot;&quot;,</span><br><span class="line">            &quot;SandboxID&quot;: &quot;abc123&quot;,</span><br><span class="line">            &quot;HairpinMode&quot;: false,</span><br><span class="line">            &quot;LinkLocalIPv6Address&quot;: &quot;&quot;,</span><br><span class="line">            &quot;LinkLocalIPv6PrefixLen&quot;: 0,</span><br><span class="line">            &quot;Ports&quot;: &#123;&#125;,</span><br><span class="line">            &quot;SandboxKey&quot;: &quot;/var/run/docker/netns/abc123&quot;,</span><br><span class="line">            &quot;SecondaryIPAddresses&quot;: null,</span><br><span class="line">            &quot;SecondaryIPv6Addresses&quot;: null,</span><br><span class="line">            &quot;EndpointID&quot;: &quot;abc123&quot;,</span><br><span class="line">            &quot;Gateway&quot;: &quot;172.17.0.1&quot;,</span><br><span class="line">            &quot;GlobalIPv6Address&quot;: &quot;&quot;,</span><br><span class="line">            &quot;GlobalIPv6PrefixLen&quot;: 0,</span><br><span class="line">            &quot;IPAddress&quot;: &quot;172.17.0.2&quot;,</span><br><span class="line">            &quot;IPPrefixLen&quot;: 16,</span><br><span class="line">            &quot;IPv6Gateway&quot;: &quot;&quot;,</span><br><span class="line">            &quot;MacAddress&quot;: &quot;02:42:ac:11:00:02&quot;,</span><br><span class="line">            &quot;Networks&quot;: &#123;</span><br><span class="line">                &quot;bridge&quot;: &#123;</span><br><span class="line">                    &quot;IPAMConfig&quot;: null,</span><br><span class="line">                    &quot;Links&quot;: null,</span><br><span class="line">                    &quot;Aliases&quot;: null,</span><br><span class="line">                    &quot;NetworkID&quot;: &quot;abc123&quot;,</span><br><span class="line">                    &quot;EndpointID&quot;: &quot;abc123&quot;,</span><br><span class="line">                    &quot;Gateway&quot;: &quot;172.17.0.1&quot;,</span><br><span class="line">                    &quot;IPAddress&quot;: &quot;172.17.0.2&quot;,</span><br><span class="line">                    &quot;IPPrefixLen&quot;: 16,</span><br><span class="line">                    &quot;IPv6Gateway&quot;: &quot;&quot;,</span><br><span class="line">                    &quot;GlobalIPv6Address&quot;: &quot;&quot;,</span><br><span class="line">                    &quot;GlobalIPv6PrefixLen&quot;: 0,</span><br><span class="line">                    &quot;MacAddress&quot;: &quot;02:42:ac:11:00:02&quot;,</span><br><span class="line">                    &quot;DriverOpts&quot;: null</span><br><span class="line">                &#125;</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></pre></td></tr></table></figure><h3 id="使用场景-2">使用场景</h3><ul class="lvl-0"><li class="lvl-2"><p>调试容器: 获取容器的详细配置信息，以便进行调试和排查问题。</p></li><li class="lvl-2"><p>查看网络配置: 查看容器的网络配置信息，了解其网络连接状态。</p></li><li class="lvl-2"><p>监控资源: 获取容器的资源配置信息和使用情况，便于进行资源管理和监控。</p></li><li class="lvl-2"><p>脚本自动化: 在自动化脚本中使用 <code>docker inspect</code> 获取对象的详细信息，以进行后续操作。</p></li></ul><p><code>docker inspect</code> 命令是 Docker 中非常强大和实用的命令之一，允许用户获取容器、镜像、卷、网络等对象的详细信息。通过使用该命令，用户可以深入了解和管理 Docker 对象的配置和状态，满足各种调试、监控和管理需求。</p><h1>Docker top 命令</h1><hr><p><code>docker top</code> 命令用于显示指定容器中的正在运行的进程。</p><p><code>docker top</code> 命令类似于 Linux 中的 <code>top</code> 或 <code>ps</code> 命令，它帮助用户查看容器内的进程信息，便于监控和调试容器内的活动。</p><h3 id="语法-3">语法</h3><p><code>docker top [OPTIONS] CONTAINER [ps OPTIONS]</code></p><p>查看容器内的进程:</p><p><code>docker top my_container</code></p><p>这将显示容器 my_container 中所有正在运行的进程。</p><p>使用自定义 ps 选项:</p><p><code>docker top my_container -o pid,comm</code></p><p>这将显示容器 my_container 中所有正在运行的进程，并只显示 pid 和 comm 列。</p><h3 id="实例-3">实例</h3><p>查看容器内的进程：</p><p><code>docker top my_container</code></p><p>示例输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">UID       PID        PPID      C      STIME    TTY        TIME          CMD</span><br><span class="line">root      1725       1708      0      14:02    ?          00:00:00      bash</span><br><span class="line">root      1767       1725      0      14:03    ?          00:00:00      ps</span><br></pre></td></tr></table></figure><p>自定义输出：</p><p><code>docker top my_container -o pid,comm</code></p><p>示例输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">PID                 COMMAND</span><br><span class="line">1725                bash</span><br><span class="line">1767                ps</span><br></pre></td></tr></table></figure><h3 id="常用场景">常用场景</h3><ul class="lvl-0"><li class="lvl-2"><p>监控容器内部活动: 通过查看容器内的进程，用户可以监控容器内部正在运行的应用程序和服务。</p></li><li class="lvl-2"><p>调试和排查问题: 当容器出现问题时，可以通过 <code>docker top</code> 命令查看容器内的进程，帮助排查问题。</p></li><li class="lvl-2"><p>资源管理: 了解容器内的进程和资源使用情况，便于进行资源管理和优化。</p></li></ul><p><code>docker top</code> 命令是一个有用的工具，帮助用户查看容器内正在运行的进程信息。通过该命令，用户可以监控、调试和管理容器内的活动，确保容器正常运行。</p><h1>Docker attach 命令</h1><hr><p><code>docker attach</code> 命令用于附加到正在运行的 Docker 容器的标准输入、输出和错误输出（stdin、stdout、stderr）。允许用户直接与容器交互，就像与正在运行的进程交互一样。</p><h3 id="语法-4">语法</h3><p><code>docker attach [OPTIONS] CONTAINER</code></p><p>常用选项</p><ul class="lvl-0"><li class="lvl-2"><p><code>--detach-keys</code>: 设置一个在容器中分离的键序列（例如，<code>ctrl-c</code>）。</p></li><li class="lvl-2"><p><code>--no-stdin</code>: 不附加标准输入。</p></li><li class="lvl-2"><p><code>--sig-proxy</code>: 当键盘中断时，将信号代理到容器（默认为 true）。</p></li></ul><h3 id="实例-4">实例</h3><p>附加到正在运行的容器：</p><p><code>docker attach my_container</code></p><p>附加到名为 my_container 的容器，用户可以直接与容器的标准输入、输出和错误输出交互。</p><p>附加到容器并禁用标准输入：</p><p><code>docker attach --no-stdin my_container</code></p><p>附加到 my_container 容器，但不附加标准输入。</p><p>设置分离键序列：</p><p><code>docker attach --detach-keys=&quot;ctrl-c&quot; my_container</code></p><p>附加到 my_container 容器，并设置 ctrl-c 为分离键序列。</p><h3 id="注意事项">注意事项</h3><ul class="lvl-0"><li class="lvl-2"><p>如果附加到一个已经附加了其他会话的容器，所有会话将共享相同的标准输入、输出和错误输出。这意味着多个会话中的输出可能会混杂在一起。</p></li><li class="lvl-2"><p>使用 <code>docker attach</code> 进行交互时，需要注意正确设置分离键序列，以确保能够安全地分离而不停止容器。</p></li></ul><h3 id="常用场景-2">常用场景</h3><ul class="lvl-0"><li class="lvl-2"><p>调试和故障排除: 直接附加到正在运行的容器进行调试和故障排除。</p></li><li class="lvl-2"><p>监控: 实时查看容器内的输出和日志。</p></li><li class="lvl-2"><p>交互操作: 需要与容器内的应用程序进行交互时使用。</p></li></ul><p><code>docker attach</code> 命令是 Docker 中一个有用的命令，允许用户附加到正在运行的容器并与其交互。通过此命令，用户可以实时查看容器的输出，进行调试和故障排除，以及执行其他交互操作。使用适当的选项和分离键序列，可以灵活地管理和控制与容器的交互。</p><h1>Docker events 命令</h1><hr><p><code>docker events</code> 命令用于实时获取 Docker 守护进程生成的事件。</p><p><code>docker events</code> 命令允许用户监控 Docker 容器、镜像、网络和卷的各种操作事件，例如创建、启动、停止、删除等。</p><h3 id="语法-5">语法</h3><p><code>docker events [OPTIONS]</code></p><p>OPTIONS说明：</p><ul class="lvl-0"><li class="lvl-2"><p><code>-f, --filter</code>: 根据提供的条件过滤输出。</p></li><li class="lvl-2"><p><code>--format</code>: 使用 Go 模板格式化输出。</p></li><li class="lvl-2"><p><code>--since</code>: 显示从指定时间开始的事件。</p></li><li class="lvl-2"><p><code>--until</code>: 显示直到指定时间的事件。</p></li></ul><h3 id="实例-5">实例</h3><p>获取所有事件：</p><p><code>docker events</code></p><p>输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">2023-07-22T15:04:05.123456789Z container create 123abc456def (image=ubuntu, name=my_container)</span><br><span class="line">2023-07-22T15:04:06.123456789Z container start 123abc456def (image=ubuntu, name=my_container)</span><br><span class="line">2023-07-22T15:04:10.123456789Z container stop 123abc456def (image=ubuntu, name=my_container)</span><br><span class="line">2023-07-22T15:04:11.123456789Z container destroy 123abc456def (image=ubuntu, name=my_container)</span><br></pre></td></tr></table></figure><p>过滤事件：</p><p><code>docker events --filter event=stop</code></p><p>以上命令只显示容器停止事件。</p><p>输出：</p><p><code>2023-07-22T15:04:10.123456789Z container stop 123abc456def (image=ubuntu, name=my_container)</code></p><p>格式化输出：</p><p><code>docker events --format '&#123;&#123;.Time&#125;&#125; - &#123;&#123;.Type&#125;&#125; - &#123;&#123;.Action&#125;&#125;'</code></p><p>以上命令使用指定格式显示事件。</p><p>输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">2023-07-22T15:04:05.123456789Z - container - create</span><br><span class="line">2023-07-22T15:04:06.123456789Z - container - start</span><br><span class="line">2023-07-22T15:04:10.123456789Z - container - stop</span><br><span class="line">2023-07-22T15:04:11.123456789Z - container - destroy</span><br></pre></td></tr></table></figure><p>显示从指定时间开始的事件：</p><p><code>docker events --since &quot;2023-07-22T15:04:05&quot;</code></p><p>以上命令显示从 2023-07-22T15:04:05 开始的事件。</p><p>显示直到指定时间的事件：</p><p><code>docker events --until &quot;2023-07-22T16:04:05&quot;</code></p><p>以上命令显示直到 2023-07-22T16:04:05 的事件。</p><h1>Docker logs 命令</h1><hr><p><code>docker logs</code> 命令用于获取和查看容器的日志输出。</p><p><code>docker logs</code> 命令非常有用，可以帮助用户调试和监控运行中的容器。</p><h3 id="语法-6">语法</h3><p><code>docker logs [OPTIONS] CONTAINER</code></p><p>常用选项：</p><ul class="lvl-0"><li class="lvl-2"><p><code>-f, --follow</code>: 跟随日志输出（类似于 <code>tail -f</code>）。</p></li><li class="lvl-2"><p><code>--since</code>: 从指定时间开始显示日志。</p></li><li class="lvl-2"><p><code>-t, --timestamps</code>: 显示日志时间戳。</p></li><li class="lvl-2"><p><code>--tail</code>: 仅显示日志的最后部分，例如 <code>--tail 10</code> 显示最后 10 行。</p></li><li class="lvl-2"><p><code>--details</code>: 显示提供给日志的额外详细信息。</p></li><li class="lvl-2"><p><code>--until</code>: 显示直到指定时间的日志。</p></li></ul><h3 id="实例-6">实例</h3><p>显示容器日志</p><p><code>docker logs my_container</code></p><p>显示名为 my_container 的容器的所有日志，输出内容：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">hello world</span><br><span class="line">hello world</span><br><span class="line">hello world</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>跟随日志输出</p><p><code>docker logs -f my_container</code></p><p>持续显示 my_container 的日志输出，输出内容：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">hello world</span><br><span class="line">hello world</span><br><span class="line">hello world</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>显示带时间戳的日志</p><p><code>docker logs -t my_container</code></p><p>显示包含时间戳的日志，输出内容：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">2023-07-22T15:04:05.123456789Z hello world</span><br><span class="line">2023-07-22T15:04:06.123456789Z hello world</span><br><span class="line">2023-07-22T15:04:07.123456789Z hello world</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>从指定时间开始显示日志</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker logs --since=&quot;2023-07-22T15:00:00&quot; my_container</span><br></pre></td></tr></table></figure><p>显示 2023-07-22T15:00:00 之后的日志。</p><p>显示最后 10 行日志</p><p>docker logs --tail 10 my_container</p><p>显示 my_container 的最后 10 行日志。</p><p>显示额外详细信息的日志</p><p>docker logs --details my_container</p><p>显示 my_container 的日志，并包含额外详细信息。</p><p>显示直到指定时间的日志</p><p>docker logs --until=“2023-07-22T16:00:00” my_container</p><p>显示 2023-07-22T16:00:00 之前的日志。</p><h1>Docker wait 命令</h1><hr><p><code>docker wait</code> 命令用于阻塞，直到指定的容器停止运行，然后返回容器的退出代码。</p><p><code>docker wait</code> 命令对于自动化脚本非常有用，因为它可以等待容器完成某项任务，并根据容器的退出状态采取后续操作。</p><h3 id="语法-7">语法</h3><p><code>docker wait [OPTIONS] CONTAINER [CONTAINER...]</code></p><p>等待一个容器停止并获取其退出代码:</p><p>docker wait my_container</p><p>等待多个容器停止并获取它们的退出代码:</p><p>docker wait container1 container2</p><h3 id="实例-7">实例</h3><p>启动一个会立即退出的容器:</p><p>docker run --name test_container ubuntu bash -c “exit 5”</p><p>使用 docker wait 命令等待容器退出并获取退出代码:</p><p>docker wait test_container</p><p>输出：</p><p>5</p><p>此命令等待 test_container 退出，并返回退出代码 5。</p><p>启动多个会立即退出的容器:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">docker run --name test_container1 ubuntu bash -c &quot;exit 1&quot;</span><br><span class="line">docker run --name test_container2 ubuntu bash -c &quot;exit 2&quot;</span><br></pre></td></tr></table></figure><p>使用 docker wait 命令等待多个容器退出并获取它们的退出代码:</p><p>docker wait test_container1 test_container2</p><p>输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td></tr></table></figure><p>此命令等待 test_container1 和 test_container2 退出，并返回它们的退出代码 1 和 2。</p><h3 id="注意事项-2">注意事项</h3><ul class="lvl-0"><li class="lvl-2"><p><code>docker wait</code> 命令会阻塞直到容器停止，因此在长时间运行的容器上使用时需要注意。</p></li><li class="lvl-2"><p>该命令仅返回容器的退出代码，不提供其他关于容器的状态或输出的信息。</p></li></ul><p><code>docker wait</code> 命令是一个简单但非常有用的工具，允许用户等待容器停止并获取其退出代码。通过该命令，用户可以轻松地在脚本中实现任务同步和自动化操作。使用 <code>docker wait</code> 命令，可以确保在指定的容器完成其任务之前，不会进行任何后续操作。</p><h1>Docker export 命令</h1><hr><p><code>docker export</code> 命令用于将 Docker 容器的文件系统导出为一个 tar 归档文件。</p><p><code>docker export</code> 命令主要用于备份或迁移容器的文件系统，而不包括 Docker 镜像的所有层和元数据。</p><h3 id="语法-8">语法</h3><p><code>docker export [OPTIONS] CONTAINER</code></p><p>OPTIONS说明：</p><ul class="lvl-0"><li class="lvl-2"><p><code>-o, --output</code>: 将输出保存到指定文件，而不是输出到标准输出。</p></li></ul><p>导出容器文件系统:</p><p>docker export my_container</p><p>将名为 my_container 的容器的文件系统导出到标准输出。</p><p>将导出文件保存为 tar 文件:</p><p>docker export my_container &gt; my_container_backup.tar</p><p>将容器 my_container 的文件系统导出并保存到 my_container_backup.tar 文件中。</p><p>使用 --output 选项保存导出文件:</p><p>shdocker export -o my_container_backup.tar my_container</p><p>将容器 my_container 的文件系统导出并保存到 my_container_backup.tar 文件中。</p><h3 id="实例-8">实例</h3><p>启动一个容器:</p><p><code>docker run -d --name my_container ubuntu bash -c &quot;echo hello &gt; /hello.txt &amp;&amp; sleep 3600&quot;</code></p><p>导出容器的文件系统:</p><p><code>docker export my_container &gt; my_container_backup.tar</code></p><p>查看导出的 tar 文件内容:</p><p>tar -tf my_container_backup.tar</p><p>输出：</p><p>hello.txt</p><p>导入文件系统到新的容器:</p><p>cat my_container_backup.tar | docker import - my_new_image</p><h3 id="注意事项-3">注意事项</h3><ul class="lvl-0"><li class="lvl-2"><p><code>docker export</code> 只导出容器的文件系统，不包括 Docker 镜像的层、元数据或运行时信息。</p></li><li class="lvl-2"><p>如果容器正在运行，导出的文件系统将是容器当前状态的快照。</p></li><li class="lvl-2"><p>导出的 tar 文件可能会很大，具体取决于容器的文件系统大小。</p></li></ul><p><code>docker export</code> 命令是一个有用的工具，用于将容器的文件系统导出为 tar 归档文件。这对于备份、迁移和分析容器的文件系统非常有用。通过使用 <code>--output</code> 选项，用户可以将导出内容保存为指定文件，方便管理和使用。</p><h1>Docker port 命令</h1><hr><p><code>docker port</code> 命令用于显示容器的端口映射信息，即容器内部的端口如何映射到宿主机的端口。</p><p><code>docker port</code> 命令对于了解容器如何与宿主机网络交互非常有用。</p><h3 id="语法-9">语法</h3><p><code>docker port CONTAINER [PRIVATE_PORT[/PROTO]]</code></p><ul class="lvl-0"><li class="lvl-2"><p><code>CONTAINER</code>: 要查询端口映射的容器的名称或 ID。</p></li><li class="lvl-2"><p><code>PRIVATE_PORT</code> (可选): 容器内部的端口号。</p></li><li class="lvl-2"><p><code>PROTO</code> (可选): 协议类型（<code>tcp</code> 或 <code>udp</code>），默认是 <code>tcp</code>。</p></li></ul><p>查看容器的所有端口映射:</p><p><code>docker port my_container</code></p><p>显示名为 my_container 的容器的所有端口映射信息。</p><p>查看特定端口的映射:</p><p><code>docker port my_container 80</code></p><p>显示名为 my_container 的容器内部的端口 80 映射到宿主机的哪个端口。</p><p>查看特定端口和协议的映射:</p><p><code>docker port my_container 80/tcp</code></p><p>显示名为 my_container 的容器内部的 TCP 端口 80 映射到宿主机的哪个端口。</p><h3 id="实例-9">实例</h3><p>启动一个容器并映射端口:</p><p>docker run -d -p 8080:80 --name my_container nginx</p><p>此命令将 my_container 容器的端口 80 映射到宿主机的端口 8080。</p><p>查看容器的端口映射:</p><p><code>docker port my_container</code></p><p>输出：</p><p>80/tcp -&gt; 0.0.0.0:8080</p><p>显示容器的端口 80 映射到宿主机的 8080 端口。</p><p>查看特定端口的映射:</p><p><code>docker port my_container 80</code></p><p>输出：</p><p>0.0.0.0:8080</p><h3 id="注意事项-4">注意事项</h3><ul class="lvl-0"><li class="lvl-2"><p><code>docker port</code> 命令仅显示端口映射信息，不会显示容器内部运行的服务的状态或其他信息。</p></li><li class="lvl-2"><p>如果容器没有暴露任何端口，或者没有进行端口映射，<code>docker port</code> 命令将不会返回任何信息。</p></li></ul><p><code>docker port</code> 命令是一个用于查看容器端口映射的工具，帮助用户了解容器的端口如何映射到宿主机。通过使用这个命令，用户可以方便地检查和调试容器的网络配置。</p><h1>Docker stats 命令</h1><hr><p><code>docker stats</code> 命令用于实时显示 Docker 容器的资源使用情况，包括 CPU、内存、网络 I/O 和块 I/O。</p><p><code>docker stats</code> 似于 Linux 系统中的 <code>top</code> 命令，但它专门针对 Docker 容器。通过 <code>docker stats</code>，用户可以监控容器的资源使用情况，帮助优化性能和进行故障排除。</p><h3 id="语法-10">语法</h3><p><code>docker stats [OPTIONS] [CONTAINER...]</code></p><p>OPTIONS 说明：</p><ul class="lvl-0"><li class="lvl-2"><p>–all , -a :显示所有的容器，包括未运行的。</p></li><li class="lvl-2"><p>–format :指定返回值的模板文件。</p></li><li class="lvl-2"><p>–no-stream :展示当前状态就直接退出了，不再实时更新。</p></li><li class="lvl-2"><p>–no-trunc :不截断输出。</p></li></ul><p>显示所有运行的容器的资源使用情况:</p><p><code>docker stats</code></p><p>显示指定容器的资源使用情况:</p><p><code>docker stats my_container</code></p><p>显示所有容器（包括未运行的容器）的资源使用情况:</p><p><code>docker stats --all</code></p><p>只显示一次数据而不是持续刷新:</p><p><code>docker stats --no-stream</code></p><p>使用自定义格式输出:</p><p><code>docker stats --format &quot;table &#123;&#123;.Container&#125;&#125;\t&#123;&#123;.CPUPerc&#125;&#125;\t&#123;&#123;.MemUsage&#125;&#125;&quot;</code></p><h3 id="实例-10">实例</h3><p>列出所有在运行的容器信息。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">runoob@runoob:~$  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">b95a83497c91        awesome_brattain                        0.28%               5.629MiB / 1.952GiB   0.28%               916B / 0B           147kB / 0B          9</span><br><span class="line">67b2525d8ad1        foobar                                  0.00%               1.727MiB / 1.952GiB   0.09%               2.48kB / 0B         4.11MB / 0B         2</span><br><span class="line">e5c383697914        test-1951.1.kay7x1lh1twk9c0oig50sd5tr   0.00%               196KiB / 1.952GiB     0.01%               71.2kB / 0B         770kB / 0B          1</span><br><span class="line">4bda148efbc0        random.1.vnc8on831idyr42slu578u3cr      0.00%               1.672MiB / 1.952GiB   0.08%               110kB / 0B          578kB / 0B          2</span><br></pre></td></tr></table></figure><p>输出详情介绍：</p><p>CONTAINER ID 与 NAME: 容器 ID 与名称。</p><p>CPU % 与 MEM %: 容器使用的 CPU 和内存的百分比。</p><p>MEM USAGE / LIMIT: 容器正在使用的总内存，以及允许使用的内存总量。</p><p>NET I/O: 容器通过其网络接口发送和接收的数据量。</p><p>BLOCK I/O: 容器从主机上的块设备读取和写入的数据量。</p><p>PIDs: 容器创建的进程或线程数。</p><p>根据容器等 ID 或名称现实信息：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">runoob@runoob:~$ docker stats awesome_brattain 67b2525d8ad1</span><br><span class="line"></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">b95a83497c91        awesome_brattain    0.28%               5.629MiB / 1.952GiB   0.28%               916B / 0B           147kB / 0B          9</span><br><span class="line">67b2525d8ad1        foobar              0.00%               1.727MiB / 1.952GiB   0.09%               2.48kB / 0B         4.11MB / 0B         2</span><br></pre></td></tr></table></figure><p>以 JSON 格式输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">runoob@runoob:~$ docker stats nginx --no-stream --format &quot;&#123;&#123; json . &#125;&#125;&quot;</span><br><span class="line">  &#123;&quot;BlockIO&quot;:&quot;0B / 13.3kB&quot;,&quot;CPUPerc&quot;:&quot;0.03%&quot;,&quot;Container&quot;:&quot;nginx&quot;,&quot;ID&quot;:&quot;ed37317fbf42&quot;,&quot;MemPerc&quot;:&quot;0.24%&quot;,&quot;MemUsage&quot;:&quot;2.352MiB / 982.5MiB&quot;,&quot;Name&quot;:&quot;nginx&quot;,&quot;NetIO&quot;:&quot;539kB / 606kB&quot;,&quot;PIDs&quot;:&quot;2&quot;&#125;</span><br></pre></td></tr></table></figure><p>输出指定的信息：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">runoob@runoob:~$ docker stats --all --format &quot;table &#123;&#123;.Container&#125;&#125;\t&#123;&#123;.CPUPerc&#125;&#125;\t&#123;&#123;.MemUsage&#125;&#125;&quot; fervent_panini 5acfcb1b4fd1 drunk_visvesvaraya big_heisenberg</span><br><span class="line">  &#123;&quot;BlockIO&quot;:&quot;0B / 13.3kB&quot;,&quot;CPUPerc&quot;:&quot;0.03%&quot;,&quot;Container&quot;:&quot;nginx&quot;,&quot;ID&quot;:&quot;ed37317fbf42&quot;,&quot;MemPerc&quot;:&quot;0.24%&quot;,&quot;MemUsage&quot;:&quot;2.352MiB / 982.5MiB&quot;,&quot;Name&quot;:&quot;nginx&quot;,&quot;NetIO&quot;:&quot;539kB / 606kB&quot;,&quot;PIDs&quot;:&quot;2&quot;&#125;</span><br><span class="line"></span><br><span class="line">CONTAINER                CPU %               MEM USAGE / LIMIT</span><br><span class="line">fervent_panini           0.00%               56KiB / 15.57GiB</span><br><span class="line">5acfcb1b4fd1             0.07%               32.86MiB / 15.57GiB</span><br><span class="line">drunk_visvesvaraya       0.00%               0B / 0B</span><br><span class="line">big_heisenberg           0.00%               0B / 0B</span><br></pre></td></tr></table></figure><h3 id="常用场景-3">常用场景</h3><ul class="lvl-0"><li class="lvl-2"><p>实时监控: 实时查看容器的资源使用情况，以便进行性能监控和优化。</p></li><li class="lvl-2"><p>故障排除: 在容器出现问题时，检查资源使用情况，帮助排查问题根源。</p></li><li class="lvl-2"><p>资源管理: 监控容器的资源使用情况，确保资源分配合理，避免资源浪费或瓶颈。</p></li></ul><p><code>docker stats</code> 命令是一个强大的工具，用于实时监控 Docker 容器的资源使用情况。通过该命令，用户可以获取容器的 CPU、内存、网络 I/O 和块 I/O 的详细信息，帮助进行性能优化、故障排除和资源管理。</p><h1>Docker update 命令</h1><hr><p><code>docker update</code> 命令用于更新 Docker 容器的资源限制，包括内存、CPU 等。</p><p><code>docker update</code>命令可以在容器运行时动态调整资源限制，而不需要停止和重新启动容器。</p><h3 id="语法-11">语法</h3><p><code>docker update [OPTIONS] CONTAINER [CONTAINER...]</code></p><h3 id="常用参数">常用参数</h3><ul class="lvl-0"><li class="lvl-2"><p><code>CONTAINER</code>：要更新资源限制的容器名称或容器 ID。你可以指定一个或多个容器。</p></li><li class="lvl-2"><p><code>OPTIONS</code>：用于指定需要更新的资源限制。</p></li></ul><p>常用选项 OPTIONS：</p><p>1、<code>--memory, -m</code>：设置容器的内存限制。</p><ul class="lvl-0"><li class="lvl-2"><p>格式：<code>&lt;size&gt;[&lt;unit&gt;]</code></p></li><li class="lvl-2"><p>例如：<code>500m</code>、<code>2g</code> 等。</p></li></ul><p>docker update -m 2g my_container</p><p>2、<code>--memory-swap</code>：设置容器的内存和交换空间（swap）的总限制。如果设置为 <code>-1</code>，表示不限制交换空间。</p><ul class="lvl-0"><li class="lvl-2"><p>格式：<code>&lt;size&gt;[&lt;unit&gt;]</code>，如 <code>2g</code>，或 <code>-1</code> 表示无限制。</p></li></ul><p>docker update --memory-swap 3g my_container</p><p>3、<code>--cpu-shares</code>：设置容器的 CPU 优先级，相对值。默认为 <code>1024</code>，较大的值表示较高的优先级。</p><ul class="lvl-0"><li class="lvl-2"><p>该选项不会直接限制容器的 CPU 使用量，而是控制 CPU 资源分配的优先级。</p></li></ul><p>docker update --cpu-shares 2048 my_container</p><p>4、<code>--cpus</code>：设置容器使用的 CPU 核心数。这个选项可以限制容器最多使用的 CPU 核心数。</p><ul class="lvl-0"><li class="lvl-2"><p>格式：<code>&lt;number&gt;</code>，例如：<code>1.5</code> 表示最多使用 1.5 个 CPU 核心。</p></li></ul><p>docker update --cpus 2 my_container</p><p>5、<code>--cpu-period</code>：设置 CPU 周期时间。用于配合 <code>--cpu-quota</code> 限制容器的 CPU 使用时间。单位是微秒（默认值：<code>100000</code> 微秒 = 100ms）。</p><p>docker update --cpu-period 50000 my_container</p><p>6、<code>--cpu-quota</code>：设置容器在每个周期内可以使用的最大 CPU 时间。单位是微秒。需要与 <code>--cpu-period</code> 配合使用。</p><p>docker update --cpu-quota 25000 my_container</p><p>7、<code>--blkio-weight</code>：设置块 I/O 权重（范围：<code>10</code> 到 <code>1000</code>），表示容器对磁盘 I/O 操作的优先级。默认值为 <code>500</code>。</p><p>docker update --blkio-weight 800 my_container</p><p>8、<code>--pids-limit</code>：设置容器可以使用的最大进程数。</p><ul class="lvl-0"><li class="lvl-2"><p>格式：<code>&lt;number&gt;</code>，例如：<code>100</code>。</p></li></ul><p>docker update --pids-limit 200 my_container</p><p>9、<code>--restart</code>：设置容器的重启策略（<code>no</code>、<code>on-failure</code>、<code>always</code>、<code>unless-stopped</code>）。</p><p>docker update --restart always my_container</p><h3 id="实例-11">实例</h3><ol><li class="lvl-3"><p>更新容器的内存限制：</p></li></ol><p>docker update -m 2g my_container这条命令将 my_container 的内存限制更新为 2GB。</p><ol start="2"><li class="lvl-3"><p>设置 CPU 核心数限制：</p></li></ol><p>docker update --cpus 1.5 my_container</p><p>这条命令将 my_container 限制为最多使用 1.5 个 CPU 核心。</p><ol start="3"><li class="lvl-3"><p>更新容器的 CPU 权重：</p></li></ol><p>docker update --cpu-shares 1024 my_container</p><p>这条命令将容器的 CPU 权重设置为 1024，默认值就是 1024。</p><ol start="4"><li class="lvl-3"><p>更新容器的块 I/O 权重：</p></li></ol><p>docker update --blkio-weight 700 my_container</p><p>这条命令将容器的磁盘 I/O 权重设置为 700，权重范围是 10 到 1000。</p><h3 id="使用限制">使用限制</h3><ul class="lvl-0"><li class="lvl-2"><p><code>docker update</code> 命令会立即生效，但并不会影响容器内运行的应用程序，容器继续保持运行状态。</p></li><li class="lvl-2"><p>仅支持调整容器的资源限制，对于其他容器配置（如环境变量、端口映射等）无法修改。</p></li></ul>]]></content>
    
    
    <summary type="html">docker</summary>
    
    
    
    <category term="学习" scheme="http://zxwlove.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="笔记" scheme="http://zxwlove.xyz/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="学习" scheme="http://zxwlove.xyz/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="Docker" scheme="http://zxwlove.xyz/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Docker命令-容器生命周期管理</title>
    <link href="http://zxwlove.xyz/posts/docker02.html"/>
    <id>http://zxwlove.xyz/posts/docker02.html</id>
    <published>2025-01-15T04:12:12.000Z</published>
    <updated>2025-03-09T12:42:31.956Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><h1>Docker run 命令</h1><hr><p>docker run 命令用于创建并启动一个新的容器。</p><h3 id="语法">语法</h3><p><code>docker run [OPTIONS] IMAGE [COMMAND] [ARG...]</code></p><p>常用参数说明：</p><ul class="lvl-0"><li class="lvl-2"><p><code>-d</code>: 后台运行容器并返回容器 ID。</p></li><li class="lvl-2"><p><code>-it</code>: 交互式运行容器，分配一个伪终端。</p></li><li class="lvl-2"><p><code>--name</code>: 给容器指定一个名称。</p></li><li class="lvl-2"><p><code>-p</code>: 端口映射，格式为 <code>host_port:container_port</code>。</p></li><li class="lvl-2"><p><code>-v</code>: 挂载卷，格式为 <code>host_dir:container_dir</code>。</p></li><li class="lvl-2"><p><code>--rm</code>: 容器停止后自动删除容器。</p></li><li class="lvl-2"><p><code>--env</code> 或 <code>-e</code>: 设置环境变量。</p></li><li class="lvl-2"><p><code>--network</code>: 指定容器的网络模式。</p></li><li class="lvl-2"><p><code>--restart</code>: 容器的重启策略（如 <code>no</code>、<code>on-failure</code>、<code>always</code>、<code>unless-stopped</code>）。</p></li><li class="lvl-2"><p><code>-u</code>: 指定用户。</p></li></ul><h3 id="实例">实例</h3><ol><li class="lvl-3"><p>基本使用</p></li></ol><p><code>docker run ubuntu</code></p><p>拉取 ubuntu 镜像并在前台启动一个容器。</p><ol start="2"><li class="lvl-3"><p>后台运行容器</p></li></ol><p><code>docker run -d ubuntu</code></p><p>在后台运行 ubuntu 容器并返回容器 ID。</p><ol start="3"><li class="lvl-3"><p>交互式运行并分配终端</p></li></ol><p><code>docker run -it ubuntu /bin/bash</code></p><p>以交互模式运行 ubuntu 容器，并启动一个 Bash shell。</p><ol start="4"><li class="lvl-3"><p>指定容器名称</p></li></ol><p><code>docker run --name my_container ubuntu</code></p><p>运行一个 ubuntu 容器，并将其命名为 my_container。</p><ol start="5"><li class="lvl-3"><p>端口映射</p></li></ol><p><code>docker run -p 8080:80 nginx</code></p><p>将本地主机的 8080 端口映射到容器内的 80 端口，运行 nginx 容器。</p><ol start="6"><li class="lvl-3"><p>挂载卷</p></li></ol><p><code>docker run -v /host/data:/container/data ubuntu</code></p><p>将主机的 /host/data 目录挂载到容器内的 /container/data 目录。</p><ol start="7"><li class="lvl-3"><p>设置环境变量</p></li></ol><p><code>docker run -e MY_ENV_VAR=my_value ubuntu</code></p><p>设置环境变量 MY_ENV_VAR 的值为 my_value，运行 ubuntu 容器。</p><ol start="8"><li class="lvl-3"><p>使用网络模式</p></li></ol><p><code>docker run --network host nginx</code></p><p>使用主机的网络模式运行 nginx 容器。</p><ol start="9"><li class="lvl-3"><p>指定重启策略</p></li></ol><p><code>docker run --restart always nginx</code></p><p>设置容器的重启策略为 always，即使容器停止也会自动重启。</p><ol start="10"><li class="lvl-4"><p>指定用户</p></li></ol><p><code>docker run -u user123 ubuntu</code></p><p>以 user123 用户运行 ubuntu 容器。</p><ol start="11"><li class="lvl-4"><p>组合多个选项</p></li></ol><p><code>docker run -d -p 8080:80 -v /host/data:/data --name webserver nginx</code></p><p>后台运行一个命名为 webserver 的 nginx 容器，将主机的 8080 端口映射到容器的 80 端口，并将主机的 /host/data 目录挂载到容器的 /data 目录。</p><h1>Docker start/stop/restart 命令</h1><hr><p>docker start 命令用于启动一个或多个已经创建的容器。</p><p>docker stop 命令用于停止一个运行中的容器。</p><p>docker restart 命令用于重启容器。</p><hr><h2 id="docker-start-命令">docker start 命令</h2><h3 id="语法-2">语法</h3><p><code>docker start [OPTIONS] CONTAINER [CONTAINER...]</code></p><p>参数</p><ul class="lvl-0"><li class="lvl-2"><p><code>-a</code>: 附加到容器的标准输入输出流。</p></li><li class="lvl-2"><p><code>-i</code>: 附加并保持标准输入打开。</p></li></ul><h3 id="实例-2">实例</h3><p>启动一个容器:</p><p><code>docker start my_container</code></p><p>启动名称为 my_container 的容器。</p><p>启动并附加到容器:</p><p><code>docker start -a my_container</code></p><p>启动容器并附加到它的标准输入输出流。</p><p>同时启动多个容器:</p><p><code>docker start container1 container2 container3</code></p><p>同时启动 container1、container2 和 container3 容器。</p><hr><h2 id="docker-stop-命令">docker stop 命令</h2><h3 id="语法-3">语法</h3><p><code>docker stop [OPTIONS] CONTAINER [CONTAINER...]</code></p><p>参数</p><p>-t, --time: 停止容器之前等待的秒数，默认是 10 秒。</p><h3 id="实例-3">实例</h3><p>停止一个容器:</p><p><code>docker stop my_container</code></p><p>停止名称为 my_container 的容器。</p><p>指定等待时间停止容器:</p><p><code>docker stop -t 30 my_container</code></p><p>等待 30 秒后停止容器。</p><p>同时停止多个容器:</p><p><code>docker stop container1 container2 container3</code></p><p>同时停止 container1、container2 和 container3 容器。</p><hr><h2 id="docker-restart-命令">docker restart 命令</h2><h3 id="语法-4">语法</h3><p><code>docker restart [OPTIONS] CONTAINER [CONTAINER...]</code></p><p>参数</p><p>-t, --time: 重启容器之前等待的秒数，默认是 10 秒。</p><h3 id="实例-4">实例</h3><p>重启一个容器:</p><p><code>docker restart my_container</code></p><p>重启名称为 my_container 的容器。</p><p>指定等待时间重启容器:</p><p><code>docker restart -t 15 my_container</code></p><p>等待 15 秒后重启容器。</p><p>同时重启多个容器:</p><p><code>docker restart container1 container2 container3</code></p><p>同时重启 container1、container2 和 container3 容器。</p><h1>Docker kill 命令</h1><hr><p>docker kill 命令用于立即终止一个或多个正在运行的容器。</p><p>与 docker stop 命令不同，docker kill 命令会直接发送 SIGKILL 信号给容器的主进程，导致容器立即停止，而不会进行优雅的关闭。</p><h3 id="语法-5">语法</h3><p><code>docker kill [OPTIONS] CONTAINER [CONTAINER...]</code></p><p>OPTIONS说明：</p><ul class="lvl-0"><li class="lvl-2"><p><code>-s, --signal</code>: 发送给容器的信号（默认为 SIGKILL）。</p></li></ul><p>常用信号</p><ul class="lvl-0"><li class="lvl-2"><p>SIGKILL: 强制终止进程（默认信号）。</p></li><li class="lvl-2"><p>SIGTERM: 请求进程终止。</p></li><li class="lvl-2"><p>SIGINT: 发送中断信号，通常表示用户请求终止。</p></li><li class="lvl-2"><p>SIGHUP: 挂起信号，通常表示终端断开。</p></li></ul><h3 id="实例-5">实例</h3><p>立即终止一个容器:</p><p><code>docker kill my_container</code></p><p>立即终止名称为 my_container 的容器。</p><p>发送自定义信号:</p><p><code>docker kill -s SIGTERM my_container</code></p><p>向名称为 my_container 的容器发送 SIGTERM 信号，而不是默认的 SIGKILL 信号。</p><p>同时终止多个容器:</p><p><code>docker kill container1 container2 container3</code></p><p>立即终止 container1、container2 和 container3 容器。</p><p><code>docker kill</code> 命令用于立即终止一个或多个正在运行的容器，通过发送信号（默认 SIGKILL）给容器的主进程实现。与 <code>docker stop</code> 不同，<code>docker kill</code> 不会等待容器优雅地停止，而是直接终止进程。该命令在需要快速停止容器时非常有用，但应谨慎使用以避免数据损失或不一致。</p><h1>Docker rm 命令</h1><hr><p>docker rm 命令用于删除一个或多个已经停止的容器。</p><p>docker rm 命令不会删除正在运行的容器，如果你需要先停止容器，可以使用 docker stop 命令。</p><h3 id="语法-6">语法</h3><p><code>docker rm [OPTIONS] CONTAINER [CONTAINER...]</code></p><ul class="lvl-0"><li class="lvl-2"><p><code>CONTAINER [CONTAINER...]</code>: 一个或多个要删除的容器的名称或 ID。</p></li></ul><p>OPTIONS说明：</p><ul class="lvl-0"><li class="lvl-2"><p><code>-f</code>, <code>--force</code>: 强制删除正在运行的容器（使用 <code>SIGKILL</code> 信号）。</p></li><li class="lvl-2"><p><code>-l</code>, <code>--link</code>: 删除指定的连接，而不是容器本身。</p></li><li class="lvl-2"><p><code>-v</code>, <code>--volumes</code>: 删除容器挂载的卷。</p></li></ul><p>删除单个容器：</p><p><code>docker rm &lt;container_id_or_name&gt;</code></p><p>你可以一次性删除多个容器，只需将容器 ID 或名称用空格分隔：</p><p><code>docker rm &lt;container_id_or_name1&gt; &lt;container_id_or_name2&gt; ...</code></p><p>你可以使用以下命令来删除所有已停止的容器：</p><p><code>docker container prune</code>这个命令会提示你确认删除所有已停止的容器。</p><h3 id="实例-6">实例</h3><p>假设你有以下两个容器：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">CONTAINER ID        IMAGE          COMMAND             CREATED             STATUS              PORTS      NAMES</span><br><span class="line">abcd1234            nginx         &quot;nginx -g &#x27;daemon…&quot; 2 minutes ago       Exited (0) 1 minute ago        my_nginx</span><br><span class="line">efgh5678            redis        &quot;redis-server&quot;      3 minutes ago       Exited (0) 2 minutes ago       my_redis</span><br></pre></td></tr></table></figure><p>你可以使用以下命令删除它们：</p><p>docker rm abcd1234 efgh5678</p><p>或者，你可以使用容器名称删除它们：</p><p>docker rm my_nginx my_redis</p><p>删除所有已经停止的容器：</p><p>docker rm $(docker ps -a -q)</p><p>杀死所有正在运行的容器</p><p><code>docker kill $(docker ps -a -q)</code></p><p>删除所有未打 dangling 标签的镜像</p><p><code>docker rmi $(docker images -q -f dangling=true)</code></p><p>通过镜像的id来删除指定镜像</p><p><code>docker rmi &lt;image id&gt;</code></p><p>删除所有镜像</p><p><code>docker rmi $(docker images -q)</code></p><p>为这些命令创建别名</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"># ~/.bash_aliases</span><br><span class="line"></span><br><span class="line"># 杀死所有正在运行的容器.</span><br><span class="line">alias dockerkill=&#x27;docker kill $(docker ps -a -q)&#x27;</span><br><span class="line"></span><br><span class="line"># 删除所有已经停止的容器.</span><br><span class="line">alias dockercleanc=&#x27;docker rm $(docker ps -a -q)&#x27;</span><br><span class="line"></span><br><span class="line"># 删除所有未打标签的镜像.</span><br><span class="line">alias dockercleani=&#x27;docker rmi $(docker images -q -f dangling=true)&#x27;</span><br><span class="line"></span><br><span class="line"># 删除所有已经停止的容器和未打标签的镜像.</span><br><span class="line">alias dockerclean=&#x27;dockercleanc || true &amp;&amp; dockercleani&#x27;</span><br></pre></td></tr></table></figure><h1>Docker pause/unpause 命令</h1><hr><p>docker pause 和 docker unpause 命令用于暂停和恢复容器中的所有进程。</p><p>docker pause - 暂停容器中所有的进程。</p><p>docker unpause - 恢复容器中所有的进程。</p><p>暂停的容器不会被终止，但其进程将被挂起，直到容器被恢复。这在需要临时暂停容器活动的情况下非常有用。</p><hr><h2 id="docker-pause-命令">docker pause 命令</h2><p>docker pause 命令用于暂停一个或多个容器中的所有进程。</p><h3 id="语法-7">语法</h3><p><code>docker pause CONTAINER [CONTAINER...]</code></p><h3 id="实例-7">实例</h3><p>暂停一个容器：</p><p><code>docker pause my_container</code></p><p>暂停名称为 my_container 的容器中的所有进程。</p><p>暂停多个容器：</p><p><code>docker pause container1 container2</code></p><p>同时暂停 container1 和 container2 容器中的所有进程。</p><hr><h2 id="docker-unpause-命令">docker unpause 命令</h2><p>docker unpause 命令用于恢复一个或多个已暂停容器中的所有进程。</p><h3 id="语法-8">语法</h3><p><code>docker unpause CONTAINER [CONTAINER...]</code></p><h3 id="实例-8">实例</h3><p>恢复一个容器：</p><p><code>docker unpause my_container</code></p><p>恢复名称为 my_container 的容器中的所有进程。</p><p>恢复多个容器：</p><p><code>docker unpause container1 container2</code></p><p>同时恢复 container1 和 container2 容器中的所有进程。</p><h3 id="使用场景">使用场景</h3><ul class="lvl-0"><li class="lvl-2"><p>临时暂停活动: 当需要临时暂停容器中的所有活动以进行系统维护或资源管理时，可以使用 <code>docker pause</code>。</p></li><li class="lvl-2"><p>资源管理: 在需要重新分配系统资源时，暂停不必要的容器以释放资源。</p></li><li class="lvl-2"><p>调试和故障排除: 在调试或故障排除过程中暂停容器以分析当前状态。</p></li></ul><h3 id="总结">总结</h3><ul class="lvl-0"><li class="lvl-2"><p><code>docker pause</code>: 用于暂停容器中的所有进程。暂停的容器仍然存在，但其进程将挂起，直到恢复。</p></li><li class="lvl-2"><p><code>docker unpause</code>: 用于恢复已暂停容器中的所有进程，使其恢复正常运行。</p></li></ul><h1>Docker create 命令</h1><hr><p><code>docker create</code> 命令用于创建一个新的容器，但不会启动它。</p><p><code>docker create</code> 命令会根据指定的镜像和参数创建一个容器实例，但容器只会在创建时进行初始化，并不会执行任何进程。</p><p>用法同 [docker run]。</p><h3 id="语法-9">语法</h3><p><code>docker create [OPTIONS] IMAGE [COMMAND] [ARG...]</code></p><h3 id="常用参数">常用参数</h3><ul class="lvl-0"><li class="lvl-2"><p><code>--name</code>: 给容器指定一个名称。</p></li><li class="lvl-2"><p><code>-p, --publish</code>: 端口映射，格式为 <code>host_port:container_port</code>。</p></li><li class="lvl-2"><p><code>-v, --volume</code>: 挂载卷，格式为 <code>host_dir:container_dir</code>。</p></li><li class="lvl-2"><p><code>-e, --env</code>: 设置环境变量。</p></li><li class="lvl-2"><p><code>--network</code>: 指定容器的网络模式。</p></li><li class="lvl-2"><p><code>--restart</code>: 容器的重启策略（如 <code>no</code>、<code>on-failure</code>、<code>always</code>、<code>unless-stopped</code>）。</p></li><li class="lvl-2"><p><code>-u, --user</code>: 指定用户。</p></li><li class="lvl-2"><p><code>--entrypoint</code>: 覆盖容器的默认入口点。</p></li><li class="lvl-2"><p><code>--detach</code>: 在后台创建容器。</p></li></ul><h3 id="实例-9">实例</h3><p>创建一个容器：</p><p><code>docker create ubuntu</code></p><p>根据 ubuntu 镜像创建一个容器，但不会启动它。</p><p>创建并指定容器名称：</p><p><code>docker create --name my_container ubuntu</code></p><p>创建一个名为 my_container 的容器，但不会启动它。</p><p>创建并设置环境变量：</p><p><code>docker create -e MY_ENV_VAR=my_value ubuntu</code></p><p>创建一个容器，并设置环境变量 MY_ENV_VAR 的值为 my_value。</p><p>创建并挂载卷：</p><p><code>docker create -v /host/data:/container/data ubuntu</code></p><p>创建一个容器，并将主机的 /host/data 目录挂载到容器的 /container/data 目录。</p><p>创建并端口映射：</p><p><code>docker create -p 8080:80 nginx</code></p><p>创建一个容器，将本地主机的 8080 端口映射到容器的 80 端口，但不会启动它。</p><p>创建并指定重启策略：</p><p><code>docker create --restart always nginx</code></p><p>创建一个容器，并将重启策略设置为 always。</p><p>创建并指定用户：</p><p><code>docker create -u user123 ubuntu</code></p><p>创建一个容器，并以 user123 用户运行容器。</p><h3 id="查看容器">查看容器</h3><p>在创建容器之后，可以使用 docker ps -a 命令查看所有容器，包括已创建但未启动的容器。</p><p><code>docker ps -a</code></p><h3 id="启动已创建的容器">启动已创建的容器</h3><p>使用 docker start 命令来启动已创建但未启动的容器：</p><p><code>docker start my_container</code></p><h3 id="总结-2">总结</h3><ul class="lvl-0"><li class="lvl-2"><p><code>docker create</code>: 用于创建一个新的容器实例但不启动它。可以通过各种参数设置容器的配置。</p></li><li class="lvl-2"><p><code>docker start</code>: 启动已创建的容器，使其开始运行。</p></li></ul><p><code>docker create</code> 命令允许用户预先配置容器的设置，并在需要时手动启动容器，这对于自动化部署和测试场景特别有用。</p><h1>Docker exec 命令</h1><hr><p><code>docker exec</code> 命令用于在运行中的容器内执行一个新的命令。这对于调试、运行附加的进程或在容器内部进行管理操作非常有用。</p><h3 id="语法-10">语法</h3><p><code>docker exec [OPTIONS] CONTAINER COMMAND [ARG...]</code></p><h3 id="常用参数-2">常用参数</h3><ul class="lvl-0"><li class="lvl-2"><p><code>-d, --detach</code>: 在后台运行命令。</p></li><li class="lvl-2"><p><code>--detach-keys</code>: 覆盖分离容器的键序列。</p></li><li class="lvl-2"><p><code>-e, --env</code>: 设置环境变量。</p></li><li class="lvl-2"><p><code>--env-file</code>: 从文件中读取环境变量。</p></li><li class="lvl-2"><p><code>-i, --interactive</code>: 保持标准输入打开。</p></li><li class="lvl-2"><p><code>--privileged</code>: 给这个命令额外的权限。</p></li><li class="lvl-2"><p><code>--user, -u</code>: 以指定用户的身份运行命令。</p></li><li class="lvl-2"><p><code>--workdir, -w</code>: 指定命令的工作目录。</p></li><li class="lvl-2"><p><code>-t, --tty</code>: 分配一个伪终端。</p></li></ul><h3 id="实例-10">实例</h3><p>在容器内运行命令：</p><p><code>docker exec my_container ls /app</code></p><p>在运行中的 my_container 容器内执行 ls /app 命令，列出 /app 目录的内容。</p><p>以交互模式运行命令：</p><p><code>docker exec -it my_container /bin/bash</code></p><p>在运行中的 my_container 容器内启动一个交互式的 Bash shell。-i 保持标准输入打开，-t 分配一个伪终端。</p><p>在后台运行命令：</p><p><code>docker exec -d my_container touch /app/newfile.txt</code></p><p>在运行中的 my_container 容器内后台执行 touch /app/newfile.txt 命令，创建一个新文件。</p><p>设置环境变量：</p><p><code>docker exec -e MY_ENV_VAR=my_value my_container env</code></p><p>在运行中的 my_container 容器内执行 env 命令，并设置环境变量 MY_ENV_VAR 的值为 my_value。</p><p>以指定用户身份运行命令：</p><p><code>docker exec -u user123 my_container whoami</code></p><p>在运行中的 my_container 容器内以 user123 用户身份执行 whoami 命令。</p><p>指定工作目录：</p><p><code>docker exec -w /app my_container pwd</code></p><p>在运行中的 my_container 容器内以 /app 目录为工作目录执行 pwd 命令。</p><h3 id="使用场景-2">使用场景</h3><ul class="lvl-0"><li class="lvl-2"><p>调试容器: 进入容器内部进行调试和排查问题。</p></li><li class="lvl-2"><p>管理任务: 在容器内运行附加的管理任务或维护操作。</p></li><li class="lvl-2"><p>监控和检查: 在容器内执行监控和检查命令，获取运行状态和日志。</p></li></ul><h3 id="总结-3">总结</h3><p><code>docker exec</code> 命令是 Docker 中非常强大的工具，允许用户在运行中的容器内执行额外的命令。这对于调试、管理和维护容器非常有用，能够帮助用户更灵活地控制和操作容器内部的环境。</p><h1>Docker rename 命令</h1><hr><p>docker rename 命令用于重命名已存在的容器。该命令允许你在不停止或删除容器的情况下，直接修改容器的名称。</p><h3 id="语法-11">语法</h3><p><code>docker rename &lt;当前容器名称或ID&gt; &lt;新容器名称&gt;</code></p><p>常用参数说明：</p><ul class="lvl-0"><li class="lvl-2"><p>当前容器名称或ID：需要修改名称的现有容器的名称或者 ID。</p></li><li class="lvl-2"><p>新容器名称：将容器重命名为指定的新名称。这个名称必须唯一，不能与其他正在运行的容器冲突。</p></li></ul><h3 id="实例-11">实例</h3><p>1、重命名容器</p><p>假设有一个正在运行的容器，名称为 my_old_container，并且需要将它重命名为 my_new_container：</p><p><code>docker rename my_old_container my_new_container</code></p><p>执行成功后，容器的名称将变为 my_new_container。你可以通过以下命令确认：</p><p><code>docker ps -a</code></p><p>2、使用容器 ID 重命名</p><p>如果你不知道容器的名称，但知道其 ID，可以使用容器的 ID 来重命名。例如：</p><p><code>docker rename 123abc456def my_new_container</code></p><p>同样，123abc456def 是容器的 ID，重命名后可以通过 docker ps -a 查看。</p><p>3、检查是否重名</p><p>如果你尝试重命名的名称已经被其他容器使用，Docker 会返回错误：</p><p><code>docker rename my_old_container existing_container_name</code></p><p>输出：</p><p><code>Error response from daemon: Conflict. The container name &quot;/existing_container_name&quot; is already in use by container &quot;abc123&quot;. You have to remove (or rename) that container to be able to reuse that name.</code></p><p>此时需要先重命名或移除 existing_container_name 的容器，然后再进行操作。</p>]]></content>
    
    
    <summary type="html">docker</summary>
    
    
    
    <category term="学习" scheme="http://zxwlove.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="笔记" scheme="http://zxwlove.xyz/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="学习" scheme="http://zxwlove.xyz/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="Docker" scheme="http://zxwlove.xyz/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Docker安装</title>
    <link href="http://zxwlove.xyz/posts/docker01.html"/>
    <id>http://zxwlove.xyz/posts/docker01.html</id>
    <published>2025-01-05T08:56:13.000Z</published>
    <updated>2025-01-07T02:52:22.589Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><p>启动Docker</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl start docker</span><br><span class="line"><span class="section"># service docker start</span></span><br></pre></td></tr></table></figure><p>停止docker：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl stop docker</span><br></pre></td></tr></table></figure><p>重启docker：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl restart docker</span><br></pre></td></tr></table></figure><hr><h2 id="Linux系统安装docker">Linux系统安装docker</h2><h3 id="ubuntu安装docker">ubuntu安装docker</h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update &amp;&amp; sudo apt upgrade -y</span><br></pre></td></tr></table></figure><ol><li class="lvl-3"><p>准备条件</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line"><span class="section">#安装前先卸载操作系统默认安装的docker，</span></span><br><span class="line">sudo apt-get remove docker docker-engine docker.io containerd runc</span><br><span class="line"></span><br><span class="line"><span class="section">#安装必要支持</span></span><br><span class="line">sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release</span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>准备安装</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># 添加 Docker 官方 GPG key （可能国内现在访问会存在问题）</span></span><br><span class="line">curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg</span><br><span class="line"></span><br><span class="line"><span class="section"># 阿里源（推荐使用阿里的gpg KEY）</span></span><br><span class="line">curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg</span><br><span class="line"></span><br><span class="line"><span class="section"># 添加 apt 源:</span></span><br><span class="line"><span class="section"># Docker官方源</span></span><br><span class="line">echo &quot;deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb<span class="emphasis">_release -cs) stable&quot; | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis"># 阿里apt源</span></span><br><span class="line"><span class="emphasis">echo &quot;deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_</span>release -cs) stable&quot; | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null</span><br><span class="line"></span><br><span class="line"><span class="section"># 更新源</span></span><br><span class="line">sudo apt update &amp;&amp; sudo apt upgrade -y</span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>安装docker</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># 安装最新版本的Docker</span></span><br><span class="line">sudo apt install docker-ce docker-ce-cli containerd.io</span><br><span class="line"><span class="section"># 等待安装完成</span></span><br><span class="line"><span class="section"># 查看Docker版本</span></span><br><span class="line">sudo docker version</span><br><span class="line"></span><br><span class="line"><span class="section"># 查看Docker运行状态</span></span><br><span class="line">sudo systemctl status docker</span><br></pre></td></tr></table></figure><h3 id="卸载docker">卸载docker</h3><p>删除安装包：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get purge docker-ce</span><br></pre></td></tr></table></figure><p><font style="color:rgb(51, 51, 51);">删除镜像、容器、配置文件等内容：</font></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo rm -rf /var/lib/docker</span><br></pre></td></tr></table></figure><h2 id="Windows系统安装docker">Windows系统安装docker</h2><p>进入<a href="https://www.docker.com/">docker官网</a>下载</p><p>检查docker版本</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker --version</span><br></pre></td></tr></table></figure><p>运行测试容器</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run hello-world</span><br></pre></td></tr></table></figure><hr><h2 id="Docker安装MySQL">Docker安装MySQL</h2><h3 id="拉取MySQL镜像">拉取MySQL镜像</h3><ol><li class="lvl-3"><p>默认拉取最新版本MySQL</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker pull mysql</span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>拉取指定版本MySQL5.7</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo docker pull mysql:5.7</span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>查看MySQL镜像版本</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker search mysql</span><br></pre></td></tr></table></figure><ol start="4"><li class="lvl-3"><p>查看已安装镜像</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker images</span><br></pre></td></tr></table></figure><h3 id="启动MySQL容器">启动MySQL容器</h3><ol><li class="lvl-3"><p>启动最新版本</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">docker run -p 3306:3306 --name mysql \</span><br><span class="line">-v /mydata/mysql/log:/var/log/mysql \</span><br><span class="line">-v /mydata/mysql/data:/var/lib/mysql \</span><br><span class="line">-v /mydata/mysql/conf:/etc/mysql \</span><br><span class="line">-e MYSQL<span class="emphasis">_ROOT_</span>PASSWORD=root \</span><br><span class="line">-d mysql:latest</span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>启动指定版本（以MySQL5.7为例）</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">sudo docker run -p 3306:3306 --name mysql \</span><br><span class="line">-v /mydata/mysql/log:/var/log/mysql \</span><br><span class="line">-v /mydata/mysql/data:/var/lib/mysql \</span><br><span class="line">-v /mydata/mysql/conf:/etc/mysql \</span><br><span class="line">-e MYSQL<span class="emphasis">_ROOT_</span>PASSWORD=root \</span><br><span class="line">-d mysql:5.7</span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>进入MySQL容器</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>查看MySQL进程[CONTAINER ID]</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker ps -a</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>启动MySQL</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">docker run [CONTAINER ID]</span><br><span class="line"><span class="section"># docker run --name mysql5.7 -e MYSQL<span class="emphasis">_ROOT_</span>PASSWORD=123456 -p 3307:3306 -d mysql:5.7</span></span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>进入MySQL容器</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker exec -it mysql bash</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>MySQL基本</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mysql -u root -p</span><br></pre></td></tr></table></figure><ol start="4"><li class="lvl-3"><p>查看MySQL日志</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker logs mysql5.7</span><br></pre></td></tr></table></figure><h3 id="MySQL远程控制">MySQL远程控制</h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">命令：use mysql;</span><br><span class="line">命令：select host,user from user;</span><br><span class="line">命令：ALTER USER &#x27;root&#x27;@&#x27;%&#x27; IDENTIFIED WITH mysql<span class="emphasis">_native_</span>password BY &#x27;123456&#x27;;</span><br><span class="line">命令：flush privileges;</span><br><span class="line"></span><br><span class="line">把root用户的密码改成 mysql<span class="emphasis">_native_</span>password 模式，即可远程连接</span><br><span class="line"></span><br><span class="line"><span class="code">#创建一个账号-admin，用来进行远程访问；</span></span><br><span class="line"><span class="code">CREATE USER &#x27;admin&#x27;@&#x27;%&#x27; IDENTIFIED BY &#x27;123456&#x27;;</span></span><br><span class="line"><span class="code"> </span></span><br><span class="line"><span class="code"> 赋予所有权限给之前创建的账号:admin</span></span><br><span class="line"><span class="code">GRANT ALL ON *.* TO &#x27;admin&#x27;@&#x27;%&#x27;;</span></span><br><span class="line"><span class="code"> </span></span><br><span class="line"><span class="code"> 确认使用密码&#123;123456&#125;登录此账号&#123;admin&#125;</span></span><br><span class="line"><span class="code"> 密码尽量复杂，安全性更高。</span></span><br><span class="line"><span class="code">ALTER USER &#x27;admin&#x27;@&#x27;%&#x27; IDENTIFIED WITH mysql_native_password BY &#x27;123456&#x27;;</span></span><br><span class="line"><span class="code"> </span></span><br><span class="line"><span class="code"> 刷新权限</span></span><br><span class="line"><span class="code">FLUSH PRIVILEGES;</span></span><br></pre></td></tr></table></figure><h2 id="Docker安装Ubuntu">Docker安装Ubuntu</h2><p>安装centos7系统同下</p><h3 id="font-style-color-rgb-51-51-51-拉取最新版的-Ubuntu-镜像-font"><font style="color:rgb(51, 51, 51);">拉取最新版的 Ubuntu 镜像</font></h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">docker pull ubuntu</span><br><span class="line"><span class="section"># 或者 docker pull ubuntu:latest</span></span><br></pre></td></tr></table></figure><h3 id="运行Ubuntu容器">运行Ubuntu容器</h3><ol><li class="lvl-3"><p><font style="color:rgb(51, 51, 51);">查看本地ubuntu镜像</font></p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker images</span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p><font style="color:rgb(51, 51, 51);">运行ubuntu容器</font></p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -itd --name ubuntu-test ubuntu</span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>进入ubuntu容器</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker exec -it ubuntu-test /bin/bash</span><br></pre></td></tr></table></figure><h2 id="Docker安装Tomcat">Docker安装Tomcat</h2><h3 id="拉取镜像Tomcat-8">拉取镜像Tomcat:8</h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker pull tomcat:8</span><br></pre></td></tr></table></figure><p>查看Tomcat版本</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker search tomcat</span><br></pre></td></tr></table></figure><h3 id="运行Tomcat容器">运行Tomcat容器</h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">docker run -it -p 8080:8080 --name=tomcat tomcat:8</span><br><span class="line"><span class="section"># docker run --name tomcat -p 8080:8080 -v</span></span><br><span class="line"><span class="section"># docker run --name tomcat-test -p 8080:8080 -v /usr/local/project:/usr/local/tomcat/webapps --privileged=true -d tomcat</span></span><br><span class="line">&lt;!-- -p 8080:8080：映射容器服务的 8080端口到主机的 8080端口，外部主机可以直接通过 主机ip:8081 访问到 Tomcat 的服务。</span><br><span class="line">-v /usr/local/project:/usr/local/tomcat/webapps：将主机中当前目录下的 project 挂载到容器的 /webapps，实现目录共享便于程序发布。</span><br><span class="line">-d tomcat：后台启动tomcat</span><br><span class="line">--privileged=true ：开启特权可以容器设置参数 --&gt;</span><br></pre></td></tr></table></figure><p>进入Tomcat容器</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker exec -it tomcat /bin/bash</span><br></pre></td></tr></table></figure><h3 id="web程序运行">web程序运行</h3><ol><li class="lvl-3"><p><font style="color:rgb(77, 77, 77);">首先进入/user/local目录</font></p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cd /usr/local/</span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p><font style="color:rgb(77, 77, 77);">新增目录/project/web</font></p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p /project/web</span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p><font style="color:rgb(77, 77, 77);">新建index.html文件并写入内容</font></p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">vim /usr/local/project/myweb/index.html </span><br><span class="line"> <span class="language-xml"><span class="tag">&lt;<span class="name">HTML</span>&gt;</span></span></span><br><span class="line">   <span class="language-xml"><span class="tag">&lt;<span class="name">h1</span>&gt;</span></span></span><br><span class="line"><span class="code">     Holl Tomcat!</span></span><br><span class="line"><span class="code">   &lt;/h1&gt;</span></span><br><span class="line"><span class="code"> &lt;/HTML&gt;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">docker</summary>
    
    
    
    <category term="学习" scheme="http://zxwlove.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="笔记" scheme="http://zxwlove.xyz/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="学习" scheme="http://zxwlove.xyz/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="Docker" scheme="http://zxwlove.xyz/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Hive函数</title>
    <link href="http://zxwlove.xyz/posts/hive08.html"/>
    <id>http://zxwlove.xyz/posts/hive08.html</id>
    <published>2025-01-04T02:51:30.000Z</published>
    <updated>2025-01-02T02:29:05.612Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><h2 id="系统内置函数">系统内置函数</h2><ol><li class="lvl-3"><p>查看系统自带的函数</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">hive&gt; show functions; </span><br><span class="line">OK </span><br><span class="line">tab<span class="emphasis">_name </span></span><br><span class="line"><span class="emphasis">abs </span></span><br><span class="line"><span class="emphasis">…… </span></span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-4"><p>显示自带的函数的用法</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">hive&gt; desc function abs; </span><br><span class="line">OK </span><br><span class="line">tab<span class="emphasis">_name </span></span><br><span class="line"><span class="emphasis">abs(x) - returns the absolute value of x </span></span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>详细显示自带的函数的用法</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">hive&gt; desc function extended abs; </span><br><span class="line">OK </span><br><span class="line">tab<span class="emphasis">_name </span></span><br><span class="line"><span class="emphasis">abs(x) - returns the absolute value of x </span></span><br><span class="line"><span class="emphasis">Example: </span></span><br><span class="line"><span class="emphasis">  &gt; SELECT abs(0) FROM src LIMIT 1; </span></span><br><span class="line"><span class="emphasis">  0 </span></span><br><span class="line"><span class="emphasis">  &gt; SELECT abs(-5) FROM src LIMIT 1; </span></span><br><span class="line"><span class="emphasis">  5 </span></span><br><span class="line"><span class="emphasis">Function class:org.apache.hadoop.hive.ql.udf.generic.GenericUDFAbs </span></span><br><span class="line"><span class="emphasis">Function type:BUILTIN </span></span><br></pre></td></tr></table></figure><h2 id="常用内置函数">常用内置函数</h2><h3 id="空字段赋值-NVL（防止空字段参与计算）">空字段赋值-NVL（防止空字段参与计算）</h3><ol><li class="lvl-3"><p>函数说明</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; desc function extended nvl; </span><br><span class="line">OK </span><br><span class="line">tab<span class="emphasis">_name </span></span><br><span class="line"><span class="emphasis">nvl(value,default_</span>value) - Returns default value if value is null else returns value </span><br><span class="line">Example: </span><br><span class="line">  &gt; SELECT nvl(null,&#x27;bla&#x27;) FROM src LIMIT 1; </span><br><span class="line">  bla </span><br><span class="line">Function class:org.apache.hadoop.hive.ql.udf.generic.GenericUDFNvl </span><br><span class="line">Function type:BUILTIN </span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>解释：</p></li></ol><table><thead><tr><th>NVL：</th><th>给值为NULL的数据赋值，它的格式是NVL( value，default_value)。</th></tr></thead><tbody><tr><td>功能：</td><td>如果value为NULL，则NVL函数返回default_value的值，否则返回value的值 如果两个参数都为NULL ，则返回NULL。</td></tr></tbody></table><ol start="3"><li class="lvl-3"><p>案例实操</p></li></ol><p>数据准备：采用员工表</p><p>查询：</p><ul class="lvl-0"><li class="lvl-2"><p>如果员工的comm为NULL，则用0代替</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select ename,comm,nvl(comm, 0) comm<span class="emphasis">_0 from emp; </span></span><br><span class="line"><span class="emphasis">OK </span></span><br><span class="line"><span class="emphasis">ename   comm            comm_</span>0 </span><br><span class="line">fanfan  500000.0      500000.0 </span><br><span class="line">SMITH   NULL           0 </span><br><span class="line">ALLEN   300.0          300.0 </span><br><span class="line">WARD    500.0          500.0 </span><br><span class="line">…… </span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>如果员工的job为NULL，则用领导id代替</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select ename, mgr,comm, nvl(job,mgr) comm<span class="emphasis">_mgr from emp; </span></span><br><span class="line"><span class="emphasis">OK </span></span><br><span class="line"><span class="emphasis">job  _</span>c1 </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">研发 研发 </span><br><span class="line">研发 研发 </span><br><span class="line">NULL mgr </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">讲师 讲师 </span><br><span class="line">行政 行政 </span><br><span class="line">讲师 讲师</span><br></pre></td></tr></table></figure><h3 id="CASE-WHEN-THEN-ELSE-END">CASE WHEN THEN ELSE END</h3><ol><li class="lvl-3"><p>函数说明</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; desc function extended case;</span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>解释：根据不同数据，返回不同的值</p></li></ol><p>如：CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END 当a=b时，返回c；当a=d时，返回d；当a=e时，放回e；其他情况返回f。</p><ol start="3"><li class="lvl-3"><p>案例实操</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>数据准备，在/opt/module/hive/datas目录下创建emp_sex.txt，添加如下内容</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">[root@hadoop datas]$ vim emp<span class="emphasis">_sex.txt </span></span><br><span class="line"><span class="emphasis">悟空,A,男 </span></span><br><span class="line"><span class="emphasis">大海,A,男 </span></span><br><span class="line"><span class="emphasis">宋宋,B,男 </span></span><br><span class="line"><span class="emphasis">凤姐,A,女 </span></span><br><span class="line"><span class="emphasis">婷姐,B,女 </span></span><br><span class="line"><span class="emphasis">婷婷,B,女 </span></span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>创建emp_sex表并导入数据</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; create table emp<span class="emphasis">_sex( </span></span><br><span class="line"><span class="emphasis">name string,  </span></span><br><span class="line"><span class="emphasis">dept_</span>id string,  </span><br><span class="line">sex string </span><br><span class="line">)  </span><br><span class="line">row format delimited fields terminated by &quot;,&quot;; </span><br><span class="line">hive(default)&gt; load data local inpath &#x27;/opt/module/hive/datas/emp<span class="emphasis">_sex.txt&#x27; into table emp_</span>sex; </span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>需求：求出不同部门男女各多少人。结果如下：</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">dept<span class="emphasis">_id   man_</span>num   woman<span class="emphasis">_num </span></span><br><span class="line"><span class="emphasis">A          2          1 </span></span><br><span class="line"><span class="emphasis">B          1          2 </span></span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>按需求查询数据</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; select  </span><br><span class="line">  dept<span class="emphasis">_id, </span></span><br><span class="line"><span class="emphasis">  sum(case sex when &#x27;男&#x27; then 1 else 0 end) man_</span>num, </span><br><span class="line">  sum(case sex when &#x27;女&#x27; then 1 else 0 end) woman<span class="emphasis">_num </span></span><br><span class="line"><span class="emphasis">from  </span></span><br><span class="line"><span class="emphasis">  emp_</span>sex </span><br><span class="line">group by  dept<span class="emphasis">_id;</span></span><br></pre></td></tr></table></figure><h3 id="行转列">行转列</h3><p><img src="https://cdn.nlark.com/yuque/0/2024/png/29368235/1735283093837-1fe7d6e8-151a-4ec7-98fd-b324c1421f5c.png" alt=""></p><ol><li class="lvl-3"><p>相关函数说明</p></li></ol><p>CONCAT(string A/col, string B/col…)：返回输入字符串连接后的结果，支持任意个输入字符串;</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; desc function extended concat; </span><br><span class="line">OK </span><br><span class="line">tab<span class="emphasis">_name </span></span><br><span class="line"><span class="emphasis">concat(str1, str2, ... strN) - returns the concatenation of str1, str2, ... strN or concat(bin1, </span></span><br><span class="line"><span class="emphasis">bin2, ... binN) - returns the concatenation of bytes in binary data  bin1, bin2, ... binN </span></span><br><span class="line"><span class="emphasis">Returns NULL if any argument is NULL. </span></span><br><span class="line"><span class="emphasis">Example: </span></span><br><span class="line"><span class="emphasis">  &gt; SELECT concat(&#x27;abc&#x27;, &#x27;def&#x27;) FROM src LIMIT 1; </span></span><br><span class="line"><span class="emphasis">  &#x27;abcdef&#x27; </span></span><br><span class="line"><span class="emphasis">Function class:org.apache.hadoop.hive.ql.udf.generic.GenericUDFConcat </span></span><br><span class="line"><span class="emphasis">Function type:BUILTIN </span></span><br></pre></td></tr></table></figure><p>CONCAT_WS(separator, str1, str2,…)：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; desc function extended concat<span class="emphasis">_ws; </span></span><br><span class="line"><span class="emphasis">OK </span></span><br><span class="line"><span class="emphasis">tab_</span>name </span><br><span class="line">concat<span class="emphasis">_ws(separator, [string | array(string)]+) - returns the concatenation of the strings </span></span><br><span class="line"><span class="emphasis">separated by the separator. </span></span><br><span class="line"><span class="emphasis">Example: </span></span><br><span class="line"><span class="emphasis">  &gt; SELECT concat_</span>ws(&#x27;.&#x27;, &#x27;www&#x27;, array(&#x27;facebook&#x27;, &#x27;com&#x27;)) FROM src LIMIT 1; </span><br><span class="line">  &#x27;www.facebook.com&#x27; </span><br><span class="line">Function class:org.apache.hadoop.hive.ql.udf.generic.GenericUDFConcatWS </span><br><span class="line">Function type:BUILTIN</span><br></pre></td></tr></table></figure><pre><code>- 它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。- 分隔符可以是与剩余参数一样的字符串。- 如果分隔符是 NULL，返回值也将为 NULL。- 这个函数会跳过分隔符参数后的任何 NULL 和空字符串。- 分隔符将被加到被连接的字符串之间;-  注意: CONCAT_WS must be &quot;string or array&lt;string&gt;</code></pre><p>COLLECT_SET(col)：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">hive (default)&gt; desc function extended collect<span class="emphasis">_set; </span></span><br><span class="line"><span class="emphasis">OK </span></span><br><span class="line"><span class="emphasis">tab_</span>name </span><br><span class="line">collect<span class="emphasis">_set(x) - Returns a set of objects with duplicate elements eliminated </span></span><br><span class="line"><span class="emphasis">Function class:org.apache.hadoop.hive.ql.udf.generic.GenericUDAFCollectSet </span></span><br><span class="line"><span class="emphasis">Function type:BUILTIN</span></span><br></pre></td></tr></table></figure><pre><code>- 函数只接受基本数据类型- 它的主要作用是将某字段的值进行去重汇总，产生array类型字段。</code></pre><p>COLLECT_LIST(col):</p><pre><code>- 函数指接收基本数据类型- 它的主要作用是将某字段的值进行不去重汇总，产生array类型字段。</code></pre><ol start="2"><li class="lvl-3"><p>数据准备</p></li></ol><table><thead><tr><th>name</th><th>constellation</th><th>blood_type</th></tr></thead><tbody><tr><td>孙悟空</td><td>白羊座</td><td>A</td></tr><tr><td>大海</td><td>射手座</td><td>A</td></tr><tr><td>宋宋</td><td>白羊座</td><td>B</td></tr><tr><td>猪八戒</td><td>白羊座</td><td>A</td></tr><tr><td>凤姐</td><td>射手座</td><td>A</td></tr><tr><td>苍老师</td><td>白羊座</td><td>B</td></tr></tbody></table><ol start="3"><li class="lvl-3"><p>案例需求：把星座和血型一样的人归类到一起。结果如下：</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">射手座,A            大海|凤姐 </span><br><span class="line">白羊座,A            孙悟空|猪八戒 </span><br><span class="line">白羊座,B            宋宋|苍老师</span><br></pre></td></tr></table></figure><ol start="4"><li class="lvl-3"><p>数据准备：在/opt/module/hive/datas目录下创建文件constellation.txt，添加如下内容</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">[root@hadoop datas]$ vim person<span class="emphasis">_info.txt </span></span><br><span class="line"><span class="emphasis">孙悟空,白羊座,A </span></span><br><span class="line"><span class="emphasis">大海,射手座,A </span></span><br><span class="line"><span class="emphasis">宋宋,白羊座,B </span></span><br><span class="line"><span class="emphasis">猪八戒,白羊座,A </span></span><br><span class="line"><span class="emphasis">凤姐,射手座,A </span></span><br><span class="line"><span class="emphasis">苍老师,白羊座,B</span></span><br></pre></td></tr></table></figure><ol start="5"><li class="lvl-3"><p>案例实操</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>创建person_info表并导入数据</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">hive (default)&gt; create table person<span class="emphasis">_info( </span></span><br><span class="line"><span class="emphasis">name string,  </span></span><br><span class="line"><span class="emphasis">constellation string,  </span></span><br><span class="line"><span class="emphasis">blood_</span>type string </span><br><span class="line">)  </span><br><span class="line">row format delimited fields terminated by &quot;,&quot;;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>导入数据到person_info表中。</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; load data local inpath &quot;/opt/module/hive/datas/person<span class="emphasis">_info.txt&quot; into table </span></span><br><span class="line"><span class="emphasis">person_</span>info;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>按需求查询数据</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; SELECT </span><br><span class="line">t1.c<span class="emphasis">_b, </span></span><br><span class="line"><span class="emphasis">CONCAT_</span>WS(&quot;|&quot;,collect<span class="emphasis">_set(t1.name)) </span></span><br><span class="line"><span class="emphasis">FROM ( </span></span><br><span class="line"><span class="emphasis">SELECT </span></span><br><span class="line"><span class="emphasis">NAME , </span></span><br><span class="line"><span class="emphasis">CONCAT_</span>WS(&#x27;,&#x27;,constellation,blood<span class="emphasis">_type) c_</span>b </span><br><span class="line">FROM person<span class="emphasis">_info </span></span><br><span class="line"><span class="emphasis">)t1  </span></span><br><span class="line"><span class="emphasis">GROUP BY t1.c_</span>b</span><br></pre></td></tr></table></figure><h3 id="列转行">列转行</h3><p><img src="https://cdn.nlark.com/yuque/0/2024/png/29368235/1735283899925-ca08d1fe-c3b4-4d02-8f09-f4bd0494bed3.png" alt=""></p><ol><li class="lvl-3"><p>函数说明</p></li></ol><p>EXPLODE(col)：将hive表的一列中复杂的array或者map结构拆分成多行。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; desc function extended explode; </span><br><span class="line">OK </span><br><span class="line">tab<span class="emphasis">_name </span></span><br><span class="line"><span class="emphasis">explode(a) - separates the elements of array a into multiple rows, or the elements of a map into </span></span><br><span class="line"><span class="emphasis">multiple rows and columns  </span></span><br><span class="line"><span class="emphasis">Function class:org.apache.hadoop.hive.ql.udf.generic.GenericUDTFExplode </span></span><br><span class="line"><span class="emphasis">Function type:BUILTIN</span></span><br></pre></td></tr></table></figure><p>SPLIT(string str, string regex): 按照regex字符串分割str，会返回分割后的字符串数组</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; desc function extended split; </span><br><span class="line">OK </span><br><span class="line">tab<span class="emphasis">_name </span></span><br><span class="line"><span class="emphasis">split(str, regex) - Splits str around occurances that match regex </span></span><br><span class="line"><span class="emphasis">Example: </span></span><br><span class="line"><span class="emphasis">  &gt; SELECT split(&#x27;oneAtwoBthreeC&#x27;, &#x27;[ABC]&#x27;) FROM src LIMIT 1; </span></span><br><span class="line"><span class="emphasis">  [&quot;one&quot;, &quot;two&quot;, &quot;three&quot;] </span></span><br><span class="line"><span class="emphasis">Function class:org.apache.hadoop.hive.ql.udf.generic.GenericUDFSplit </span></span><br><span class="line"><span class="emphasis">Function type:BUILTIN</span></span><br></pre></td></tr></table></figure><p>LATERAL VIEW</p><p>用法：LATERAL VIEW udtf(expression) tableAlias AS columnAlias</p><p>解释：用于和split, explode等UDTF一起使用，它能够将一列数据拆成多行数据，在此基础上可以对拆分 后的数据进行聚合。lateral view首先为原始表的每行调用UDTF，UDTF会报一行拆分成一行或者多行， lateral view再把结果组合，产生一个支持别名表的虚拟表。</p><ol start="2"><li class="lvl-3"><p>案例需求：将表中的categroy列的数据展开。</p></li></ol><table><thead><tr><th>movie</th><th>category</th></tr></thead><tbody><tr><td>《疑犯追踪》</td><td>悬疑,动作,科幻,剧情</td></tr><tr><td>《Lie to me》</td><td>悬疑,警匪,动作,心理,剧情</td></tr><tr><td>《战狼2》</td><td>战争,动作,灾难</td></tr></tbody></table><p>结果如下：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">《疑犯追踪》      悬疑 </span><br><span class="line">《疑犯追踪》      动作 </span><br><span class="line">《疑犯追踪》      科幻 </span><br><span class="line">《疑犯追踪》      剧情 </span><br><span class="line">《Lie to me》   悬疑 </span><br><span class="line">《Lie to me》   警匪 </span><br><span class="line">《Lie to me》   动作 </span><br><span class="line">《Lie to me》   心理 </span><br><span class="line">《Lie to me》   剧情 </span><br><span class="line">《战狼2》        战争 </span><br><span class="line">《战狼2》        动作 </span><br><span class="line">《战狼2》        灾难</span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>案例实操</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>在/opt/module/hive/datas/目录下创建文件movie.txt，添加如下数据：</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[root@hadoop datas]$ vim movie<span class="emphasis">_info.txt </span></span><br><span class="line"><span class="emphasis">《疑犯追踪》 悬疑,动作,科幻,剧情 </span></span><br><span class="line"><span class="emphasis">《Lie to me》 悬疑,警匪,动作,心理,剧情 </span></span><br><span class="line"><span class="emphasis">《战狼2》 战争,动作,灾难</span></span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>创建hive表并导入数据</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; create table movie<span class="emphasis">_info( </span></span><br><span class="line"><span class="emphasis">    movie string,  </span></span><br><span class="line"><span class="emphasis">    category string)  </span></span><br><span class="line"><span class="emphasis">row format delimited </span></span><br><span class="line"><span class="emphasis">fields terminated by &quot;\t&quot;; </span></span><br><span class="line"><span class="emphasis">hive (default)&gt; load data local inpath &quot;/opt/module/hive/datas/movie_</span>info.txt&quot; into table </span><br><span class="line">movie<span class="emphasis">_info; </span></span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>按需求查询数据</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; SELECT movie,category<span class="emphasis">_name  </span></span><br><span class="line"><span class="emphasis">FROM movie_</span>info  </span><br><span class="line">lateral VIEW </span><br><span class="line">explode(split(category,&quot;,&quot;)) movie<span class="emphasis">_info_</span>tmp  AS category<span class="emphasis">_name ;</span></span><br></pre></td></tr></table></figure><h3 id="窗口函数（开窗函数）">窗口函数（开窗函数）</h3><ol><li class="lvl-3"><p>开窗函数介绍</p><ul class="lvl-2"><li class="lvl-6">窗口函数不同于我们熟悉的常规函数及聚合函数，它输入多行数据（一个窗口），为每行数据进行一次计算， 返回一个值。</li><li class="lvl-6">灵活运用窗口函数可以解决很多复杂的问题，如去重、排名、同比及和环比、连续登录等。</li></ul></li></ol><p><img src="https://cdn.nlark.com/yuque/0/2024/png/29368235/1735284617935-259b0c13-83b7-4f0a-af21-402f377dfccf.png" alt=""></p><ol start="2"><li class="lvl-3"><p>语法：</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Function（arg1 ……） over（[partition by arg1 ……] [order by arg1 ……] [<span class="language-xml"><span class="tag">&lt;<span class="name">window_expression</span>&gt;</span></span>]）</span><br></pre></td></tr></table></figure><table><thead><tr><th>Function</th><th></th><th>Over()</th><th></th><th>window_expression</th><th></th></tr></thead><tbody><tr><td>解释：</td><td>支持的函数</td><td>解释：</td><td>指定分析函数工作的数据 窗口大小，窗口会随着行 的变化而变化。</td><td>解释：</td><td>窗口边界的设置</td></tr><tr><td>聚合函数：</td><td>sum()、max()、 min()、avg() 等。</td><td>Partition by:</td><td>表示将数据先按字段进行分区</td><td>n preceding</td><td>往前n行</td></tr><tr><td></td><td></td><td></td><td></td><td>n following</td><td>往后n行</td></tr><tr><td>排序函数：</td><td>rank()， row_number()、 dens_rank()、 ntile()等。</td><td></td><td></td><td>current row</td><td>当前行</td></tr><tr><td></td><td></td><td>Order by:</td><td>表示将各个分区内的数据按字段 进行排序</td><td>unbounded preceding</td><td>从前面的起点开始</td></tr><tr><td></td><td>lead()、 lag()、 first_value() 等。</td><td></td><td></td><td>unbounded<br/>following</td><td>到后面的终点结束</td></tr></tbody></table><ol start="3"><li class="lvl-3"><p>使用详解</p><ul class="lvl-2"><li class="lvl-6">如果不指定partition by，则不对数据进行分区，换句话说，所有数据看作同一个分区。</li><li class="lvl-6">如果不指定order by， 则不对各分区进行排序，通常用于那些顺序无关的窗口函数，如sum（）。</li><li class="lvl-6">如果不指定窗口子句：</li></ul></li></ol><p>不指定order by，默认使用分区内所有行，等同于<code>Function() over(rows between unbounded precedeing and unbounded following)</code> 如果指定order by，默认使用分区内第起点到当前行，等同于<code>Function() over(rows between unbounded preceding and current row)</code></p><ol start="4"><li class="lvl-3"><p>数据准备</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>在/opt/module/hive/datas目录下创建business.txt，添加如下内容。</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">[root@hadoop datas]$ vim business.txt </span><br><span class="line">jack,2017-01-01,10 </span><br><span class="line">tony,2017-01-02,15 </span><br><span class="line">jack,2017-02-03,23 </span><br><span class="line">tony,2017-01-04,29 </span><br><span class="line">jack,2017-01-05,46 </span><br><span class="line">jack,2017-04-06,42 </span><br><span class="line">tony,2017-01-07,50 </span><br><span class="line">jack,2017-01-08,55 </span><br><span class="line">mart,2017-04-08,62 </span><br><span class="line">mart,2017-04-09,68 </span><br><span class="line">neil,2017-05-10,12 </span><br><span class="line">mart,2017-04-11,75 </span><br><span class="line">neil,2017-06-12,80 </span><br><span class="line">mart,2017-04-13,94</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>创建hive表并导入数据</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; create table business( </span><br><span class="line">name string,  </span><br><span class="line">orderdate string, </span><br><span class="line">cost int </span><br><span class="line">) </span><br><span class="line">ROW FORMAT DELIMITED </span><br><span class="line">FIELDS TERMINATED BY &#x27;,&#x27;; </span><br><span class="line">hive(default)&gt; load data local inpath &quot;/opt/module/hive/datas/business.txt&quot; into table business;</span><br></pre></td></tr></table></figure><h3 id="Rank">Rank</h3><ol><li class="lvl-3"><p>函数说明</p></li></ol><p>RANK()：排序相同时会重复，总数不会变 重复的名次一样但是下一名名次会以前面人数+1来定</p><p>DENSE_RANK()：排序相同时会重复，总数会减少 就是若有重复则最后一名的名次不会和总数相等 即并列</p><p>ROW_NUMBER()：会根据顺序计算，字段相同就按排头字段继续排</p><ol start="2"><li class="lvl-3"><p>数据准备</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>在/opt/module/hive/datas目录下创建文件score.txt，添加如下内容</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">[root@hadoop datas]$ vim score.txt </span><br><span class="line">孙悟空 语文 87 </span><br><span class="line">孙悟空 数学 95 </span><br><span class="line">孙悟空 英语 68 </span><br><span class="line">大海 语文 94 </span><br><span class="line">大海 数学 56 </span><br><span class="line">大海 英语 84 </span><br><span class="line">宋宋 语文 64 </span><br><span class="line">宋宋 数学 86 </span><br><span class="line">宋宋 英语 84 </span><br><span class="line">婷婷 语文 65 </span><br><span class="line">婷婷 数学 85 </span><br><span class="line">婷婷 英语 78</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>创建表score并导入数据</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; create table score( </span><br><span class="line">name string, </span><br><span class="line">subject string,  </span><br><span class="line">score int)  </span><br><span class="line">row format delimited </span><br><span class="line">fields terminated by &quot;\t&quot;; </span><br><span class="line">hive(default)&gt; load data local inpath &#x27;/opt/module/hive/datas/score.txt&#x27; into table score;</span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>需求：计算每门学科成绩排名。</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; select name, </span><br><span class="line">subject, </span><br><span class="line">score, </span><br><span class="line">rank() over(partition by subject order by score desc) rp, </span><br><span class="line">dense<span class="emphasis">_rank() over(partition by subject order by score desc) drp, </span></span><br><span class="line"><span class="emphasis">row_</span>number() over(partition by subject order by score desc) rmp </span><br><span class="line">from score; </span><br><span class="line">OK </span><br><span class="line">name    subject score   rp      drp     rmp </span><br><span class="line">孙悟空  数学    95      1       1       1 </span><br><span class="line">宋宋    数学    86      2       2       2 </span><br><span class="line">婷婷    数学    85      3       3       3 </span><br><span class="line">大海    数学    56      4       4       4 </span><br><span class="line">宋宋    英语    84      1       1       1 </span><br><span class="line">大海    英语    84      1       1       2 </span><br><span class="line">婷婷    英语    78      3       2       3 </span><br><span class="line">孙悟空  英语    68      4       3       4 </span><br><span class="line">大海    语文    94      1       1       1 </span><br><span class="line">孙悟空  语文    87      2       2       2 </span><br><span class="line">婷婷    语文    65      3       3       3 </span><br><span class="line">宋宋    语文    64      4       4       4 </span><br></pre></td></tr></table></figure><h2 id="自定义函数">自定义函数</h2><ol><li class="lvl-3"><p>内置函数：Hive 自带了一些函数。比如：max/min等，但是数量有限，自己可以通过自定义UDF来方便的扩展。</p></li><li class="lvl-3"><p>自定义函数：当Hive提供的内置函数无法满足你的业务处理需要时 此时就可以考虑使用用户自定义函数（UDF：user-defined function）。</p></li><li class="lvl-3"><p>根据用户自定义函数类别分为以下三种：</p></li></ol><p>UDF（User-Defined-Function）–&gt; 一进一出</p><p>UDAF（User-Defined Aggregation Function） --&gt; 聚合函数，多进一出，类似：count/max/min</p><p>UDTF（User-Defined Table-Generating Functions）–&gt; 炸裂函数，一进多出，如：explode()</p><ol start="4"><li class="lvl-3"><p>官方文档地址<a href="https://cwiki.apache.org/confluence/display/Hive/HivePlugins">https://cwiki.apache.org/confluence/display/Hive/HivePlugins</a></p></li><li class="lvl-3"><p>编程步骤：</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>继承Hive提供的类</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">·org.apache.hadoop.hive.ql.udf.generic.GenericUDF   </span><br><span class="line">·org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>实现类中的抽象方法</p></li><li class="lvl-3"><p>实现类中的抽象方法</p></li></ul><h2 id="自定义UDF函数">自定义UDF函数</h2><ol><li class="lvl-3"><p>需求:自定义一个UDF实现计算给定字符串的长度，例如：</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; select my<span class="emphasis">_len(&quot;abcd&quot;); </span></span><br><span class="line"><span class="emphasis">ok </span></span><br><span class="line"><span class="emphasis">4 </span></span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>案例实操</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>创建一个Maven工程Hive</p></li><li class="lvl-2"><p>在工程项目的<code>pom.xml</code>文件中导入依赖</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">dependencies</span>&gt;</span></span> </span><br><span class="line">  <span class="language-xml"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span> </span><br><span class="line">   <span class="language-xml"><span class="tag">&lt;<span class="name">groupId</span>&gt;</span></span>org.apache.hive<span class="language-xml"><span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span> </span><br><span class="line">   <span class="language-xml"><span class="tag">&lt;<span class="name">artifactId</span>&gt;</span></span>hive-exec<span class="language-xml"><span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span> </span><br><span class="line">   <span class="language-xml"><span class="tag">&lt;<span class="name">version</span>&gt;</span></span>3.1.2<span class="language-xml"><span class="tag">&lt;/<span class="name">version</span>&gt;</span></span> </span><br><span class="line">  <span class="language-xml"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span> </span><br><span class="line"><span class="language-xml"><span class="tag">&lt;/<span class="name">dependencies</span>&gt;</span></span> </span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>创建一个类</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line">package com.atguigu.hive; </span><br><span class="line"> </span><br><span class="line">import org.apache.hadoop.hive.ql.exec.UDFArgumentException; </span><br><span class="line">import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException; </span><br><span class="line">import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;</span><br><span class="line">import org.apache.hadoop.hive.ql.metadata.HiveException; </span><br><span class="line">import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; </span><br><span class="line">import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; </span><br><span class="line">import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; </span><br><span class="line"> </span><br><span class="line">/** </span><br><span class="line"><span class="bullet"> *</span> 自定义UDF函数，需要继承GenericUDF类 </span><br><span class="line"><span class="bullet"> *</span> 需求: 计算指定字符串的长度 </span><br><span class="line"> <span class="emphasis">*/ </span></span><br><span class="line"><span class="emphasis">public class MyStringLength extends GenericUDF &#123; </span></span><br><span class="line"><span class="emphasis">    /*</span>* </span><br><span class="line"><span class="bullet">     *</span> </span><br><span class="line">     * @param arguments 输入参数类型的鉴别器对象 </span><br><span class="line"><span class="bullet">     *</span> @return 返回值类型的鉴别器对象 </span><br><span class="line"><span class="bullet">     *</span> @throws UDFArgumentException </span><br><span class="line"><span class="code">     */ </span></span><br><span class="line"><span class="code">    @Override </span></span><br><span class="line"><span class="code">    public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException &#123; </span></span><br><span class="line"><span class="code">        // 判断输入参数的个数 </span></span><br><span class="line"><span class="code">        if(arguments.length !=1)&#123; </span></span><br><span class="line"><span class="code">            throw new UDFArgumentLengthException(&quot;Input Args Length Error!!!&quot;); </span></span><br><span class="line"><span class="code">        &#125; </span></span><br><span class="line"><span class="code">        // 判断输入参数的类型 </span></span><br><span class="line"><span class="code">        if(!arguments[0].getCategory().equals(ObjectInspector.Category.PRIMITIVE))&#123; </span></span><br><span class="line"><span class="code">            throw new UDFArgumentTypeException(0,&quot;Input Args Type Error!!!&quot;); </span></span><br><span class="line"><span class="code">        &#125; </span></span><br><span class="line"><span class="code">        //函数本身返回值为int，需要返回int类型的鉴别器对象 </span></span><br><span class="line"><span class="code">        return PrimitiveObjectInspectorFactory.javaIntObjectInspector; </span></span><br><span class="line"><span class="code">    &#125; </span></span><br><span class="line"><span class="code"> </span></span><br><span class="line"><span class="code">    /** </span></span><br><span class="line"><span class="code">     * 函数的逻辑处理 </span></span><br><span class="line"><span class="code">     * @param arguments 输入的参数 </span></span><br><span class="line"><span class="code">     * @return 返回值 </span></span><br><span class="line"><span class="code">     * @throws HiveException </span></span><br><span class="line"><span class="code">     */ </span></span><br><span class="line"><span class="code">    @Override </span></span><br><span class="line"><span class="code">    public Object evaluate(DeferredObject[] arguments) throws HiveException &#123; </span></span><br><span class="line"><span class="code">       if(arguments[0].get() == null)&#123; </span></span><br><span class="line"><span class="code">           return 0 ; </span></span><br><span class="line"><span class="code">       &#125; </span></span><br><span class="line"><span class="code">       return arguments[0].get().toString().length(); </span></span><br><span class="line"><span class="code">    &#125; </span></span><br><span class="line"><span class="code"> </span></span><br><span class="line"><span class="code">    @Override </span></span><br><span class="line"><span class="code">    public String getDisplayString(String[] children) &#123; </span></span><br><span class="line"><span class="code">        return &quot;&quot;; </span></span><br><span class="line"><span class="code">    &#125; </span></span><br><span class="line"><span class="code">&#125; </span></span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>打成jar包上传到服务器/opt/module/hive/datas/myudf.jar</p></li><li class="lvl-2"><p>将jar包添加到hive的classpath</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; add jar /opt/module/hive/datas/myudf.jar;</span><br></pre></td></tr></table></figure><h2 id="创建临时函数">创建临时函数</h2><ol><li class="lvl-3"><p>创建临时函数与开发好的java class关联</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; create temporary function my<span class="emphasis">_len as &quot;com.atguigu.hive. MyStringLength&quot;;</span></span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>在hql中使用自定义的函数</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select ename,my<span class="emphasis">_len(ename) ename_</span>len from emp; </span><br><span class="line">OK </span><br><span class="line">ename   <span class="emphasis">_c1 </span></span><br><span class="line"><span class="emphasis">fanfan  6 </span></span><br><span class="line"><span class="emphasis">SMITH   5 </span></span><br><span class="line"><span class="emphasis">ALLEN   5 </span></span><br><span class="line"><span class="emphasis">WARD    4 </span></span><br><span class="line"><span class="emphasis">JONES   5 </span></span><br><span class="line"><span class="emphasis">MARTIN  6 </span></span><br><span class="line"><span class="emphasis">BLAKE   5 </span></span><br><span class="line"><span class="emphasis">CLARK   5 </span></span><br><span class="line"><span class="emphasis">SCOTT   5 </span></span><br><span class="line"><span class="emphasis">KING    4 </span></span><br><span class="line"><span class="emphasis">TURNER  6 </span></span><br><span class="line"><span class="emphasis">ADAMS   5 </span></span><br><span class="line"><span class="emphasis">JAMES   5 </span></span><br><span class="line"><span class="emphasis">FORD    4 </span></span><br><span class="line"><span class="emphasis">MILLER  6 </span></span><br></pre></td></tr></table></figure><p><font style="color:#DF2A3F;">注意：临时函数只跟会话有关系，跟库没有关系，只要创建临时函数的会话不断，再当前会话下，任意一个库都 可以使用，其他会话全部不能使用。</font></p><h2 id="创建永久函数">创建永久函数</h2><p><font style="color:#DF2A3F;">注意：因为add jar的方式本身也是临时生效，所以在创建永久函数的时候，需要执行路径（应且因为元数据的 原因，这个路径还得是HDFS上的路径）</font></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt;  </span><br><span class="line">create function my<span class="emphasis">_len2  </span></span><br><span class="line"><span class="emphasis">as &quot;com.atguigu.hive.udf.MyUDF&quot;  </span></span><br><span class="line"><span class="emphasis">using jar &quot;hdfs://hadoop102:8020/udf/myudf.jar&quot;; </span></span><br></pre></td></tr></table></figure><p>即可在hql中使用自定义的永久函数</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">hive (default)&gt;  </span><br><span class="line">select  </span><br><span class="line"><span class="code">    ename, </span></span><br><span class="line"><span class="code">    my_len2(ename) ename_len  </span></span><br><span class="line"><span class="code">from emp;</span></span><br></pre></td></tr></table></figure><p>删除永久函数</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; drop function my<span class="emphasis">_len2;</span></span><br></pre></td></tr></table></figure><p><font style="color:#DF2A3F;">注意：永久函数跟会话没有关系，创建函数的会话断了以后，其他会话也可以使用。</font></p><p><font style="color:#DF2A3F;">永久函数创建的时候，在函数名之前需要自己加上库名，如果不指定库名的话，会默认把当前库的库名给加上。</font></p><p><font style="color:#DF2A3F;">永久函数使用的时候，需要在指定的库里面操作,或者在其他库里面使用的话加上 库名.函数名。</font></p>]]></content>
    
    
    <summary type="html">hive函数</summary>
    
    
    
    <category term="学习" scheme="http://zxwlove.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="笔记" scheme="http://zxwlove.xyz/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="Hive" scheme="http://zxwlove.xyz/tags/Hive/"/>
    
    <category term="学习" scheme="http://zxwlove.xyz/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>年度总结 | 2025</title>
    <link href="http://zxwlove.xyz/posts/4476cff4.html"/>
    <id>http://zxwlove.xyz/posts/4476cff4.html</id>
    <published>2024-12-31T16:00:00.000Z</published>
    <updated>2025-01-01T15:10:09.138Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><blockquote><p>荏苒韶华，若白驹过隙，已是碧玉年华。</p></blockquote><p>冷若霜冻，微风簌簌，我踏着寂静的小路，脚步轻盈。抬头仰望那皓月，它悬挂在夜空中，皎洁无暇，如同打磨过的玉石，散发着柔和的光辉。你好呀，年少的我，还有遥远的未来我。我们在不同的时间、不同的地点，隔着时空的鸿沟相互凝望。回顾这一年，我仿佛已经半只脚踏入了成年人的世界。生活的重压似乎在不知不觉中磨平了我的棱角，我变得忙碌而机械，许多事情不再去思考其背后的意义，只是机械地为了完成而完成。我对未来感到迷茫，它既像是无尽的黑洞，又像是一条笔直却一眼望得到尽头的道路。</p><p>上半年的情感之路颇为坎坷，爱情如同泡沫，绚烂却易碎。网络上的忠贞不渝与现实中的背叛交织，让我对爱情逐渐麻木，不禁自嘲地笑出声来。</p><p>迷茫、彷徨、堕落、懒惰、逃避、麻木，这些词汇似乎成了我下半年的生活写照。我不清楚自己究竟想要什么，是遵循父母的期望，还是听从专业人士的建议。但似乎，我总是在倾听他人的声音，却从未真正聆听自己内心的呼唤。我幻想一夜暴富，然后过上无忧无虑的生活，但突然间，我意识到这样的生活似乎失去了意义。家庭关系并不和谐，真心朋友虽有几个，却因忙碌而少有交流，情感上也没有找到真正合适的伴侣。我不禁设想，我会不会最终孤独终老，这个问题，或许只能留给未来去解答。</p><p>人啊，总是不可避免地走向孤独。</p><p>今年的成就，似乎难以一一记起。最近通过的华为证书，算是一点微不足道的成绩吗？我已经记不太清了。身体的懒惰让我疏于运动，连文字的表达也变得生疏起来。然而，对于明年，我有一个唯一的要求：我要倾听自己的声音，活出真正的自己。不再随波逐流，不再迷失在别人的期望中，我要找到属于自己的道路，让自己的生活充满色彩和意义。</p><p><img src="https://haowallpaper.com/link/common/file/previewFileImg/db09d0dc2f16b05b7a719699d7271fd9" alt="等过年"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;meta name=&quot;referrer&quot; content=&quot;no-referrer&quot; /&gt;
&lt;blockquote&gt;
&lt;p&gt;荏苒韶华，若白驹过隙，已是碧玉年华。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;冷若霜冻，微风簌簌，我踏着寂静的小路，脚步轻盈。抬头仰望那皓月，它悬挂在夜</summary>
      
    
    
    
    <category term="生活日常" scheme="http://zxwlove.xyz/categories/%E7%94%9F%E6%B4%BB%E6%97%A5%E5%B8%B8/"/>
    
    
    <category term="生活日常" scheme="http://zxwlove.xyz/tags/%E7%94%9F%E6%B4%BB%E6%97%A5%E5%B8%B8/"/>
    
  </entry>
  
  <entry>
    <title>SQL Server(草稿版)</title>
    <link href="http://zxwlove.xyz/posts/mysql003.html"/>
    <id>http://zxwlove.xyz/posts/mysql003.html</id>
    <published>2024-12-04T09:30:00.000Z</published>
    <updated>2024-12-04T09:30:00.000Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><h1>SQL Server</h1><p>基本介绍：美国Microsoft公司推出的一种关系型数据库系统。SQL Server是一个可扩展的、高性能的、为分布式客户机/服务器计算所设计的数据库管理系统，实现了与WindowsNT的有机结合，提供了基于事务的企业级信息管理系统方案。</p><p>服务的启动方式：</p><ul class="lvl-0"><li class="lvl-2"><p>命令行：net start mssqlserver</p></li><li class="lvl-2"><p>任务管理器：找到服务再找到mssqlserver</p></li><li class="lvl-2"><p>右击此电脑打开管理：</p></li></ul><p><img src="C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1730171440827.png" alt=""></p><h4 id="打开SQL-server管理工具的方式：">打开SQL server管理工具的方式：</h4><ol><li class="lvl-3"><p>在开始菜单搜索：SSMS(SQL Server Management Studio)</p></li></ol><h4 id="连接不到数据库的原因：">连接不到数据库的原因：</h4><ol><li class="lvl-3"><p>服务没有开启</p></li><li class="lvl-3"><p>密码或账号错误</p></li><li class="lvl-3"><p>防火墙没有关闭</p></li><li class="lvl-3"><p>网络原因（没有使用tcp/ip协议  在SQL server配置管理器里面打开网络配置然后开启tcpip协议）</p></li></ol><p><img src="C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1730172093576.png" alt=""></p><h2 id="身份验证">身份验证</h2><h4 id="windows身份验证：">windows身份验证：</h4><p>使用windows账号登录</p><h4 id="混合身份验证-sqlserver的身份验证模式和windows身份验证-：">混合身份验证(sqlserver的身份验证模式和windows身份验证)：</h4><p>既可以用windows账号登录也可以用SQL server的登录名登录</p><h4 id="设置身份验证：">设置身份验证：</h4><ol><li class="lvl-3"><p><img src="C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1730171798857.png" alt=""></p></li></ol><p><img src="C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1730171851439.png" alt=""></p><h2 id="版本">版本</h2><p>Microsoft SQL Server Management Studio10.50.6000.34<br>Microsoft Analysis Services 客户端工具       10.50.6000.34<br>Microsoft 数据访问组件 (MDAC)    10.0.19041.4291<br>Microsoft MSXML    3.0 6.0<br>Microsoft Internet Explorer   9.11.19041.0<br>Microsoft .NET Framework    2.0.50727.9174<br>操作系统    6.3.19045</p><p>端口号：1433</p><h2 id="SQL-server的用户和角色">SQL server的用户和角色</h2><p><strong>在SQL server数据里面分为两种级别分别是服务器级别和数据库级别</strong></p><h3 id="服务器级别">服务器级别</h3><p>为帮助您管理服务器上的权限，<strong>SQL Server</strong> 提供了若⼲角色，这些角色是⽤于对其他主体进⾏分组的安全主体。 服务器级角色的权限作⽤域为服务器范围。<strong>SQL Server</strong> 提供了九种固定服务器角色， ⽆法更改授予固定服务器角色的权限，这<strong>9</strong>组角色分别如下：</p><p><strong>sysadmin ——</strong> 在<strong>SQL Server</strong>中进⾏任何活动，该角色的权限跨越所有其它固定服务器角色</p><p><strong>serveradmin ——</strong> 更改服务器范围内的配置选项并关闭服务器</p><p><strong>setupadmin ——</strong> 添加和删除链接服务器，并执⾏某些系统存储过程（如 <strong>sp_serveroption</strong>）</p><p><strong>securityadmin ——</strong> 授予数据库引擎的访问权限和配置⽤户权限的能⼒使得安全管理员可以分配⼤多数服务器权限，<strong>securityadmin</strong> 角色应视为与<strong>sysadmin</strong> 角色等效</p><p><strong>processadmin ——</strong> 管理在 <strong>SQL Server</strong> 实例中运⾏的进程</p><p><strong>dbcreator ——</strong> 创建和改变数据库，但是没有读取权限</p><p><strong>diskadmin ——</strong> 管理磁盘⽂件</p><p><strong>bulkadmin ——</strong> 执⾏ <strong>BULK INSERT</strong> 语句</p><p><strong>public ——</strong> 每个 <strong>SQL Server</strong> 登录名均属于 <strong>public</strong> 服务器角色。 如果未向某个服务器主体授予或拒绝对某个安全对象的特定权限，该⽤户将继承授予该对象的 <strong>public</strong> 角色的权限。当您希望该对象对所有⽤户可⽤时，只需对任何对象分配 <strong>public</strong> 权限即可。 您⽆法更改 <strong>public</strong> 中的成员关系。<strong>public</strong> 的实现⽅式与其他角色不同，但是，可以从 <strong>public</strong> 授予、拒绝或撤销权限。</p><p><strong>注意：</strong></p><p><strong>&gt;&gt;<strong><strong>登录名⼀定属于某些角色，默认为</strong></strong>public</strong></p><p>**&gt;&gt;**服务器角色不容许更改</p><p>**&gt;&gt;**登录后也不⼀定有权限操作数据库</p><h3 id="数据库角色">数据库角色</h3><p>数据库角色：<strong>SQL Server</strong> 中有两种类型的数据库级角色：数据库中预定义的**“<strong>固定数据库角色</strong>”<strong>和您可以创建的</strong>“<strong>灵活数据库角色</strong>”**</p><p>固定的有某些权限的数据库角色，所有数据库中都有这些角色，默认有<strong>10</strong>个，分别如下；</p><p><strong>public</strong></p><p><strong>–public</strong> 角色是⼀个特殊的数据库角色，每个数据库⽤户都属于它。<strong>public</strong> 角色：</p><p>**&gt;&gt;**捕获数据库中⽤户的所有默认权限。</p><p>**&gt;&gt;**⽆法将⽤户、组或角色指派给它，因为默认情况下它们即属于该角色。</p><p>**&gt;&gt;**包含在每个数据库中，包括 <strong>master</strong>、<strong>msdb</strong>、<strong>tempdb</strong>、<strong>model</strong> 和所有⽤户数据库。</p><p>**&gt;&gt;**⽆法除去。</p><p><strong>db_owner</strong></p><p>**–**进⾏所有数据库角色的活动，以及数据库中的其它维护和配置活动。</p><p>**–**该角色的权限跨越所有其它固定数据库角色。</p><p><strong>db_accessadmin</strong></p><p>**–**在数据库中添加或删除 <strong>Windows NT 4.0</strong> 或 <strong>Windows 2000</strong> 组和⽤户以及 <strong>SQL Server</strong> ⽤户。</p><p><strong>db_datareader</strong></p><p>**–**查看来⾃数据库中所有⽤户表的全部数据。</p><p><strong>db_datawriter</strong></p><p>**–**添加、更改或删除来⾃数据库中所有⽤户表的数据</p><p><strong>db_ddladmin</strong></p><p>**–<strong>添加、修改或除去数据库中的对象</strong>(**运⾏所有 <strong>DDL)</strong></p><p><strong>db_securityadmin</strong></p><p>**–**管理 <strong>SQL Server 2000</strong> 数据库角色的角色和成员，并管理数据库中的语句和对象权限</p><p><strong>db_backupoperator</strong></p><p>**–**有备份数据库的权限</p><p><strong>db_denydatareader</strong></p><p>**–**拒绝选择数据库数据的权限</p><p><strong>db_denydatawriter</strong></p><p>**–**拒绝更改数据库数据的权限</p><p>数据库角色具体位置在 数据库**——&gt;<strong>某个具体库</strong>——&gt;<strong>安全性</strong>——&gt;<strong>角色</strong>——&gt;**数据库角色</p><h3 id="SQL-server架构">SQL server架构</h3><p>架构：架构（<strong>Schema</strong>）是⼀组数据库对象的集合，它被单个负责⼈（可以是⽤户或角色）所拥有并构成唯⼀命名空间。可以将架构看成是对象的容器。</p><p>**&gt;&gt;**数据库⽤户对应于服务器登录名以便登录者可以操作数据库</p><p>**&gt;&gt;**数据库角⾊可以添加，可以定制不同权限</p><p>**&gt;&gt;**数据库架构，类似于数据库对象的命名空间，⽤户通过架构访问数据库对象</p><p>服务器级 <strong>-&gt;</strong> 数据库级 <strong>-&gt;</strong> 架构级 <strong>- &gt;</strong> 数据对象级</p><h5 id="注意：">注意：</h5><p>⼀个⽤户可以拥有多个架构，但是不能对没有拥有的架构进⾏操作。⼀个数据库角色，是对不同架构⾥</p><p>⾯数据对象的权限组织，也有可能涉及到多个架构，当某⼀个⽤户被转换成⼀种数据库角色的时候，假如这个⽤户本⾝不拥有某⼀个架 构⽽该数据库角色拥有，那当它对那个架构进⾏操作的时候就会出错。</p><h4 id="相互之间的关系">相互之间的关系</h4><ol><li class="lvl-3"><p>登录名与数据库⽤户在服务器级别是⼀对多的，在数据库级别是⼀对⼀的⼀个登录名可以和多个不同库下的⽤户做映射，但是在同⼀个库下只能和⼀个⽤户做映射，并且⼀ 个⽤户名可以和多个登录名有映射关系， 真正有权限的是⽤户名，只不过是⽤登录名去登进数据库，然后去找映射的⽤户名，这样就有了相应的权限，刚开始建⽴的登录名只要把该登录名的服务器角⾊设置为<strong>Database Creator</strong>，就可以创建新的数据库了，并且新建⽴的这个数据库中会⾃动⽣成两个⽤户名：<strong>dbo</strong>和<strong>guest</strong>。并且刚刚建⽴的登录名就和<strong>dbo</strong>映射了，还有就是<strong>rbo</strong>也和<strong>sa</strong>映射了，因为<strong>sa</strong>作为 管理员的登录名和每个库中的<strong>rbo</strong>⽤户映射。</p></li><li class="lvl-3"><p>⼀个数据库角色有可能涉及多个架构，数据库角色对应的是权限</p></li><li class="lvl-3"><p>⼀个⽤户对应⼀个数据库角色</p></li><li class="lvl-3"><p>⼀个数据库⽤户可以对应多个架构（架构是表容器），架构⾥⾯包含的是数据库表。</p></li></ol><h2 id="SQL-server系统库">SQL server系统库</h2><p>SQL Server提供了四个系统数据库，包括<code>master</code>、<code>msdb</code>、<code>model</code>和<code>tempdb</code>。</p><ul class="lvl-0"><li class="lvl-2"><p><code>master</code>系统数据库存储SQL Server实例的系统级信息。</p></li><li class="lvl-2"><p><code>msdb</code>数据库由SQL Server代理用于作业和警报。</p></li><li class="lvl-2"><p><code>model</code>数据库用作创建其他数据库的模板。</p></li><li class="lvl-2"><p><code>tempdb</code>系统数据库存储临时对象，并在每次SQL Server启动时重新创建。</p></li></ul><h2 id="TRANSAC-SQL-T-SQL">TRANSAC-SQL  (T-SQL)</h2><h3 id="标识符">标识符</h3><p>SQL Server的所有对象，包括服务器、数据库以及数据库对象，如表、视图、列、索引、触发器、存储过程、规则、默认值和约束等都可以有一个标识符。就是对象的名字。</p><p>数据库对象的全名应该由服务器名、数据库名、拥有者名和对象名这四个部分组成，格式如下：</p><p>[[[server.][database].][owner_name].]object_name 命名必须都要符合标识符的规定。</p><h3 id="命名规则">命名规则</h3><h4 id="规则标识符：符合标识符命名规则的">规则标识符：符合标识符命名规则的</h4><p><strong>标识符不允许是T-SQL的保留字</strong>（T-SQL不区分大小写所以不论是大小写的保留字都不能使用）</p><p><strong>标识符内部不允许有空格或特殊字符</strong>（例如[],‘’）</p><ul class="lvl-0"><li class="lvl-2"><p>首字母命名规则</p><ul class="lvl-2"><li class="lvl-6">英文大小写A-z</li><li class="lvl-6">其他语言，比如汉字</li><li class="lvl-6">特殊符号：_，@，#</li></ul></li><li class="lvl-2"><p>首字母之后</p><ul class="lvl-2"><li class="lvl-6">英文大小写A-z</li><li class="lvl-6">数字0-9</li><li class="lvl-6">其他语言，比如汉字</li><li class="lvl-6">特殊符号：_、@、#、$</li></ul></li></ul><h4 id="界定标识符：可以不符合标识符命名规则，但是用界定符号包裹起来的">界定标识符：可以不符合标识符命名规则，但是用界定符号包裹起来的</h4><h5 id="界定符号：-或者是’’">界定符号：[]或者是’’</h5><p><strong>注：无论是界定标识符还是规则标识符都最多只能容纳128个字符，对于本地的临时表最多可以有116个字符。</strong></p><h5 id="以某些特殊符号开头的标识符在SQL-Server系统中具有特定的含义">以某些特殊符号开头的标识符在SQL Server系统中具有特定的含义</h5><p>@：局部变量   用户自己定义的</p><p>@@：全局变量    系统定义和维护的</p><p>#：局部临时表</p><p>##：全局临时表</p><table><thead><tr><th><strong>全局变量</strong></th><th><strong>说明</strong></th></tr></thead><tbody><tr><td>@@error</td><td>上一条SQL语句报告的错误号</td></tr><tr><td>@@nestlevel</td><td>当前存储过程或触发器的嵌套级别</td></tr><tr><td>@@rowcount</td><td>上一条SQL语句处理的行数</td></tr><tr><td>@@servername</td><td>本地服务器名称</td></tr><tr><td>@@identity</td><td>最后插入的标识值</td></tr><tr><td>@@spid</td><td>当前用户进程的会话id</td></tr><tr><td>@@fetch_status</td><td>上一条游标fetch语句的状态</td></tr><tr><td>@@cpu_busy</td><td>SQL Server自上次启动后的时间状态</td></tr></tbody></table><h2 id="SQL-server创建数据库">SQL server创建数据库</h2><p>数据库文件包括：数据文件(mdf)和日志文件(ldf)</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">use master</span><br><span class="line">go</span><br><span class="line"></span><br><span class="line">if exists(select * from sysdatabases where name=&#x27;sql_wei&#x27;)    -- 判断数据库是否存在</span><br><span class="line">begin</span><br><span class="line">    print &#x27;数据库已存在，现在开始删除--------------------&#x27;</span><br><span class="line">    drop database sql_wei</span><br><span class="line">    print &#x27;数据库删除成功，结束删除----------------------&#x27;</span><br><span class="line">end</span><br><span class="line">else</span><br><span class="line">begin</span><br><span class="line">    create database sql_wei</span><br><span class="line">    on primary(</span><br><span class="line">    name=&#x27;sql_wei&#x27;,   -- 文件的逻辑名称</span><br><span class="line">    filename=&#x27;D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\data\sql_wei.mdf&#x27;, --文件的路径</span><br><span class="line">    size=5mb, -- 初始化大小</span><br><span class="line">    maxsize=100mb, -- 最大的大小</span><br><span class="line">    filegrowth=5%  -- 自增率</span><br><span class="line">    )</span><br><span class="line">    log on(</span><br><span class="line">    name=&#x27;sql_wei_log&#x27;,</span><br><span class="line">    filename=&#x27;D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\data\sql_wei_log.ldf&#x27;,</span><br><span class="line">    size=5mb,</span><br><span class="line">    maxsize=100mb,</span><br><span class="line">    filegrowth=5%</span><br><span class="line">)</span><br><span class="line">end</span><br><span class="line">go</span><br></pre></td></tr></table></figure><h4 id="自增属性">自增属性</h4><p>identity：标识列    identity(起始值,每次增长值)</p><h4 id="关于主键、候选键、超键">关于主键、候选键、超键</h4><p>理解超键、候选键、主键概念及关系<br>1.基本概念<br>超键(super key):在关系中能唯一标识元组的属性集称为关系模式的超键/码。<br>候选键(candidate key):不含有多余属性的超键称为候选键，即其真子集不再是超键。<br>主键(primary key):用户选作元组标识的一个候选键称为主键，是候选键之一。<br>2.关系<br>候选键是超键的子集，主键是候选键中的一个。<br>3.例子:<br>考虑属性集（身份证号，姓名 ，性别 ，年龄），假设无重名<br>a.其中超键有：身份证号、姓名、（姓名，性别）、（姓名，性别，年龄）等<br>–这里可以看出，超键是能唯一确定一个人的属性组</p><p>b.超键中的候选键身份证号、姓名唯一，而且没有多余属性，所以是一个候选键<br>–这里可以看出，候选键是没有多余属性的超键<br>c.选择主键用户可根据自己喜好考虑选择姓名或者身份证号作为主键<br>–主键是选中的一个候选键</p><h4 id="约束">约束</h4><ul class="lvl-0"><li class="lvl-2"><p>主键 primary key</p></li><li class="lvl-2"><p>默认 default</p></li><li class="lvl-2"><p>非空 not null</p></li><li class="lvl-2"><p>检查 check</p></li><li class="lvl-2"><p>外键 foreign key</p></li><li class="lvl-2"><p>唯一 unique</p></li></ul><h4 id="数据类型">数据类型</h4><h5 id="第一大类-整数数据">第一大类:整数数据</h5><p>bit:bit数据类型代表0,1或NULL,就是表示true,false.占用1byte.<br>int:以4个字节来存储正负数.可存储范围为:-2<sup>31至2</sup>31-1.<br>smallint:以2个字节来存储正负数.存储范围为:-2<sup>15至2</sup>15-1<br>tinyint: 是最小的整数类型,仅用1字节,范围:0至此2^8-1</p><h5 id="第二大类-精确数值数据">第二大类:精确数值数据</h5><p>numeric:表示的数字可以达到38位,存储数据时所用的字节数目会随着使用权用位数的多少变化.<br>decimal:和numeric差不多</p><h5 id="第三大类-近似浮点数值数据">第三大类:近似浮点数值数据</h5><p>float:用8个字节来存储数据.最多可为53位.范围为:-1.79E+308至1.79E+308.<br>real:位数为24,用4个字节,数字范围:-3.04E+38至3.04E+38</p><h5 id="第四大类-日期时间数据">第四大类:日期时间数据</h5><p>datetime:表示时间范围可以表示从1753/1/1至9999/12/31,时间可以表示到3.33/1000秒.使用8个字节.<br>smalldatetime:表示时间范围可以表示从1900/1/1至2079/12/31.使用4个字节.</p><h5 id="第五大类-字符串数据">第五大类:字符串数据</h5><p>char:长度是设定的,最短为1字节,最长为8000个字节.不足的长度会用空白补上.<br>varchar:长度也是设定的,最短为1字节,最长为8000个字节,尾部的空白会去掉.<br>text:长宽也是设定的,最长可以存放2G的数据.</p><h5 id="第六大类-Unincode字符串数据">第六大类:Unincode字符串数据</h5><p>nchar:长度是设定的,最短为1字节,最长为4000个字节.不足的长度会用空白补上.储存一个字符需要2个字节.<br>nvarchar:长度是设定的,最短为1字节,最长为4000个字节.尾部的空白会去掉.储存一个字符需要2个字节.<br>ntext:长度是设定的,最短为1字节,最长为2G.尾部的空白会去掉,储存一个字符需要2个字节.</p><h5 id="第七大类-货币数据类型">第七大类:货币数据类型</h5><p>money:记录金额范围为:-92233720368577.5808至92233720368577.5807.需要8 个字节.<br>smallmoney:记录金额范围为:-214748.3648至214748.36487.需要4个字节.</p><h5 id="第八大类-标记数据">第八大类:标记数据</h5><p>timestamp:该数据类型在每一个表中是唯一的!当表中的一个记录更改时,该记录的timestamp字段会自动更新.<br>uniqueidentifier:用于识别数据库里面许多个表的唯一一个记录.</p><h5 id="第九大类-二进制码字符串数据">第九大类:二进制码字符串数据</h5><p>binary:固定长度的二进制码字符串字段,最短为1,最长为8000.</p><p>image:为可变长度的二进制码字符串,最长2G.</p><p>varbinary:与binary差异为数据尾部是00时,varbinary会将其去掉</p><h1>SQL server语法操作、</h1><h4 id="运算符号">运算符号</h4><ul class="lvl-0"><li class="lvl-2"><p>算数运算符</p><ul class="lvl-2"><li class="lvl-6">+、-、*、\、%</li></ul></li><li class="lvl-2"><h2 id="拼接运算符">拼接运算符</h2><pre><code>  * </code></pre></li><li class="lvl-2"><p>比较运算符</p><ul class="lvl-2"><li class="lvl-6">&lt;、&gt;、=、&gt;=、&lt;=、&lt;&gt;，!=</li></ul></li><li class="lvl-2"><p>赋值运算符</p><ul class="lvl-2"><li class="lvl-6">=     --赋值方式  set 和 select</li></ul></li><li class="lvl-2"><p>逻辑运算符</p><ul class="lvl-2"><li class="lvl-6">and、or、not</li></ul></li></ul><p><strong>运算符优先级：()&gt;算术运算符&gt;比较运算符&gt;逻辑运算符(not&gt;and&gt;or)&gt;拼接运算符&gt;赋值运算符</strong></p><h2 id="DDL（data-definition-language）-–-数据定义语言">DDL（data definition language） – 数据定义语言</h2><p>对库内的所有对象的结构做操作的语法称为数据定义语言–定义对象结构</p><p><strong>[]  ----------  代表可以写也可以省略</strong></p><h3 id="create-–-创建">create – 创建</h3><p><strong>数据内的所有对象(表-table、视图-view、存储过程-procedrue、存储函数-function、触发器-trigger、用户user、数据库-database等等)都可以用create创建</strong></p><p>基本语法：create 对象关键字 名字;</p><p>创建表的语法：create table 表名(</p><p>列名 列类型 [约束]，</p><p>列名 列类型 [约束]，</p><p>…</p><p>列名 列类型 [约束]     – 最后一个列不需要，隔开</p><p>)；</p><p>自增：标识列，identity(起始值，增长值)</p><h4 id="约束-–-六大约束-都可以用作维护和保证数据一致性和完整性">约束  – 六大约束  都可以用作维护和保证数据一致性和完整性</h4><ul class="lvl-0"><li class="lvl-2"><p>主键约束（primary key）:用来标识数据行，唯一并且非空，一个主键可以是多个列的组合也可以是一个列，但是表里只能有一个主键。</p></li><li class="lvl-2"><p>唯一约束（unique）：可以为空，但是数据必须没有重复</p></li><li class="lvl-2"><p>非空约束（not null）：不可以为空</p></li><li class="lvl-2"><p>检查约束（check）：检查添加或修改的数据符合规则</p></li><li class="lvl-2"><p>默认约束（default）：当添加或修改时没有给定值，就会填入默认值</p></li><li class="lvl-2"><p>外键约束（foreign key）：连接另外一个表保证数据一致，有外键的表叫做子表，被连接的表叫父表，子表的外键列可以重复，但是父表被连接的列不可以重复，删除数据是先删除子表的数据再删除父表的数据</p></li></ul><h3 id="DROP-–-删除">DROP – 删除</h3><p>drop 对象关键字 对象名; – 不可以撤销</p><p>truncate table 表名; – 清空表数据 不可撤销</p><h3 id="Alter-–-修改">Alter – 修改</h3><p>语法：alter table 表名 …</p><p>添加约束：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">create table StudentInfo(</span><br><span class="line">    ID int not null identity(1,1),--编号</span><br><span class="line">    Number char(10) not null,--学号</span><br><span class="line">    Name varchar(20) not null,--姓名</span><br><span class="line">    Sex char(2) null,--性别</span><br><span class="line">    Age int,--年龄</span><br><span class="line">    Birthday date,--出生日期</span><br><span class="line">    Address varchar(50),--家庭住址</span><br><span class="line">    Class varchar(10)--班级</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">create table Score(</span><br><span class="line">    Number char(10) not null ,--学号</span><br><span class="line">    Subject varchar(20) not null,--科目</span><br><span class="line">    Score decimal(4,1)--分数</span><br><span class="line">)</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>– 删除约束<br>alter table studentinfo drop constraint st_pk</p></li><li class="lvl-2"><p>– 添加主键约束<br>alter table studentinfo add constraint st_pk primary key (id)</p></li><li class="lvl-2"><p>– 外键约束<br>alter table score add constraint st_fk foreign key (number) references studentinfo(number)</p></li><li class="lvl-2"><p>– 唯一<br>alter table studentinfo add constraint st_uk unique (number)</p></li><li class="lvl-2"><p>– 检查<br>alter table studentinfo add constraint st_ck check (age between 6 and 18)</p></li><li class="lvl-2"><p>– 默认<br>alter table studentinfo add constraint st_dk default ‘男’ for sex</p></li><li class="lvl-2"><p>– 非空<br>alter table studentinfo alter column address varchar(50) not null</p></li></ul><h2 id="DML-–-数据操纵语言">DML – 数据操纵语言</h2><h3 id="insert">insert</h3><p>insert into 表名 values (所有列的数据除去identity列),…</p><p>insert into 表名 select ‘李平’,‘男’,18</p><p>insert into 表名 (指定列) values (指定列数据)，…</p><h3 id="update">update</h3><p>update 表名 set 列=值 where 条件</p><h3 id="delete">delete</h3><p>delete from 表名  where 条件</p><h3 id="select">select</h3><p>复制表：select * into 表2 from  表1；复制表1给表2 会表结构和表数据</p><h2 id="函数">函数</h2><p><a href="https://learn.microsoft.com/zh-cn/sql/t-sql/functions/cursor-rows-transact-sql?view=sql-server-2016">https://learn.microsoft.com/zh-cn/sql/t-sql/functions/cursor-rows-transact-sql?view=sql-server-2016</a></p><h5 id="转换函数-convert-数据类型-长度-表达式-n">转换函数 convert(数据类型(长度),表达式[,n])</h5><p>例子：select convert(nvarchar(32),getdate(),120)  – （目标数据类型，要转换的数据，格式代码）</p><table><thead><tr><th><strong>不带世纪数位</strong></th><th><strong>带世纪数位</strong></th><th><strong>格式</strong></th></tr></thead><tbody><tr><td>1</td><td>101</td><td>mm/dd/yyyy</td></tr><tr><td>2</td><td>102</td><td>yy.mm.dd</td></tr><tr><td>3</td><td>103</td><td>dd/mm/yyyy</td></tr><tr><td>4</td><td>104</td><td>dd.mm.yy</td></tr><tr><td>5</td><td>105</td><td>dd-mm-yy</td></tr><tr><td>8</td><td>108</td><td>hh:mi:ss</td></tr><tr><td></td><td>20或120</td><td>yyyy-mm-dd hh:mi::ss(24h)</td></tr><tr><td>23（-）</td><td>111（/）</td><td>yyyy/mm/dd</td></tr></tbody></table><p>CONVERT 函数支持广泛的数据类型转换，包括整数、浮点数、日期、时间、字符串等。你可以根据具体的需求选择合适的数据类型和样式。</p><p>需要注意的是，CONVERT 函数执行显式的数据类型转换，而在某些情况下可能会导致数据截断或格式错误。在使用 CONVERT 函数时，要确保转换操作符合目标数据类型的规范，并小心处理可能出现的错误情况。</p><h5 id="数学函数">数学函数</h5><p>T-SQL中提供的常用的数学函数如下：</p><p>·        abs()：返回绝对值</p><p>·        round(数值表达式,长度,[,类型])：舍入到指定长度或精度。类型为0，表示舍入，类型为非0，表示截断</p><p>·        power(m,n)：返回m的n次幂</p><p>·        trunc()：将数字截断到指定的位数  *</p><p>·        %：求余数，SQL Server没有mod(m,n)，而用m%n代替 取模</p><pre><code>      ceiling()：向上取整函数  floor()</code></pre><h5 id="字符串函数">字符串函数</h5><p>·        ltrim(str,substr)/rtrim(str,substr)：str表示要操作的字符串，substr表示要裁剪的子串，若裁剪空格，则可以省略</p><p>·        substring(str,position,length)：截取字符串</p><p>·        replace(str,search_str,rep_str)：替换一个字符串中的子串。search_str表示要搜索的子字符串，rep_str表示要替换的目标字符串</p><p>·        left(str,n)：返回字符串从左边开始的指定个数的字符</p><p>·        right(str,n)：返回字符串从右边开始的指定个数的字符</p><p>·        len()：求字符串长度</p><h5 id="日期和时间函数">日期和时间函数</h5><p>首先列出日期时间函数中的重要参数。</p><table><thead><tr><th><strong>日期时间元素</strong></th><th><strong>缩写</strong></th><th><strong>含义</strong></th></tr></thead><tbody><tr><td>year</td><td>yy,yyyy</td><td>年</td></tr><tr><td>month</td><td>m,mm</td><td>月</td></tr><tr><td>day</td><td>d,dd</td><td>日</td></tr><tr><td>dayofyear</td><td>dy</td><td>年的天数</td></tr><tr><td>week</td><td>wk</td><td>星期数</td></tr><tr><td>weekday</td><td>dw</td><td>星期几</td></tr><tr><td>hour</td><td>hh</td><td>时</td></tr><tr><td>minute</td><td>mi</td><td>分</td></tr><tr><td>quarter</td><td>qq</td><td>季</td></tr><tr><td>second</td><td>ss</td><td>秒</td></tr><tr><td>millisecond</td><td>ms</td><td>毫秒</td></tr></tbody></table><p>T-SQL中提供下列日期函数：</p><p>·        getdate()：返回当前的日期和时间   – mysql中的now()</p><p>·        year(日期)：返回指定日期的“年”部分的整数</p><p>·        month(日期)：返回指定日期的“月”部分的整数</p><p>·        day(日期)：返回指定日期的“日”部分的整数</p><p>·        datepart(日期元素，日期)：返回日期元素指定的日期部分的整数</p><p>·        datename(日期元素，日期)：以字符串的形式返回日期元素指定时间的日期名称</p><p>·        datediff(日期元素，日期1，日期2)：返回两个日期间的差值并将其转换为指定日期元素的形式</p><p>·        dateadd(日期元素，数值，日期) ：按照“日期元素”给定的日期单位，返回“日期”加上“数值”的新日期</p><p>涉及日期时间常量时，SQL Server建议使用与dateformat及语言环境设置无关的字符串格式，通常这样的字符串常量符合下面两种形式：</p><p>·        日期之间不使用分隔符，格式为yyyymmdd[ hh:mi:[:ss][,mmm]]，如’20070703’，‘20070703 17:53:00.997’。</p><p>·        ISO 8601标准形式，格式为yyyy-mm-ddThh:mi:ss[.mmm]，日期各个部分之间使用“-”分隔符，日期和时间部分用T分隔，并且时间部分不能省略，如’2007-07-03T17:53:10’。</p><h2 id="批处理-GO">批处理-GO</h2><p>批处理是指从应用程序一次性地发送一组完整SQL语句到SQL Server上执行。</p><p>批处理的所有语句被当作一个整体，被成批地分析，编译和执行。</p><p>所有的批处理指令以GO作为结束的标志</p><p>GO的特点:</p><p>1、GO语句必须自成一行，只有注释可以在同一行上</p><p>2、每个批处理单独发送到服务器</p><p>3、GO语句不是T-SQL命令</p><h2 id="事务-TRANSACTION">事务-TRANSACTION</h2><p>概念：成批的sql语句要么全部执行，要么全部不执行；</p><p><strong>特点：</strong></p><ul class="lvl-0"><li class="lvl-2"><p>原子性：事务是数据库的逻辑工作单位。不可分割，要么全部都做要么都不做</p></li><li class="lvl-2"><p>一致性：从一个正确的状态到另外一个正确的状态</p></li><li class="lvl-2"><p>隔离性：事务与事务之间互不干扰</p></li><li class="lvl-2"><p>持久性：事务一旦提交，结果就是永久的</p></li></ul><h5 id="事务和批的区别"><strong>事务和批的区别</strong></h5><p>编程时，一定要区分事务和批的差别。</p><p>1）批是一组整体编译的SQL语句，事务是一组作为单个逻辑工作单元执行的SQL语句。</p><p>2）批语句的组合发生在编译时刻，事务中语句的组合发生在执行时刻。</p><p>3）当在编译时，批中某个语句存在语法错误，系统将取消整个批中所有语句执行，而在运行时刻，如果事务中某个数据修改违反约束、规则等，系统默认只回退到产生该错误的语句。</p><table><thead><tr><th>影响事务正常运行的故障有</th></tr></thead><tbody><tr><td>系统故障</td></tr><tr><td>介质故障</td></tr><tr><td>事务内部的故障</td></tr><tr><td>计算机病毒</td></tr></tbody></table><h4 id="事务分类">事务分类</h4><p>SQL Server 的默认事务隔离级别是“读已提交”（READ COMMITTED）</p><h5 id="显式事务">显式事务</h5><pre><code>就是有明确的开始和结束：开启事务：BEGIN TRANSACTION/TRAN设置事务节点：save transaction 名称提交事务：COMMIT TRANSACTION/TRAN  ,COMMIT WORK回滚事务：ROLLBACK TRANSACTION/TRAN ,ROLLBACK WORK</code></pre><h5 id="隐式事务">隐式事务</h5><pre><code>需要开启隐式事务：SET IMPLICIT_TRANSACTIONS ON -- 开启隐式事务没有明确的开始事务，事务提交之后默认开启下一个事务只有提交和回滚：COMMIT/ROLLBACK  TRANSACTION/TRAN</code></pre><h5 id="自动化事务">自动化事务</h5><pre><code>SQL server默认的事务模式：不需要自己开启或结束事务，默认自动提交</code></pre><p>设置事务保存节点：<strong>SAVE TRANSACTION 事务名称</strong>  节点以下的是事务节点内的操作</p><p>事务个数全局变量：@@TRANCOUNT</p><p><strong>回滚事务不能回滚指定事务 只能回滚部分事务 需要save tran 事务节点名 回滚事务节点这一部分的事务</strong></p><p><strong>提交事务可以提交指定事务名 但是不能提交部分事务</strong></p><h2 id="存储过程">存储过程</h2><p>概念：是一组预先编译的sql语句</p><pre><code> ⼀组为了完成特定功能的SQL语句集合，经编译后存储在数据库中，⽤户通过指定存储过程的名称并给出参数来执行。</code></pre><p><strong>Transact-SQL中的存储过程，非常类似于Java语言中的方法，它可以重复调用。当存储过程执行一次后，可以将语句缓存在内存中，这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。</strong></p><p><strong>调用方式：exec</strong></p><h4 id="存储过程的优点">存储过程的优点</h4><ul class="lvl-0"><li class="lvl-2"><p>简化操作，提高了sql语句的重用性，减少了开发程序员的压力，增加了可移植性</p></li><li class="lvl-2"><p>减少操作过程中的失误，提高效率，执行速度快</p></li><li class="lvl-2"><p>减少网络传输量（客户端不需要把所有的 SQL 语句通过网络发给服务器）减轻网络负担</p></li><li class="lvl-2"><p>减少了 SQL 语句暴露在网上的风险，也提高了数据查询的安全性</p></li></ul><h4 id="SQL-server的系统存储过程">SQL server的系统存储过程</h4><p>都是以sp_开头</p><p>概念：系统存储过程是系统创建的存储过程，⽬的在于能够⽅便的从系统表中查询信息或完成与更新数据库表相关的管理任务或其他的系统管理任务。系统存储过程主要存储在master数据库中，以“sp”下划线开头的存储过程。尽管这些系统存储过程在master数据库中，但我们在其他数据库还是可以调用系统存储过程。有⼀些系统存储过程会在创建新的数据库的时候被⾃动创建在当前数据库中。</p><h5 id="常用的系统存储过程">常用的系统存储过程</h5><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">exec sp_databases; --查看数据库</span><br><span class="line">exec sp_tables; --查看表 </span><br><span class="line">exec sp_columns student;--查看列 </span><br><span class="line">exec sp_helpIndex student;--查看索引 </span><br><span class="line">exec sp_helpConstraint student;--约束 </span><br><span class="line">exec sp_stored_procedures; </span><br><span class="line">exec sp_helptext &#x27;sp_stored_procedures&#x27;;--查看存储过程创建、定义语句 </span><br><span class="line">exec sp_rename studentinfo,student -- 修改表名、索引（index）、列（column）</span><br><span class="line">exec sp_rename &#x27;richinfouser.id&#x27;,&#x27;rid&#x27;,&#x27;column&#x27;</span><br><span class="line">exec sp_renamedb myTempDB, myDB;--更改数据库名称 </span><br><span class="line">exec sp_defaultdb &#x27;master&#x27;, &#x27;myDB&#x27;;--更改登录名的默认数据库 </span><br><span class="line">exec sp_helpdb;--数据库帮助，查询数据库信息 </span><br><span class="line">exec sp_helpdb master;</span><br></pre></td></tr></table></figure><p><strong>判断存储过程是否存在的两种方式：</strong></p><p>if exists(select * from sys.objects where name=‘存储过程名’ )</p><p>if (object_id(‘存储过程名’, ‘P’) is not null)   --P是指定存储过程类型</p><p><strong>无参无返</strong></p><p>例子：create proc/procedure 过程名</p><p>as</p><p>存储过程体</p><p><strong>有参无返</strong></p><p>create  proc proc_find_stu(<br>@id int   – 入参<br>)<br>as<br>select * from students where id=@id; – 存储过程体</p><h5 id="无参有返">无参有返</h5><p>create proc proc_find_stu1(<br>@id int output,<br>@name varchar(20) out<br>)<br>as<br>select @id=2,@name=name from students where id=@id<br>go</p><p>调用</p><p>declare<br>@id int=1,<br>@name varchar(20)<br>exec proc_find_stu1 @id output ,@name out<br>select @id ‘编号’,@name</p><h5 id="有参有返">有参有返</h5><p>create proc proc_find_stu2(<br>@id int,<br>@name varchar(20) out<br>)<br>as<br>select @name=name from students where id=@id<br>go</p><p>调用</p><p>declare<br>@id int=2,<br>@name varchar(20)<br>exec proc_find_stu1 @id ,@name out<br>select @id ‘编号’,@name</p><h5 id="sp-helptext是显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文本。">sp_helptext是显示规则、默认值、未加密的<strong>存储过程</strong>、<strong>用户定义函数</strong>、<strong>触发器</strong>或<strong>视图</strong>的文本。</h5><p>– with recomplie  不缓存</p><p>– with encryption  加密</p><p><strong>分页存储过程</strong>  SQL server没有limit</p><p>分页sql：</p><p>select * from</p><p>(select *,row_number() over(order by 根据排序列 desc)  行号 from 表名) s</p><p>where s.行号 between 起始条 and 终止条;、</p><p>declare @page int–第几页<br>declare @count int–每页显示多少条<br>set @page = 4<br>set @count = 5<br>select top (@count) * from games where 游戏ID not in<br>(select top ((@page-1)*@count) 游戏ID from games</p><p>select top (@条数) * from 表名 where id not in (selecct top (@页数-1)*@条数) id from 表名</p><h5 id="动态的执行sql">动态的执行sql</h5><p>EXEC sp_executesql  @stmt ,@params ,</p><p>@stmt = ,–-类似存储过程主体：需要执行的sql</p><p>@params = , —类似存储过程参数部分，入参、出参、出入参</p><p>—类似存储过程调用</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">例子：</span><br><span class="line"></span><br><span class="line">set @sqlName=&#x27;select @i = COUNT(0) from students&#x27;;</span><br><span class="line">exec sp_executesql @sqlName,N&#x27;@i int output&#x27;,@i output</span><br><span class="line"></span><br><span class="line">@sqlName：需要执行的sql</span><br><span class="line"></span><br><span class="line">N&#x27;@i int output&#x27;：参数，相当于定义时候的参数 N开头意思为后⾯的数据类型为NChar或者NVarchar 使⽤N前缀 </span><br><span class="line"></span><br><span class="line">@i output：相当于调用，调用之后就能获取到数据</span><br></pre></td></tr></table></figure><h2 id="异常处理–exception">异常处理–exception</h2><p><strong>raiserror：返回用户定义的错误信息，可以指定严重级别，设置系统变量记录所发生的错误。</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">RAISERROR ( &#123; msg_id | msg_str | @local_variable &#125;    </span><br><span class="line">      &#123; ,severity ,state &#125;    </span><br><span class="line">      [ ,argument [ ,...n ] ] </span><br><span class="line">     )    </span><br><span class="line">  [ WITH option [ ,...n ] ]</span><br></pre></td></tr></table></figure><p>第一个参数：{ msg_id | msg_str | @local_variable }</p><pre><code>  msg_id：表示可以是一个sys.messages表中定义的消息代号；            使用 sp_addmessage 存储在 sys.messages 目录视图中的用户定义错误消息号。            用户定义错误消息的错误号应当大于 50000。 msg_str：表示也可以是一个用户定义消息，该错误消息最长可以有 2047 个字符；           （如果是常量，请使用N'xxxx'，因为是nvarchar的）            当指定 msg_str 时，RAISERROR 将引发一个错误号为 50000 的错误消息。 @local_variable：表示也可以是按照 msg_str 方式的格式化字符串变量。           </code></pre><p>第二个参数：severity</p><pre><code>       用户定义的与该消息关联的严重级别。（这个很重要）          任何用户都可以指定 0 到 18 之间的严重级别。         [0,10]的闭区间内，不会跳到catch；          如果是[11,19],则跳到catch；          如果[20,无穷)，则直接终止 数据库 连接；</code></pre><p>第三个参数：state</p><pre><code>        如果在多个位置引发相同的用户定义错误，          则针对每个位置使用唯一的状态号有助于找到引发错误的代码段。          介于 1 至 127 之间的任意整数。（state 默认值为1）     当state 值为 0 或 javascript 大于 127 时会生成错误！</code></pre><p>第四个参数：argument</p><pre><code>        用于代替 msg_str 或对应于 msg_id 的消息中的定义的变量的参数。</code></pre><p>第五个参数：option</p><pre><code>        错误的自定义选项，可以是下表中的任一值：          LOG ：在错误日志和 应用 程序日志中记录错误；          NOWAIT：将消息立即发送给 客户 端；          SETERROR：将 @@ERROR 值和 ERROR_NUMBER 值设置为 msg_id 或 50000；</code></pre><p>select * from sys.messages;</p><p>–使⽤sysmessages中定义的消息</p><p>raiserror(<strong>33003</strong>, <strong>16</strong>, <strong>1</strong>); raiserror(<strong>33006</strong>, <strong>16</strong>, <strong>1</strong>);</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">BEGIN TRY</span><br><span class="line">print &#x27;123&#x27;</span><br><span class="line">select 123              -- 可能会发生异常的代码快</span><br><span class="line">select 1/0</span><br><span class="line">END TRY</span><br><span class="line">BEGIN CATCH</span><br><span class="line">raiserror(&#x27;1不能除以0&#x27;,16,5)    -- 处理捕获的异常</span><br><span class="line">END CATCH;</span><br></pre></td></tr></table></figure><h2 id="备份">备份</h2><ul class="lvl-0"><li class="lvl-2"><p>全备份(完整备份)：创建备份完成时数据库内存在的数据的副本。</p></li><li class="lvl-2"><p>差异备份：只记录自上次数据库备份后发生更改的数据。差异数据库备份比数据库备份小，而且备份速度快，因此可以更经常地备份，经常备份将减少丢失数据的危险。</p></li><li class="lvl-2"><p>日志备份：是自上次备份事务日志后对数据库执行的所有事务的一系列记录。可以使用事务日志备份将数据库恢复到特定的即时点（如输入多余数据前的那一点）或恢复到故障点。</p></li><li class="lvl-2"><p>文件组备份：可以备份和还原数据库中的个别文件。可以只还原已损坏的文件，而不用还原数据库的其余部分，从而加快了恢复速度。</p></li></ul><h2 id="索引">索引</h2><ul class="lvl-0"><li class="lvl-2"><p>聚集索引：聚集索引是索引结构和数据一起存放的索引。类似于字典的正文，当我们根据拼音直接就能找到那个字。</p></li><li class="lvl-2"><p>非聚集索引：非聚集索引是索引结构和数据分开存放的索引。类似于根据偏旁部首找字，首先找到该字所在的地址，再根据地址找到这个字的信息。</p></li></ul><h4 id="区别及优缺点">区别及优缺点</h4><p>区别：</p><ol><li class="lvl-3"><p>聚集索引一个表只能有一个，而非聚集索引一个表可以存在多个</p></li><li class="lvl-3"><p>聚集索引存储记录是物理上连续存在，而非聚集索引是逻辑上的连续，物理存储并不连续</p></li><li class="lvl-3"><p>聚集索引:物理存储按照索引排序；聚集索引是一种索引组织形式，索引的键值逻辑顺序决定了表数据行的物理存储顺序。</p></li><li class="lvl-3"><p>非聚集索引:物理存储不按照索引排序；非聚集索引则就是普通索引了，仅仅只是对数据列创建相应的索引，不影响整个表的物理存储顺序。</p></li><li class="lvl-3"><p>索引是通过二叉树的数据结构来描述的，我们可以这么理解聚簇索引：索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点，只不过有一个指针指向对应的数据块。</p></li></ol><h4 id="优势与缺点：">优势与缺点：</h4><p>聚集索引插入数据时速度要慢（时间花费在“物理存储的排序”上，也就是首先要找到位置然后插入），查询数据比非聚集数据的速度快。</p><h4 id="索引优化策略：">索引优化策略：</h4><ol><li class="lvl-3"><p>为经常用于查询条件的列创建索引。</p></li><li class="lvl-3"><p>对于频繁需要排序的列，可以创建索引以加速排序操作。</p></li><li class="lvl-3"><p>为经常需要更新的表创建索引时，考虑索引维护的代价。</p></li><li class="lvl-3"><p>对于有大量数据更新的表，避免在频繁更新的列上创建索引。</p></li><li class="lvl-3"><p>对于包含多个列的查询条件，创建复合索引，确保索引的列顺序与查询条件匹配。</p></li><li class="lvl-3"><p>使用特定的索引类型，如全文索引，适用于文本搜索。</p></li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">-- 确保数据库已启用全文搜索功能</span><br><span class="line">EXEC sp_fulltext_database &#x27;enable&#x27;;</span><br><span class="line"> -- 创建一个全文目录</span><br><span class="line">EXEC sp_fulltext_catalog &#x27;MyFullTextCatalog&#x27;, &#x27;create&#x27;;</span><br><span class="line"> -- 为目标表启用全文索引支持</span><br><span class="line">EXEC sp_fulltext_table &#x27;MyTable&#x27;, &#x27;create&#x27;, &#x27;MyFullTextCatalog&#x27;;</span><br><span class="line"> -- 为表中的列指定全文索引列</span><br><span class="line">EXEC sp_fulltext_column &#x27;MyTable&#x27;, &#x27;MyColumn&#x27;, &#x27;add&#x27;;</span><br><span class="line"> -- 为全文目录填充改变</span><br><span class="line">EXEC sp_fulltext_table &#x27;MyTable&#x27;, &#x27;activate&#x27;;</span><br><span class="line"> -- 启动填充</span><br><span class="line">EXEC sp_fulltext_catalog &#x27;MyFullTextCatalog&#x27;, &#x27;start_full&#x27;;</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">创建索引</span><br><span class="line">create [unique|clustered|nonclustered] index 索引名 on 表(列,...)</span><br><span class="line"></span><br><span class="line">删除索引</span><br><span class="line">drop index 表.索引名</span><br></pre></td></tr></table></figure><h2 id="备份-2">备份</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">完全备份（Full backup）：此备份类型包括整个数据库的所有数据和对象，可用于还原整个数据库到备份时的状态。完全备份需要较多的时间和存储空间。</span><br><span class="line"></span><br><span class="line">差异备份（Differential backup）：差异备份只备份自上次完全备份或差异备份以来发生更改的数据和对象，可以更快地还原数据库到差异备份时的状态。</span><br><span class="line"></span><br><span class="line">日志备份（Log backup）：日志备份仅备份自上次日志备份以来的事务日志，可以用于恢复到某个时间点或事务结束时的状态。</span><br><span class="line"></span><br><span class="line">文件/文件组备份（File/Filegroup backup）：此备份类型是针对数据库的一部分，而不是整个数据库。可以对数据库中的一个或多个文件组进行备份，而不影响其他文件组。</span><br><span class="line"></span><br><span class="line">部分备份（Partial backup）：部分备份是备份整个数据库的一部分，包括一组文件或一个文件组。这种备份类型用于在运行整个数据库的完全备份时，备份较大的数据库的子集。</span><br></pre></td></tr></table></figure><h2 id="mysql和sqlserver的区别">mysql和sqlserver的区别</h2><ol><li class="lvl-3"><p><strong>价格</strong>：MySQL是免费软件，而SQL Server需要购买授权，因此在使用成本上有所不同。</p></li><li class="lvl-3"><p><strong>性能与扩展性</strong>：</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>SQL Server通常被认为是更适合大型企业级应用程序的选择，支持更大的数据量和更高的并发性能，可以更好地处理复杂的查询。</p></li><li class="lvl-2"><p>MySQL则更适合中小型应用程序，尤其是Web应用和小型企业使用，拥有更好的扩展性和灵活性。</p></li></ul><ol><li class="lvl-3"><p><strong>安全性</strong>：</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>SQL Server提供了丰富的安全功能，包括高级的权限管理、加密和审计，对企业级应用程序的安全需求提供了良好的支持。3</p></li><li class="lvl-2"><p>MySQL的安全功能相对较少，但对于一般的应用程序来说已经足够。不过，也有观点认为MySQL的安全性相对较弱，需要额外注意数据备份和安全措施。</p></li></ul><ol><li class="lvl-3"><p><strong>功能差异</strong>：</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>SQL Server对存储过程的支持更加完善，支持多种语言编写。</p></li><li class="lvl-2"><p>MySQL则支持多种存储引擎，给开发人员提供了很大的灵活性。</p></li></ul><ol><li class="lvl-3"><p><strong>平台支持</strong>：</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>SQL Server是由微软公司开发的，主要适用于Windows操作系统。</p></li><li class="lvl-2"><p>MySQL则适用于多个操作系统，包括Windows、Linux和UNIX。</p></li></ul><ol><li class="lvl-3"><p><strong>管理复杂性</strong>：</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>SQL Server的管理相对简单，可以由普通管理员进行管理。</p></li><li class="lvl-2"><p>MySQL的管理比较复杂，可能需要专业的DBA进行管理。</p></li></ul><p>综上所述，MySQL和SQL Server各有优劣，选择哪个数据库软件主要取决于具体的应用场景和需求。例如，对于大型企业级应用，SQL Server可能更合适；而对于中小型网站和Web应用开发，MySQL可能更为适合。</p>]]></content>
    
    
    <summary type="html">MySQL</summary>
    
    
    
    <category term="学习" scheme="http://zxwlove.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="笔记" scheme="http://zxwlove.xyz/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="MySQL" scheme="http://zxwlove.xyz/tags/MySQL/"/>
    
  </entry>
  
  <entry>
    <title>Hive分区表和分桶表</title>
    <link href="http://zxwlove.xyz/posts/hive07.html"/>
    <id>http://zxwlove.xyz/posts/hive07.html</id>
    <published>2024-12-04T08:51:30.000Z</published>
    <updated>2025-01-02T02:21:42.567Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><h2 id="分区表">分区表</h2><ol><li class="lvl-3"><p>分区表实际上就是对应一个HDFS文件系统上的独立的文件夹。</p></li><li class="lvl-3"><p>该文件夹下是该分区所有的数据文件。</p></li><li class="lvl-3"><p>Hive中的分区就是分目录，把一个大的数据集根据业务需要分割成小的数据集。</p></li><li class="lvl-3"><p>在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区，这样的查询效率会提高很多。</p></li></ol><h3 id="分区表基本操作">分区表基本操作</h3><ol><li class="lvl-3"><p>需要根据日期对日志进行管理，通过部门信息模拟</p></li><li class="lvl-3"><p>创建分区表语法</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt;  </span><br><span class="line">create table dept<span class="emphasis">_partition( </span></span><br><span class="line"><span class="emphasis">deptno int, --部门编号 </span></span><br><span class="line"><span class="emphasis">dname string, --部门名称 </span></span><br><span class="line"><span class="emphasis">loc string --部门位置 </span></span><br><span class="line"><span class="emphasis">) </span></span><br><span class="line"><span class="emphasis">partitioned by (day string) </span></span><br><span class="line"><span class="emphasis">row format delimited fields terminated by &#x27;\t&#x27;;</span></span><br></pre></td></tr></table></figure><p><font style="color:#DF2A3F;">注意：分区字段不能是表中已经存在的数据，可以将分区字段看作表的伪列。</font></p><ol start="3"><li class="lvl-3"><p>数据准备</p></li></ol><p>为每个分区准备数据，我们根据日期对日志进行管理，通过部门信息模拟</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">[root@hadoop datas]$ vim dept<span class="emphasis">_20200401.log </span></span><br><span class="line"><span class="emphasis">10 行政部 1700 </span></span><br><span class="line"><span class="emphasis">20 财务部 1800  </span></span><br><span class="line"><span class="emphasis">[root@hadoop datas]$ vim dept_</span>20200402.log </span><br><span class="line">30 教学部 1900 </span><br><span class="line">40 销售部 1700 </span><br><span class="line">[root@hadoop datas]$ vim dept<span class="emphasis">_20200403.log </span></span><br><span class="line"><span class="emphasis">50 运营部 2000 </span></span><br><span class="line"><span class="emphasis">60 人事部 1900 </span></span><br></pre></td></tr></table></figure><ol start="4"><li class="lvl-3"><p>案例实操</p><ol><li class="lvl-7">向dept_partition表的分区加载数据</li></ol></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">hive (default)&gt; load data local inpath &#x27;/opt/module/hive/datas/dept<span class="emphasis">_20200401.log&#x27; into table </span></span><br><span class="line"><span class="emphasis">dept_</span>partition partition(day=&#x27;20200401&#x27;);  </span><br><span class="line">hive (default)&gt; load data local inpath &#x27;/opt/module/hive/datas/dept<span class="emphasis">_20200402.log&#x27; into table </span></span><br><span class="line"><span class="emphasis">dept_</span>partition partition(day=&#x27;20200402&#x27;); </span><br><span class="line">hive (default)&gt; load data local inpath &#x27;/opt/module/hive/datas/dept<span class="emphasis">_20200403.log&#x27; into table </span></span><br><span class="line"><span class="emphasis">dept_</span>partition partition(day=&#x27;20200403&#x27;); </span><br></pre></td></tr></table></figure><p><font style="color:#DF2A3F;">注意：分区表加载数据时，必须指定分区</font></p><p><img src="https://cdn.nlark.com/yuque/0/2024/png/29368235/1733299503410-dba73bf7-6fc5-45d7-9c12-51baf49be9f3.png" alt=""></p><pre><code>2. 查询分区表中数据- 单分区查询</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from dept<span class="emphasis">_partition where day=&#x27;20200401&#x27;;</span></span><br></pre></td></tr></table></figure><pre><code>- 多分区联合查询（union 必走mr 效率较低）</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from dept<span class="emphasis">_partition where day=&#x27;20200401&#x27; </span></span><br><span class="line"><span class="emphasis">              union </span></span><br><span class="line"><span class="emphasis">              select * from dept_</span>partition where day=&#x27;20200402&#x27; </span><br><span class="line"><span class="code">              union </span></span><br><span class="line"><span class="code">              select * from dept_partition where day=&#x27;20200403&#x27;; </span></span><br><span class="line"><span class="code">hive (default)&gt; select * from dept_partition where day=&#x27;20200401&#x27; or </span></span><br><span class="line"><span class="code">                day=&#x27;20200402&#x27; or day=&#x27;20200403&#x27; ;</span></span><br></pre></td></tr></table></figure><ol start="5"><li class="lvl-3"><p>增加分区</p><ol><li class="lvl-7">添加单个分区</li></ol></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; alter table dept<span class="emphasis">_partition add partition(day=&#x27;20200404&#x27;) ; </span></span><br><span class="line"><span class="emphasis">hive (default)&gt; show partitions dept_</span>partition;</span><br></pre></td></tr></table></figure><pre><code>2. 同时添加多个分区</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; alter table dept<span class="emphasis">_partition add partition(day=&#x27;20200405&#x27;) </span></span><br><span class="line"><span class="emphasis">partition(day=&#x27;20200406&#x27;); </span></span><br><span class="line"><span class="emphasis">hive (default)&gt; show partitions dept_</span>partition;</span><br></pre></td></tr></table></figure><ol start="6"><li class="lvl-3"><p>删除分区</p><ol><li class="lvl-7">删除单个分区</li></ol></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; alter table dept<span class="emphasis">_partition drop partition (day=&#x27;20200406&#x27;); </span></span><br><span class="line"><span class="emphasis">hive (default)&gt; show partitions dept_</span>partition;</span><br></pre></td></tr></table></figure><pre><code>2. 同时删除多个分区</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; alter table dept<span class="emphasis">_partition drop partition (day=&#x27;20200404&#x27;), </span></span><br><span class="line"><span class="emphasis">partition(day=&#x27;20200405&#x27;); </span></span><br><span class="line"><span class="emphasis">hive (default)&gt; show partitions dept_</span>partition;</span><br></pre></td></tr></table></figure><ol start="7"><li class="lvl-3"><p>产看分区表结构</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; desc formatted dept<span class="emphasis">_partition; </span></span><br><span class="line"><span class="emphasis"># Partition Information           </span></span><br><span class="line"><span class="emphasis"># col_</span>name              data<span class="emphasis">_type               comment              </span></span><br><span class="line"><span class="emphasis">day                   string </span></span><br></pre></td></tr></table></figure><h3 id="二级分区">二级分区</h3><ol><li class="lvl-3"><p>创建二级分区表</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt;  </span><br><span class="line">create table dept<span class="emphasis">_partition2( </span></span><br><span class="line"><span class="emphasis">       deptno int, </span></span><br><span class="line"><span class="emphasis">       dname string, </span></span><br><span class="line"><span class="emphasis">       loc string </span></span><br><span class="line"><span class="emphasis">       )</span></span><br><span class="line"><span class="emphasis">partitioned by (day string, hour string) </span></span><br><span class="line"><span class="emphasis">row format delimited fields terminated by &#x27;\t&#x27;;</span></span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>加载数据</p><ol><li class="lvl-7">加载数据到二级分区表中</li></ol></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; load data local inpath &#x27;/opt/module/hive/datas/dept<span class="emphasis">_20200401.log&#x27; into table </span></span><br><span class="line"><span class="emphasis">dept_</span>partition2 partition(day=&#x27;20200401&#x27;, hour=&#x27;11&#x27;); </span><br></pre></td></tr></table></figure><pre><code>2. 查询分区数据</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from dept<span class="emphasis">_partition2 where day=&#x27;20200401&#x27; and hour=&#x27;11&#x27;;</span></span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>让分区表和数据产生关联的三种方式</p><ol><li class="lvl-7">方式一：上传数据后修复</li></ol><ul class="lvl-2"><li class="lvl-6">上传数据</li></ul></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; dfs -mkdir -p /user/hive/warehouse/dept<span class="emphasis">_partition2/day=20200401/hour=12; </span></span><br><span class="line"><span class="emphasis">hive (default)&gt; dfs -put /opt/module/hive/datas/dept_</span>20200402.log </span><br><span class="line">/user/hive/warehouse/dept<span class="emphasis">_partition2/day=20200401/hour=12;</span></span><br></pre></td></tr></table></figure><pre><code>- 查询数据（查询不到刚刚上传的数据）</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from dept<span class="emphasis">_partition2 where day=&#x27;20200401&#x27; and hour=&#x27;12&#x27;;</span></span><br></pre></td></tr></table></figure><pre><code>- 执行修复命令</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; msck repair table dept<span class="emphasis">_partition2;</span></span><br></pre></td></tr></table></figure><pre><code>- 再次查询数据</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from dept<span class="emphasis">_partition2 where day=&#x27;20200401&#x27; and hour=&#x27;12&#x27;;</span></span><br></pre></td></tr></table></figure><pre><code>2. 方式二：上传数据后添加分区- 上传数据</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; dfs -mkdir -p /user/hive/warehouse/dept<span class="emphasis">_partition2/day=20200401/hour=13; </span></span><br><span class="line"><span class="emphasis">hive (default)&gt; dfs -put /opt/module/hive/datas/dept_</span>20200403.log </span><br><span class="line">/user/hive/warehouse/dept<span class="emphasis">_partition2/day=20200401/hour=13;</span></span><br></pre></td></tr></table></figure><pre><code>- 执行添加分区</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; alter table dept<span class="emphasis">_partition2 add partition(day=&#x27;20200401&#x27;,hour=&#x27;13&#x27;);</span></span><br></pre></td></tr></table></figure><pre><code>- 查询数据</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from dept<span class="emphasis">_partition2 where day=&#x27;20200401&#x27; and hour=&#x27;14&#x27;;</span></span><br></pre></td></tr></table></figure><pre><code>3. 方式三：创建文件夹后load数据到分区- 创建目录</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; dfs -mkdir -p /user/hive/warehouse/mydb.db/dept<span class="emphasis">_partition2/day=20200401/hour=14;</span></span><br></pre></td></tr></table></figure><pre><code>- 上传数据</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; load data local inpath &#x27;/opt/module/hive/datas/dept<span class="emphasis">_20200401.log&#x27; into table </span></span><br><span class="line"><span class="emphasis"> dept_</span>partition2 partition(day=&#x27;20200401&#x27;,hour=&#x27;14&#x27;);</span><br></pre></td></tr></table></figure><pre><code>- 查询数据</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from dept<span class="emphasis">_partition2 where day=&#x27;20200401&#x27; and hour=&#x27;14&#x27;;</span></span><br></pre></td></tr></table></figure><h3 id="动态分区">动态分区</h3><p>引言：关系型数据库中，对分区表Insert数据时候，数据库自动会根据分区字段的值，将数据插入到相应的分区中， Hive中也提供了类似的机制，即动态分区(Dynamic Partition)，只不过，使用Hive的动态分区，需要进 行相应的配置。</p><ol><li class="lvl-3"><p>开启动态分区参数设置</p></li></ol><p>开启动态分区功能（默认true，开启）</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; set hive.exec.dynamic.partition=true;</span><br></pre></td></tr></table></figure><p>设置为非严格模式（动态分区的模式，默认strict，表示必须指定至少一个分区为静态分区，nonstrict模式表示允 许所有的分区字段都可以使用动态分区。）</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; set hive.exec.dynamic.partition.mode=nonstrict</span><br></pre></td></tr></table></figure><p>在所有执行MR的节点上，最大一共可以创建多少个动态分区。默认1000</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; set hive.exec.max.dynamic.partitions=1000;</span><br></pre></td></tr></table></figure><p>在每个执行MR的节点上，最大可以创建多少个动态分区。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; set hive.exec.max.dynamic.partitions.pernode=100;</span><br></pre></td></tr></table></figure><p>整个MR Job中，最大可以创建多少个HDFS文件。默认100000</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; set hive.exec.max.created.files=100000;</span><br></pre></td></tr></table></figure><p>当有空分区生成时，是否抛出异常。一般不需要设置。默认false</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; set hive.error.on.empty.partition=false;</span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>案例实操</p></li></ol><p>需求：将dept表中的数据按照地区（loc字段），插入到目标表dept_partition_loc的相应分区中。</p><pre><code>1. 创建部门地区分区表dept_partition_loc</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; </span><br><span class="line">create table dept<span class="emphasis">_partition_</span>dynamic( </span><br><span class="line"><span class="code">       id int, </span></span><br><span class="line"><span class="code">       name string </span></span><br><span class="line"><span class="code">) </span></span><br><span class="line"><span class="code">partitioned by (loc int) </span></span><br><span class="line"><span class="code">row format delimited fields terminated by &#x27;\t&#x27;;</span></span><br></pre></td></tr></table></figure><pre><code>2. 以动态分区的方式向dept_partition_loc表中插入数据</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; insert into table dept<span class="emphasis">_partition_</span>loc partition(loc) select deptno, dname, loc </span><br><span class="line">from dept; </span><br><span class="line">FAILED: SemanticException [Error 10096]: Dynamic partition strict mode requires at least one </span><br><span class="line">static partition column. To turn this off set hive.exec.dynamic.partition.mode=nonstrict </span><br><span class="line">hive (default)&gt; set hive.exec.dynamic.partition.mode = nonstrict; </span><br><span class="line">hive (default)&gt; insert into table dept<span class="emphasis">_partition_</span>dynamic partition(loc) select deptno, dname, </span><br><span class="line">loc from dept; </span><br></pre></td></tr></table></figure><pre><code>3. 查看目标分区表的分区情况</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">hive (default)&gt; show partitions dept<span class="emphasis">_partition; </span></span><br><span class="line"><span class="emphasis">OK </span></span><br><span class="line"><span class="emphasis">partition </span></span><br><span class="line"><span class="emphasis">loc=1700 </span></span><br><span class="line"><span class="emphasis">loc=1800 </span></span><br><span class="line"><span class="emphasis">loc=1900 </span></span><br></pre></td></tr></table></figure><h2 id="分桶表">分桶表</h2><h5 id="引言：">引言：</h5><ul class="lvl-0"><li class="lvl-2"><p>分区提供一个隔离数据和优化查询的便利方式。</p></li><li class="lvl-2"><p>不过，并非所有的数据集都可形成合理的分区。</p></li></ul><h5 id="分桶表：">分桶表：</h5><ul class="lvl-0"><li class="lvl-2"><p>对于一张表或者分区，Hive 可以进一步组织成桶，也就是更为细粒度的数据范围划分。</p></li><li class="lvl-2"><p>分桶是将数据集分解成更容易管理的若干部分的另一个技术。</p></li><li class="lvl-2"><p>分区针对的是数据的存储路径（细分文件夹）；分桶针对的是数据文件（按规则多文件放一起）。</p></li></ul><h5 id="案例实操：">案例实操：</h5><ol><li class="lvl-3"><p>创建分桶表</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Hive (default)&gt; create table stu<span class="emphasis">_bucket(id int, name string) </span></span><br><span class="line"><span class="emphasis">clustered by(id)  </span></span><br><span class="line"><span class="emphasis">into 4 buckets </span></span><br><span class="line"><span class="emphasis">row format delimited fields terminated by &#x27;\t&#x27;;</span></span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>查看表结构</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; desc formatted stu<span class="emphasis">_bucket; </span></span><br><span class="line"><span class="emphasis">Num Buckets:            4</span></span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>导入数据</p></li></ol><p>导入数据到分桶表中，load 的方式将HDFS 上的数据导入到分桶表中（注意hive 版本，新版本中load 数 据可以直接跑MR但是也会有点问题，老版本的Hive需要将数据传到一张表中，然后采用查询的方式导入到分桶 表中）</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">// 数据仍然使用student.txt </span><br><span class="line">hive (default)&gt; load data local inpath   &#x27;/opt/module/hive/datas/student.txt&#x27; into table </span><br><span class="line">stu<span class="emphasis">_bucket;</span></span><br></pre></td></tr></table></figure><ol start="4"><li class="lvl-3"><p>查看创建的分桶表中是否分成4个桶</p></li></ol><p><img src="" alt=""></p><ol start="5"><li class="lvl-3"><p>查询分桶的数据</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; select * from stu<span class="emphasis">_bucket;</span></span><br></pre></td></tr></table></figure><ol start="6"><li class="lvl-3"><p>分桶规则：</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>Hive 的分桶采用对分桶字段的值进行哈希，</p></li><li class="lvl-2"><p>然后除以桶的个数求余的方 式决定该条记录存放在哪个桶当中</p></li></ul><ol start="7"><li class="lvl-3"><p>分桶表操作需要注意的事项：</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>mapreduce.job.reduces=-1,让 Job 自行决定需要用多少个 reduce 或者将reduce 的个数设置为大于 等于分桶表的桶数</p></li><li class="lvl-2"><p>从hdfs中load数据到分桶表中，避免本地文件找不到问题(跑MR任务)</p></li></ul><ol start="8"><li class="lvl-3"><p>insert 方式将数据导入分桶表</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; truncate table stu<span class="emphasis">_bucket;（删除表内数据，不删表结构，因此只能删内表） </span></span><br><span class="line"><span class="emphasis">hive(default)&gt; insert into table stu_</span>bucket select * from student ;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">hive分区表和分桶表</summary>
    
    
    
    <category term="学习" scheme="http://zxwlove.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="笔记" scheme="http://zxwlove.xyz/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="Hive" scheme="http://zxwlove.xyz/tags/Hive/"/>
    
    <category term="学习" scheme="http://zxwlove.xyz/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>Hive查询</title>
    <link href="http://zxwlove.xyz/posts/hive06.html"/>
    <id>http://zxwlove.xyz/posts/hive06.html</id>
    <published>2024-11-11T09:56:50.000Z</published>
    <updated>2024-11-23T03:16:50.752Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><h2 id="基础语法及执行循序">基础语法及执行循序</h2><p><a href="https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select">https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select</a></p><ol><li class="lvl-3"><p>查询语句语法</p></li></ol><figure class="highlight sql"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> [<span class="keyword">ALL</span> <span class="operator">|</span> <span class="keyword">DISTINCT</span>] select_expr, select_expr, ... </span><br><span class="line"><span class="keyword">FROM</span> table_reference </span><br><span class="line">[<span class="keyword">WHERE</span> where_condition] </span><br><span class="line">[<span class="keyword">GROUP</span> <span class="keyword">BY</span> col_list] </span><br><span class="line">[<span class="keyword">ORDER</span> <span class="keyword">BY</span> col_list] </span><br><span class="line">[CLUSTER <span class="keyword">BY</span> col_list<span class="operator">|</span> [DISTRIBUTE <span class="keyword">BY</span> col_list] [SORT <span class="keyword">BY</span> col_list]] </span><br><span class="line">[LIMIT number] </span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>书写次序和执行次序</p></li></ol><table><thead><tr><th>顺序</th><th>书写次序</th><th>书写次序说明</th><th>执行次序</th><th>执行次序说明</th></tr></thead><tbody><tr><td>1</td><td>select</td><td>查询</td><td>from</td><td>先执行表与表直接的关系</td></tr><tr><td>2</td><td>from</td><td>先执行表与表直接的关系</td><td>on</td><td></td></tr><tr><td>3</td><td>join on</td><td></td><td>join</td><td></td></tr><tr><td>4</td><td>where</td><td></td><td>where</td><td>过滤</td></tr><tr><td>5</td><td>group by</td><td>分组</td><td>group by</td><td>分组</td></tr><tr><td>6</td><td>having</td><td>分组后再过滤</td><td>having</td><td>分组后再过滤</td></tr><tr><td>7</td><td>distribute by<br/>cluster by</td><td>4个by</td><td>select</td><td>查询</td></tr><tr><td>8</td><td>sort by</td><td></td><td>distinct</td><td>去重</td></tr><tr><td>9</td><td>order by</td><td></td><td>distribute by<br/>cluster by</td><td>4个by</td></tr><tr><td>10</td><td>limit</td><td>限制输出的行数</td><td>sort by</td><td></td></tr><tr><td>11</td><td>union/union all</td><td>合并</td><td>order by</td><td></td></tr><tr><td>12</td><td></td><td></td><td>limit</td><td>限制输出的行数</td></tr><tr><td>13</td><td></td><td></td><td>union/union all</td><td>合并</td></tr></tbody></table><h2 id="基本查询（select-…-from-…）">基本查询（select … from …）</h2><h3 id="全表和特定列查询">全表和特定列查询</h3><h5 id="数据准备">数据准备</h5><p>分别创建部门和员工外部表，并向表中导入数据。</p><ol><li class="lvl-3"><p>在<code>/opt/module/hive/datas</code>目录下编辑文件dept.txt，添加如下内容。</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">[root@hadoop datas]$ vim dept.txt </span><br><span class="line">10 行政部 1700 </span><br><span class="line">20 财务部 1800 </span><br><span class="line">30 教学部 1900 </span><br><span class="line">40 销售部 1700</span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>在/opt/module/hive/datas目录下编辑文件emp.txt，添加如下内容。</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">[root@hadoop datas]$ vim emp.txt </span><br><span class="line">7369 张三 研发 800.00 30 </span><br><span class="line">7499 李四 财务 1600.00 20 </span><br><span class="line">7521 王五 行政 1250.00 10 </span><br><span class="line">7566 赵六 销售 2975.00 40 </span><br><span class="line">7654 侯七 研发 1250.00 30</span><br><span class="line">7698 马八 研发 2850.00 30 </span><br><span class="line">7782 金九 \N 2450.0 30 </span><br><span class="line">7788 银十 行政 3000.00 10 </span><br><span class="line">7839 小芳 销售 5000.00 40 </span><br><span class="line">7844 小明 销售 1500.00 40 </span><br><span class="line">7876 小李 行政 1100.00 10 </span><br><span class="line">7900 小元 讲师 950.00 30 </span><br><span class="line">7902 小海 行政 3000.00 10 </span><br><span class="line">7934 小红明 讲师 1300.00 30</span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>上传数据到HDFS</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; dfs -mkdir /user/hive/warehouse/dept; </span><br><span class="line">hive (default)&gt; dfs -mkdir /user/hive/warehouse/emp; </span><br><span class="line">hive (default)&gt; dfs -put /opt/module/hive/datas/dept.txt /user/hive/warehouse/dept; </span><br><span class="line">hive (default)&gt; dfs -put /opt/module/hive/datas/emp.txt /user/hive/warehouse/emp;</span><br></pre></td></tr></table></figure><ol start="4"><li class="lvl-3"><p>建表语句，创建外部表</p></li></ol><p>创建部门表 dept</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; create external table if not exists dept( </span><br><span class="line">deptno int,--部门编号 </span><br><span class="line">dname string, --部门名称 </span><br><span class="line">loc int --部门位置 </span><br><span class="line">) </span><br><span class="line">row format delimited </span><br><span class="line">fields terminated by &#x27;\t&#x27;;</span><br></pre></td></tr></table></figure><p>创建员工表</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; create external table if not exists emp( </span><br><span class="line">empno int, --员工编号 </span><br><span class="line">ename string, --员工姓名 </span><br><span class="line">job string, --员工岗位（大数据工程师、前端工程师、java工程师） </span><br><span class="line">sal double,--员工薪资 </span><br><span class="line">deptno int --部门编号 </span><br><span class="line">) </span><br><span class="line">row format delimited fields terminated by &#x27;\t&#x27;;</span><br></pre></td></tr></table></figure><h5 id="全表查询">全表查询</h5><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from EMP; </span><br><span class="line">hive (default)&gt; select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp ;</span><br></pre></td></tr></table></figure><h5 id="选择特定列查询">选择特定列查询</h5><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select empno, ename from emp;</span><br></pre></td></tr></table></figure><p><font style="color:#DF2A3F;">注意：SQL 语言大小写不敏感；SQL 可以写在一行或者多行；关键字不能被缩写也不能分行；各子句一般要分行写；使用缩进提高语句的可读性。  </font></p><h3 id="列别名">列别名</h3><ul class="lvl-0"><li class="lvl-2"><p>列别名：为列指定一个别名</p></li><li class="lvl-2"><p>优点：便于计算</p></li><li class="lvl-2"><p>实现：紧跟列名，也可以在列名和别名之间加入关键词‘AS’</p></li><li class="lvl-2"><p>案例实操：查询员工名字和部门名称</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select  </span><br><span class="line"><span class="code">          ename AS name, </span></span><br><span class="line"><span class="code">          deptno dn  </span></span><br><span class="line"><span class="code">from emp;</span></span><br></pre></td></tr></table></figure><h3 id="算数运算符">算数运算符</h3><table><thead><tr><th>运算符</th><th>描述</th></tr></thead><tbody><tr><td>A+B</td><td>A和B相加</td></tr><tr><td>A-B</td><td>A减去B</td></tr><tr><td>A*B</td><td>A和B相乘</td></tr><tr><td>A/B</td><td>A除以B</td></tr><tr><td>A%B</td><td>A对B取余</td></tr><tr><td>A&amp;B</td><td>A和B按位取与</td></tr><tr><td>A</td><td>B</td></tr><tr><td>A^B</td><td>A和B按位取异或</td></tr><tr><td>~A</td><td>A按位取反</td></tr></tbody></table><p>案例实操：查询出所有员工的总收入（薪水+奖金）显示。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select ename, sal+comm  income from emp; </span><br></pre></td></tr></table></figure><h3 id="常用函数（-font-style-color-DF2A3F-set-hive-exec-mode-local-auto-true-本地模式-font-）">常用函数（<font style="color:#DF2A3F;">set hive.exec.mode.local.auto=true;本地模式</font>）</h3><ol><li class="lvl-3"><p>求emp表的总行数（count）</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select count(<span class="emphasis">*) cnt from emp;</span></span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>求emp表中工资的最大值（max）</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select max(sal) max<span class="emphasis">_sal from emp;</span></span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>求emp表中工资的最小值（min）</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select min(sal) min<span class="emphasis">_sal from emp;</span></span><br></pre></td></tr></table></figure><ol start="4"><li class="lvl-3"><p>求emp表中工资的总和（sum）</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select sum(sal) sum<span class="emphasis">_sal from emp;</span></span><br></pre></td></tr></table></figure><ol start="5"><li class="lvl-3"><p>求emp表中工资的平均值（avg）</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select avg(sal) avg<span class="emphasis">_sal from emp;</span></span><br></pre></td></tr></table></figure><h3 id="LIMIT-语句-limit-语句">LIMIT 语句(limit 语句)</h3><p>一般的查询会返回多行数据，在成产环境中，通常使用LIMIT子句用于限制返回的行数。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select ename, sal from emp limit 5; </span><br><span class="line">hive (default)&gt; select ename, sal from emp limit 2,3;</span><br></pre></td></tr></table></figure><h3 id="WHERE-语句-where-语句">WHERE 语句(where 语句)</h3><ul class="lvl-0"><li class="lvl-2"><p>使用WHERE子句，将不满足条件的行过滤掉</p></li><li class="lvl-2"><p>WHERE子句紧随FROM子句</p></li><li class="lvl-2"><p>案例实操：查询出薪水大于1000的所有员工</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from emp where sal &gt; 1000;</span><br></pre></td></tr></table></figure><p><font style="color:#DF2A3F;">注意：where子句中不能使用字段别名。</font></p><h3 id="比较运算符（Between-In-In-Null）">比较运算符（Between/In/In Null）</h3><p>下面表中描述了谓词操作符，这些操作符同样可以用于JOIN…ON和HAVING语句中。</p><p>（<font style="color:#DF2A3F;">null与其他值比较或者运算得到的结果也是null</font>）</p><table><thead><tr><th>操作符</th><th>支持的数据的类型</th><th>描述</th></tr></thead><tbody><tr><td>A=B</td><td>基本数据类型</td><td>如果A等于B则返回TRUE，反之返回FALSE</td></tr><tr><td>A&lt;=&gt;B</td><td>基本数据类型</td><td>如果A和B都为NULL，则返回TRUE，如果一边为NULL，返回False</td></tr><tr><td>A&lt;&gt;B, A!=B</td><td>基本数据类型</td><td>A或者B为NULL则返回NULL；如果A不等于B，则返回TRUE，反之返回FALSE</td></tr><tr><td>A&lt;B</td><td>基本数据类型</td><td>A或者B为NULL，则返回NULL；如果A小于B，则返回TRUE，反之返回FALSE</td></tr><tr><td>A$ \leq $B</td><td>基本数据类型</td><td>A或者B为NULL，则返回NULL；如果A小于等于B，则返回TRUE，反之返回FALSE</td></tr><tr><td>A&gt;B</td><td>基本数据类型</td><td>A或者B为NULL，则返回NULL；如果A大于B，则返回TRUE，反之返回FALSE</td></tr><tr><td>A$ \geq $B</td><td>基本数据类型</td><td>A或者B为NULL，则返回NULL；如果A大于等于B，则返回TRUE，反之返回FALSE</td></tr><tr><td>A [NOT] BETWEEN B AND C</td><td>基本数据类型</td><td>如果A，B或者C任一为NULL，则结果为NULL。<br/>如果A的值大于等于B而且小于或等于C，则结果为TRUE，反之为FALSE。<br/>如果使用NOT关键字则可达到相反的效果。</td></tr><tr><td>A IS NULL</td><td>所有数据类型</td><td>如果A等于NULL，则返回TRUE，反之返回FALSE</td></tr><tr><td>A IS NOT NULL</td><td>所有数据类型</td><td>如果A不等于NULL，则返回TRUE，反之返回FALSE</td></tr><tr><td>IN(数值1, 数值2)</td><td>所有数据类型</td><td>使用 IN运算显示列表中的值</td></tr><tr><td>A [NOT] LIKE B</td><td>STRING类型</td><td>B是一个SQL下的简单正则表达式，也叫通配符模式，<br/>如果A与其匹配的话，返回TRUE；反之返回FALSE。<br/>B的表达式说明如下：<br/>‘x%’表示A必须以字母‘x’开头，（%代表任意个数字符）<br/>‘%x’表示A必须以字母’x’结尾，（_代表任一一个字符）<br/>‘%x%’表示A包含有字母’x’,可以位于开头，结尾或者字符串中间。<br/>如果使用NOT关键字则可达到相反的效果。（不支持正则）</td></tr><tr><td>A RLIKE B</td><td>STRING类型</td><td>B是基于java的正则表达式，如果A与其匹配，则返回TRUE； 反之返回FALSE。<br/>匹配使用的是JDK中的正则表达式接口实现的，因为正则也依据其中的规则。<br/>例如，正则表达式必须和整个字符串A相匹配，而不是只需与其子字符串匹配。</td></tr></tbody></table><p>案例实操：</p><pre><code>1. 查询出薪水等于5000的所有员工</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from emp where sal =5000; </span><br><span class="line">OK </span><br><span class="line">emp.empno       emp.ename       emp.job emp.mgr emp.hiredate    emp.sal emp.comm        </span><br><span class="line">emp.deptno </span><br><span class="line">7839    KING    PRESIDENT       NULL    1981-11-17      5000.0  NULL    10 </span><br></pre></td></tr></table></figure><pre><code>2. 查询工资在500到1000的员工信息</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from emp where sal between 800 and 1100; </span><br><span class="line">OK </span><br><span class="line">emp.empno       emp.ename       emp.job emp.mgr emp.hiredate    emp.sal emp.comm        </span><br><span class="line">emp.deptno </span><br><span class="line">7369    SMITH   CLERK   7902    1980-12-17      800.0   NULL    20 </span><br><span class="line">7876    ADAMS   CLERK   7788    1987-5-23       1100.0  NULL    20 </span><br><span class="line">7900    JAMES   CLERK   7698    1981-12-3       950.0   NULL    30</span><br></pre></td></tr></table></figure><pre><code>3.  查询job为空的所有员工信息</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from emp where job is null; </span><br><span class="line">OK </span><br><span class="line">emp.empno       emp.ename       emp.job emp.mgr emp.hiredate    emp.sal emp.comm        </span><br><span class="line">emp.deptno </span><br><span class="line">7369    SMITH   CLERK   7902    1980-12-17      800.0   NULL    20 </span><br><span class="line">7566    JONES   MANAGER 7839    1981-4-2        2975.0  NULL    20 </span><br><span class="line">7698    BLAKE   MANAGER 7839    1981-5-1        2850.0  NULL    30 </span><br><span class="line">……</span><br></pre></td></tr></table></figure><pre><code>4. 查询工资是1500或5000的员工信息</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from emp where sal IN (1500, 5000); </span><br><span class="line">OK </span><br><span class="line">emp.empno       emp.ename       emp.job emp.mgr emp.hiredate    emp.sal emp.comm        </span><br><span class="line">emp.deptno </span><br><span class="line">7839    KING    PRESIDENT       NULL    1981-11-17      5000.0  NULL    10 </span><br><span class="line">7844    TURNER  SALESMAN        7698    1981-9-8        1500.0  0.0     30</span><br></pre></td></tr></table></figure><h3 id="LIKE和RLIKE-like和rlike">LIKE和RLIKE(like和rlike)</h3><ul class="lvl-0"><li class="lvl-2"><p>like关键词：使用LIKE运算选择类似的值</p></li><li class="lvl-2"><p>选择条件可以包含字符或数字：</p></li></ul><p><code>%</code>  $ \rightarrow $  代表零个或多个字符(任意个字符)。</p><p><code>_</code>  $ \rightarrow $  代表一个字符。</p><ul class="lvl-0"><li class="lvl-2"><p>RLIKE关键字：RLIKE子句是Hive中这个功能的一个扩展，其可以通过Java的正则表达式这个更强大的 语言来指定匹配条件。</p></li></ul><p><code>$x </code> $ \rightarrow $  代表以x结尾</p><p><code>^x </code> $ \rightarrow $  代表以x开头</p><p><code>.*</code>  $ \rightarrow $  任意数量字符</p><p><code>.</code>  $ \rightarrow $  一个任意字符</p><p><code>*</code> $ \rightarrow $  上一个字符可以无限次出现或者不出现</p><ul class="lvl-0"><li class="lvl-2"><p>案例实操</p><ol><li class="lvl-7">查找名字以“小”开头的员工信息</li></ol></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from emp where ename LIKE &#x27;小%&#x27;;</span><br><span class="line">hive (default)&gt; select * from emp where ename RLIKE &#x27;^小&#x27;;</span><br></pre></td></tr></table></figure><pre><code>2. 查找名字以“明”结尾的员工信息</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from emp where ename LIKE &#x27;%明&#x27;;</span><br><span class="line">hive (default)&gt; select * from emp where ename RLIKE &#x27;明$&#x27;;</span><br></pre></td></tr></table></figure><pre><code>3. 查找名字中带有“明”的员工信息</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from emp where ename  LIKE &#x27;%明%&#x27;;</span><br><span class="line">hive (default)&gt; select * from emp where ename  RLIKE &#x27;[明]&#x27;; </span><br></pre></td></tr></table></figure><h3 id="逻辑运算符（AND-OR-NOT）">逻辑运算符（AND/OR/NOT）</h3><table><thead><tr><th>操作符</th><th>含义</th></tr></thead><tbody><tr><td>AND</td><td>逻辑并</td></tr><tr><td>OR</td><td>逻辑或</td></tr><tr><td>NOT</td><td>逻辑否</td></tr></tbody></table><p>案例操作：</p><pre><code>1. 查询薪水大于1000，部门是30</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from emp where sal&gt;1000 and deptno=30; </span><br><span class="line">OK </span><br><span class="line">emp.empno       emp.ename       emp.job emp.mgr emp.hiredate    emp.sal emp.comm        </span><br><span class="line">emp.deptno </span><br><span class="line">7499    ALLEN   SALESMAN        7698    1981-2-20       1600.0  300.0   30 </span><br><span class="line">7521    WARD    SALESMAN        7698    1981-2-22       1250.0  500.0   30 </span><br><span class="line">7654    MARTIN  SALESMAN        7698    1981-9-28       1250.0  1400.0  30 </span><br><span class="line">7698    BLAKE   MANAGER 7839    1981-5-1        2850.0  NULL    30 </span><br><span class="line">7844    TURNER  SALESMAN        7698    1981-9-8        1500.0  0.0     30</span><br></pre></td></tr></table></figure><pre><code>2. 查询薪水大于1000，或者部门是30</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from emp where sal&gt;1000 or deptno=30; </span><br><span class="line">OK </span><br><span class="line">emp.empno       emp.ename       emp.job emp.mgr emp.hiredate    emp.sal emp.comm        </span><br><span class="line">emp.deptno </span><br><span class="line">7499    ALLEN   SALESMAN        7698    1981-2-20       1600.0  300.0   30 </span><br><span class="line">7521    WARD    SALESMAN        7698    1981-2-22       1250.0  500.0   30 </span><br><span class="line">7566    JONES   MANAGER 7839    1981-4-2        2975.0  NULL    20 </span><br><span class="line">7654    MARTIN  SALESMAN        7698    1981-9-28       1250.0  1400.0  30 </span><br><span class="line">7698    BLAKE   MANAGER 7839    1981-5-1        2850.0  NULL    30 </span><br><span class="line">7782    CLARK   MANAGER 7839    1981-6-9        2450.0  NULL    10 </span><br><span class="line">7788    SCOTT   ANALYST 7566    1987-4-19       3000.0  NULL    20 </span><br><span class="line">7839    KING    PRESIDENT       NULL    1981-11-17      5000.0  NULL    10 </span><br><span class="line">7844    TURNER  SALESMAN        7698    1981-9-8        1500.0  0.0     30 </span><br><span class="line">7876    ADAMS   CLERK   7788    1987-5-23       1100.0  NULL    20 </span><br><span class="line">7900    JAMES   CLERK   7698    1981-12-3       950.0   NULL    30 </span><br><span class="line">7902    FORD    ANALYST 7566    1981-12-3       3000.0  NULL    20 </span><br><span class="line">7934    MILLER  CLERK   7782    1982-1-23       1300.0  NULL    10 </span><br></pre></td></tr></table></figure><pre><code>3. 查询除了20部门和30部门以外的员工信息</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from emp where deptno not IN(30, 20); </span><br><span class="line">OK </span><br><span class="line">emp.empno       emp.ename       emp.job emp.mgr emp.hiredate    emp.sal emp.comm        </span><br><span class="line">emp.deptno </span><br><span class="line">7782    CLARK   MANAGER 7839    1981-6-9        2450.0  NULL    10 </span><br><span class="line">7839    KING    PRESIDENT       NULL    1981-11-17      5000.0  NULL    10 </span><br><span class="line">7934    MILLER  CLERK   7782    1982-1-23       1300.0  NULL    10</span><br></pre></td></tr></table></figure><h2 id="分组">分组</h2><h3 id="GROUP-BY-语句（group-by-语句）">GROUP BY 语句（group by 语句）</h3><p>GROUP BY语句通常会和<code>聚合函数</code>一起使用，按照一个或者多个列队结果进行分组，然后对每个组执行聚合操作。</p><p>案例实操：</p><pre><code>1. 计算emp表每个部门的平均工资</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select t.deptno, avg(t.sal) avg<span class="emphasis">_sal from emp t group by t.deptno; </span></span><br><span class="line"><span class="emphasis">OK </span></span><br><span class="line"><span class="emphasis">t.deptno        avg_</span>sal </span><br><span class="line">10      2916.6666666666665 </span><br><span class="line">20      2175.0 </span><br><span class="line">30      1566.6666666666667 </span><br></pre></td></tr></table></figure><pre><code>2. 计算emp每个部门中每个岗位的最高薪水</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select t.deptno, t.job, max(t.sal) max<span class="emphasis">_sal from emp t group by t.deptno, t.job; </span></span><br><span class="line"><span class="emphasis">OK </span></span><br><span class="line"><span class="emphasis">t.deptno        t.job   max_</span>sal </span><br><span class="line">20      ANALYST 3000.0 </span><br><span class="line">10      CLERK   1300.0 </span><br><span class="line">20      CLERK   1100.0 </span><br><span class="line">30      CLERK   950.0 </span><br><span class="line">10      MANAGER 2450.0 </span><br><span class="line">20      MANAGER 2975.0 </span><br><span class="line">30      MANAGER 2850.0 </span><br><span class="line">10      PRESIDENT       5000.0 </span><br><span class="line">30      SALESMAN        1600.0 </span><br></pre></td></tr></table></figure><h3 id="HAVING-语句（having-语句）">HAVING 语句（having 语句）</h3><p>having与where不同点：</p><p>where后面不能写聚合函数，而having后面可以使用聚合函数。</p><p>having只用于group by分组统计语句。</p><p>案例实操：</p><pre><code>1. 求每个部门的平均工资</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select deptno, avg(sal) from emp group by deptno; </span><br><span class="line">OK </span><br><span class="line">t.deptno        avg<span class="emphasis">_sal </span></span><br><span class="line"><span class="emphasis">10      2916.6666666666665 </span></span><br><span class="line"><span class="emphasis">20      2175.0 </span></span><br><span class="line"><span class="emphasis">30      1566.6666666666667 </span></span><br></pre></td></tr></table></figure><pre><code>2. 求每个部门的平均薪水大于2000的部门</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select deptno, avg(sal) avg<span class="emphasis">_sal from emp group by deptno having avg_</span>sal &gt; 2000; </span><br><span class="line">OK </span><br><span class="line">deptno  avg<span class="emphasis">_sal </span></span><br><span class="line"><span class="emphasis">10      2916.6666666666665 </span></span><br><span class="line"><span class="emphasis">20      2175.0 </span></span><br></pre></td></tr></table></figure><h2 id="JOIN-语句">JOIN 语句</h2><p><img src="https://cdn.nlark.com/yuque/0/2024/jpeg/29368235/1731308670156-a61c528d-7067-4fbb-8378-d6887739bf4a.jpeg" alt=""></p><p>具体查看：<a href="https://www.codeproject.com/articles/33052/visual-representation-of-sql-joins">Visual Representation of SQL Joins- CodeProject</a></p><p>数据准备：</p><p>（set mapreduce.job.reduces;</p><p>mapreduce.job.reduces=-1）默认是按照数据量来分配</p><p>为了体现学习上述所种join方式，现在需要为emp表和dept表添加特有数据</p><p>为emp表添加一条数据，员工编号1001，姓名fanfan等信息，但是部门编号设为50</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive(defult)&gt; insert into table emp values(1001, &#x27;fanfan&#x27;, &#x27;sing&#x27;,7839, &#x27;2021-08</span><br><span class="line">16&#x27;,9000000,500000,50);</span><br></pre></td></tr></table></figure><h3 id="等值-JOIN">等值 JOIN</h3><p>Hive支持通常的SQL JOIN语句。</p><p>案例实操：根据dept表和emp表中的deptno相等，查询empno、deptno、ename和dname；</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; select </span><br><span class="line">empno, </span><br><span class="line">dept.deptno, </span><br><span class="line">ename, </span><br><span class="line">dname </span><br><span class="line">from emp </span><br><span class="line">join dept on emp.deptno=dept.deptno; </span><br></pre></td></tr></table></figure><h3 id="表的别名-AS">表的别名 AS</h3><p>使用表的别名的好处</p><ul class="lvl-0"><li class="lvl-2"><p>使用别名可以简化查询。</p></li><li class="lvl-2"><p>使用表的别名可以区分字段的来源。</p></li></ul><p>案例实操：合并员工表和部门表</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select  </span><br><span class="line">e.empno, </span><br><span class="line">d.deptno, </span><br><span class="line">e.ename, </span><br><span class="line">d.dname </span><br><span class="line">from emp e </span><br><span class="line">join dept d on e.deptno=d.deptno; </span><br></pre></td></tr></table></figure><h3 id="内连接-INNER-JOIN">内连接 INNER JOIN</h3><p><img src="https://cdn.nlark.com/yuque/0/2024/png/29368235/1732328432397-653df6a9-2c75-4708-957f-c9459aa8e6cc.png" alt=""></p><p>内连接：只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。</p><p>案例实操：通过emp表和dept表查询员工编号、员工姓名、部门编号、部门名称。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select </span><br><span class="line">e.empno, </span><br><span class="line">e.ename, </span><br><span class="line">e.deptno, </span><br><span class="line">d.deptno, </span><br><span class="line">d.dname </span><br><span class="line">from emp e </span><br><span class="line">join dept d on e.deptno=d.deptno; </span><br></pre></td></tr></table></figure><h3 id="左外连接-LEFT-JOIN">左外连接 LEFT JOIN</h3><p><img src="https://cdn.nlark.com/yuque/0/2024/png/29368235/1732328444957-544e8ce8-4256-46a3-aad9-615544e20c8b.png" alt=""></p><p>左外连接：JOIN操作符左边表中符合join子句的所有记录将会被返回。</p><p>案例实操：通过emp表和dept表查询员工编号、员工姓名、部门编号、部门名称。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; select </span><br><span class="line">e.empno, </span><br><span class="line">e.ename, </span><br><span class="line">e.deptno, </span><br><span class="line">d.deptno, </span><br><span class="line">d.dname </span><br><span class="line">from emp e </span><br><span class="line">left join dept d on e.deptno=d.deptno; </span><br><span class="line">ok </span><br><span class="line">e.empno  e.ename   e.deptno  d.deptno  d.dname </span><br><span class="line">1001      fanfan    50          NULL       NULL </span><br><span class="line">…… </span><br></pre></td></tr></table></figure><h3 id="右外连接-RIGHT-JOIN">右外连接 RIGHT JOIN</h3><p><img src="https://cdn.nlark.com/yuque/0/2024/png/29368235/1732328480867-9ab8ac64-c0f6-4452-baf8-e6299886ac30.png" alt=""></p><p>右外连接：JOIN操作符右边表中符合join子句的所有记录将会被返回。</p><p>案例实操：通过emp表和dept表查询员工编号、员工姓名、部门编号、部门名称。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select </span><br><span class="line">e.empno, </span><br><span class="line">e.ename, </span><br><span class="line">e.deptno, </span><br><span class="line">d.deptno, </span><br><span class="line">d.dname </span><br><span class="line">from emp e </span><br><span class="line">right join dept d on e.deptno=d.deptno; </span><br><span class="line">OK </span><br><span class="line">e.empno  e.ename   e.deptno  d.deptno  d.dname </span><br><span class="line">NULL      NULL       NULL      40         OPERATIONS </span><br></pre></td></tr></table></figure><h3 id="满外连接-OUTER-JOIN">满外连接 OUTER JOIN</h3><p><img src="https://cdn.nlark.com/yuque/0/2024/png/29368235/1732328743769-f12760b9-7cf3-478b-ac90-9698aacf16eb.png" alt=""></p><p>满外连接：将会返回所有表中符合WHERE语句条件的所有记录。</p><p>案例实操：通过emp表和dept表查询员工编号、员工姓名、部门编号、部门名称。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select </span><br><span class="line"><span class="code">           e.empno, </span></span><br><span class="line"><span class="code">           e.ename, </span></span><br><span class="line"><span class="code">           e.deptno, </span></span><br><span class="line"><span class="code">           d.deptno, </span></span><br><span class="line"><span class="code">           d.dname </span></span><br><span class="line"><span class="code">           from emp e </span></span><br><span class="line"><span class="code">full join dept d on e.deptno=d.deptno; </span></span><br><span class="line"><span class="code">Ok </span></span><br><span class="line"><span class="code">e.empno  e.ename   e.deptno  d.deptno  d.dname </span></span><br><span class="line"><span class="code">NULL      NULL       NULL      40         OPERATIONS </span></span><br><span class="line"><span class="code">1001      fanfan    50          NULL       NULL </span></span><br><span class="line"><span class="code">…… </span></span><br></pre></td></tr></table></figure><h3 id="多表连接-OUTER-EXCLUDING-JOIN">多表连接 OUTER EXCLUDING JOIN</h3><p><img src="https://cdn.nlark.com/yuque/0/2024/png/29368235/1732328984943-ee8e6ba7-b064-4579-95f8-8ecdc5253af8.png" alt=""></p><p><font style="color:#DF2A3F;">注意：连接 n个表，至少需要n-1个连接条件。例如：连接三个表，至少需要两个连接条件。</font></p><ol><li class="lvl-3"><p>数据准备：在/opt/module/hive/datas/ 下创建文件location.txt，内容如下：</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[root@hadoop datas]$ vim location.txt </span><br><span class="line">1700 北京 </span><br><span class="line">1800 上海 </span><br><span class="line">1900 深圳 </span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>创建表location</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">hive(default)&gt; create table if not exists location( </span><br><span class="line">loc int, --部门位置id </span><br><span class="line">loc<span class="emphasis">_name string --部门位置 </span></span><br><span class="line"><span class="emphasis">) </span></span><br><span class="line"><span class="emphasis">row format delimited fields terminated by &#x27;\t&#x27;; </span></span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"></li></ul><p>向location表中导入数据</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; load data local inpath &#x27;/opt/module/hive/datas/location.txt&#x27; into table location; </span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>多表连接实操：查询每个员工姓名、部门名称及部门所在地。</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select </span><br><span class="line"><span class="code">           e.ename, </span></span><br><span class="line"><span class="code">           d.dname, </span></span><br><span class="line"><span class="code">           l.loc_name </span></span><br><span class="line"><span class="code">from emp e </span></span><br><span class="line"><span class="code">join dept d on e.deptno=d.deptno </span></span><br><span class="line"><span class="code">join location l on d.loc=l.loc; </span></span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>join操作转换成MR：</p></li></ol><p>大多数情况下，Hive会对每对JOIN连接对象启动一个MapReduce任务。<br>本例中会首先启动一个MapReduce job对表e和表d进行连接操作，<br>然后会再启动一个MapReduce job将第一个MapReduce job的输出和表l进行连接操作。</p><p>注意：为什么不是表d和表l先进行连接操作呢？这是因为Hive总是按照从<code>左到右的顺序执行</code>的。</p><h3 id="笛卡尔积">笛卡尔积</h3><p>笛卡尔积会在下面条件下产生：</p><p>省略连接条件</p><p>连接条件无效</p><p>所有表中的所有行互相连接</p><p>案例实操：hive (default)&gt; <code>select empno, dname from &lt;font style=&quot;color:#DF2A3F;&quot;&gt;emp, dept&lt;/font&gt;;</code></p><h2 id="排序">排序</h2><h3 id="全局排序-ORDER-BY">全局排序 ORDER BY</h3><ol><li class="lvl-3"><p>order by:全局排序，<font style="color:#DF2A3F;">只有一个Reducer</font></p></li><li class="lvl-3"><p>顺序：<font style="color:#DF2A3F;">ASC</font>(ascend)：升序（默认升序）；<font style="color:#DF2A3F;">DESC</font>(descend)：降序</p></li><li class="lvl-3"><p>位置：ORDER BY子句在SELECT语句的<font style="color:#DF2A3F;">结尾</font></p></li><li class="lvl-3"><p>案例实操：</p></li></ol><p>查询员工信息按工资升序排列</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from emp order by sal; </span><br></pre></td></tr></table></figure><p>查询员工信息按工资降序排列</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from emp order by sal desc;</span><br></pre></td></tr></table></figure><p>按照员工薪水的2倍排序</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select ename, sal<span class="emphasis">*2 twosal from emp order by twosal;</span></span><br></pre></td></tr></table></figure><p>按照部门和工资升序排序</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select ename, deptno, sal from emp order by deptno, sal ;</span><br></pre></td></tr></table></figure><p><em><font style="color:#DF2A3F;">使用order by 对数据排序时只有一个reduce，面对海量数据排序时，一个reduce 效率太低，并且大 多数场景下，并不需要全局排序。</font></em></p><h3 id="每个REDUCE内部排序（SORT-BY）">每个REDUCE内部排序（SORT BY）</h3><ol><li class="lvl-3"><p>sort by：在每个 Reducer 内部进行排序，对全局结果集来说不是有序。sort by 为每个 reducer 产生一 个排序文件，每个Reducer内部进行排序，对全局结果来说不是排序。</p></li><li class="lvl-3"><p>通过命令设置reduce个数（<font style="color:#DF2A3F;">Hive默认会根据数据量来设置reduce的个数，这里手动设置reduce个数</font>）</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; set mapreduce.job.reduces=3; </span><br><span class="line">hive (default)&gt; set mapreduce.job.reduces;</span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>案例实操：</p></li></ol><p>根据部门编号降序查看员工信息</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from emp sort by deptno desc;</span><br></pre></td></tr></table></figure><p>将查询结果导入到文件中（按照部门编号降序排序）</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">hive (default)&gt; insert overwrite local directory &#x27;/opt/module/hive/datas/sortby-result&#x27; </span><br><span class="line">row format delimited fields terminated by &#x27;\t &#x27; </span><br><span class="line">select *  </span><br><span class="line">from emp  </span><br><span class="line">sort by deptno desc;</span><br></pre></td></tr></table></figure><h3 id="分区（DISTRIBUTE-BY）">分区（DISTRIBUTE BY）</h3><p>distribute by：在有些情况下，我们需要控制某个特定行应该到哪个reducer，通常时为了进行后续的聚集操作。 distribute by 可以实现。distribute by 类似 MR 中 partition（自定义分区），进行分区，结合 sort by 使用。对于distribute by 进行测试，一定要分配多reduce进行处理，否则无法看到distribute by的效果。</p><p>案例实操：先按照部门编号分区，再按照员工薪水降序排序。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; set mapreduce.job.reduces=3; </span><br><span class="line">hive (default)&gt; insert overwrite local directory &#x27;/opt/module/hive/datas/distribute-result&#x27; </span><br><span class="line">row format delimited fields terminated by &#x27;\t&#x27; </span><br><span class="line">select </span><br><span class="line">ename, </span><br><span class="line">empno, </span><br><span class="line">deptno, </span><br><span class="line">sal  </span><br><span class="line">from emp  </span><br><span class="line">distribute by deptno </span><br><span class="line">sort by sal desc; </span><br></pre></td></tr></table></figure><p><font style="color:#DF2A3F;">注意：</font></p><ul class="lvl-0"><li class="lvl-2"><p><font style="color:#DF2A3F;">distribute by 的分区规则是根据分区字段的hash 码与reduce 的个数进行模除后，余数相同的分到一起。</font></p></li><li class="lvl-2"><p><font style="color:#DF2A3F;">Hive 要求DISTRIBUTE BY 语句要写在SORT BY 语句之前。</font></p></li><li class="lvl-2"><p><font style="color:#DF2A3F;">测试完毕后，记得将mapreduce.job.reduces 的值恢复到-1，否则下面的分区和分桶测试就会报错。</font></p></li></ul><h3 id="CLUSTER-BY">CLUSTER BY</h3><p>cluster by：</p><ul class="lvl-0"><li class="lvl-2"><p>当distribute by 和sort by 字段相同时，可以使用cluster by方式。</p></li><li class="lvl-2"><p>cluster by 除了具有distribute by 的功能外还兼具sort by的功能。</p></li><li class="lvl-2"><p>但是<font style="color:#DF2A3F;">排序只能是升序排序</font>，不能指定排序规则为ASC或者DESC。</p></li></ul><p>案例实操：查询emp表中的员工姓名、员工编号、部门编号、薪资，并按照部门编号分区排序。 以下两种写法等价</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select ename,empno,deptno,sal from emp cluster by deptno; </span><br><span class="line">hive (default)&gt; select ename,empno,deptno,sal from emp distribute by deptno sort by deptno;</span><br></pre></td></tr></table></figure><p><font style="color:#DF2A3F;">注意：按照部门编号分区，不一定就是固定死的数值，可以是20号和30号部门分到一个分区里面。</font></p>]]></content>
    
    
    <summary type="html">hive查询</summary>
    
    
    
    <category term="学习" scheme="http://zxwlove.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="笔记" scheme="http://zxwlove.xyz/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="Hive" scheme="http://zxwlove.xyz/tags/Hive/"/>
    
    <category term="学习" scheme="http://zxwlove.xyz/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>HCIA-821模拟卷</title>
    <link href="http://zxwlove.xyz/posts/hcia-821.html"/>
    <id>http://zxwlove.xyz/posts/hcia-821.html</id>
    <published>2024-11-07T03:38:27.000Z</published>
    <updated>2024-11-07T04:02:44.162Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>最近忙着实习，忙着考试，忙着好多好多，想闲下来。在网上找题库，找不齐。浅浅的上传一个模拟卷。</p></blockquote><p><strong>（HCIA-821模拟卷）</strong></p><p>1、网络管理员给网络中的某台主机分配的IPv4地址为192.168.1.1/28、则这个主机所在的网络还可以增加多少台主机?（  ）</p><p>A、12   B、15    C、13   D、14</p><p>试题答案：C</p><p>试题解析：192.168.1.1/28对应的2进制表示为11000000.10101000.00000001.0000 0000/28。前28位固定为网络位，最后4位为主机位。网络位固定不变，变化主机位！可以看到主机位可以从0000变化到1111，共16种变化！除去主机位全0（代表网络地址）、全1（代表广播地址）的情况，剩下14个合法的IP地址，范围是192.168.1.1~192.168.1.14。故选C。</p><p>2、下面哪个OSPF版本适用于IPv6?（  ）</p><p>A、OSPFv1    B、OSPFv2    C、OSPFv3     D、OSPFv4</p><p>试题答案：C</p><p>试题解析：OSPF协议是为IP协议提供路由功能的路由协议。OSPFv2（OSPF版本2）是支持IPv4的路由协议，为了让OSPF协议支持IPv6，技术人员开发了OSPFv3（OSPF版本3），OSPFv3由RFC2740定义。故选C。</p><p>3、VRP操作平台、以下哪条命令可以只查看静态路由?（  ）</p><p>A、display ip routing-table statistics      B、display ip routing-table verbose</p><p>C、display ip routing-table       D、display ip routing-table protocol static</p><p>试题答案：D</p><p>试题解析：display ip routing-table protocol static，该命令是只查看路由表中通过静态配置方式获得路由条目。故选D。</p><p>4、路由器工作在OSI参考模型的哪一层?（  ）</p><p>A、数据链路层  B、传输层  C、应用层   D、网络层</p><p>试题答案：D</p><p>试题解析：路由器工作在OSI七层模型的第三层网络层，路由器使用IP地址进行寻址，实现源IP到目标IP的端到端的无连接数据报服务。故选D。</p><p>5、如果应用层协议为TeInet，那么IPv4首部中Protocol字段取值为?（  ）</p><p>A、23   B、17   C、6   D、67</p><p>试题答案：C</p><p>试题解析：ipv4报文头部中的protocol字段的作用为描述上层协议，数值为6的时候代表上层使用tcp协议。而telnet是基于tcp协议工作的，因此答案选C。</p><p>6、OSPF协议使用哪种报文对接收到的LSU报文进行确认?（  ）</p><p>A、LSU    B、LSR  C、LSACK   D、LSA</p><p>试题答案：C</p><p>试题解析：LSU报文用来向对端Router发送其所需要的LSA或者泛洪自己更新的LSA，内容是多条LSA（全部内容）的集和。LSR报文用于请求相邻路由器链路状态数据库中的一部分数据。LSAck报文是路由器在收到对端发来的LSU报文后所发出的确认应答报文。LSA并不是报文，其描述的为ospf的拓扑和路由信息，由lsu进行承载。故选C。</p><p>7、主机使用以下哪个IPv4地址不能直接访问Internet? （  ）</p><p>A、100.1.1.1     B、50.1.1.1      C、10.1.1.1     D、200.1.1.1</p><p>试题答案：C</p><p>试题解析：10.1.1.1因为这是一个私网地址。私网地址是无法直接访问互联网的。需要做NAT转换才行。故选C。</p><p>8、在路由表中存在到达同一个目的网络的多个路由条目，这些路由称之为?（  ）</p><p>A、次优路由    B、多径路由   C、等价路由    D、默认路由</p><p>试题答案：C</p><p>试题解析：在一台路由设备上，如果有多条路由去往同一目的网络并且他们的开销COST一样我们称之为等价路由。答案A次优路由是指两条路由的COST不相同，答案B和D为干扰项。</p><p>9、以下关于直连路由说法正确的是?（  ）</p><p>A、直连路由优先级低于动态路由      B、直连路由优先级低于静态路由</p><p>C、直连路由优先级最高     D、直连路由需要管理员手工配置目的网络和下一跳地址</p><p>试题答案：C</p><p>试题解析：直连路由默认优先级为0，优先级最高，所以AB是错误的。直连路由为路由器自动生成所以D错误，故选C。</p><p>10、在华为路由器上，缺省情况下OSPF协议内部路由优先级的数值为?（  ）</p><p>A、20      B、10     C、30     D、0</p><p>试题答案：B</p><p>试题解析：缺省情况下OSPF协议内部路由优先级的数值为10。故选B。</p><p>11、OSPF协议使用哪种报文发现和维护邻居关系?（  ）</p><p>A、DD      B、LSR     C、LSU    D、HELLO</p><p>试题答案：D</p><p>试题解析：当OSPF中的两个路由器初始化连接时要交换数据库描述(DD)报文。OSPF报文的第三种类型为链路-状态请求（LSR）报文。链路-状态更新(LSU)报文用于把LSA发送给它的相邻节点。OSPF使用hello报文建立和维护相邻站点之间的邻居关系。</p><p>故选D。</p><p>12、以下关于直连路由说法正确的是?（  ）</p><p>A、直连路由需要管理员手工配置目的网络和下—跳地址</p><p>B、直连路由优先级低于静态路由</p><p>C、直连路由优先级低于动态路由</p><p>D、直连路由优先级最高</p><p>试题答案：D</p><p>试题解析：直连路由默认优先级为0。优先级最高，故选D。</p><p>13、下列关于华为设备中静态路由的说法错误的是?（  ）</p><p>A、静态路由的开销值（Cost）不可以被修改</p><p>B、静态路由优先级的缺省值为60</p><p>C、静态路由优先级值的范围为1-255</p><p>D、静态路由的优先级为0时，则该路由一定会被优选</p><p>试题答案：D</p><p>试题解析：静态路由没有开销说法故A是对的。静态路由的默认优先级是60故B是对的。路由优先级的范围是0-255，静态路由的范围是1-255故C是对的。D选项与C选项互斥。</p><p>14、如下图所示的网络，所有路由器运行OSPF协议，链路上方为Cost值的大小，则RTA到达网络10.0.0.0/8的路径为?（  ）</p><p>A、A-B-D      B、RTA无法到达10.0.0.0/8      C、A-C-D      D、A-D</p><p>试题答案：C</p><p>试题解析：Cost值的计算是沿目的地途中所有转发数据的接口的cost值的总和、越小越优。</p><p>15、下列配置默认路由的命令中正确的是？（  ）</p><p>A、[Huawei-Seria10]ip route-statiC 0.0.0.0. 0.0.0.0 0.0.0.0</p><p>B、[Huawei]ip route-statiC 0.0.0.0 0.0.0.0 192.168.1.1</p><p>C、[Huawei]ip route-statiC 0.0.0.0 0.0.0.0 0.0.0.0</p><p>D、[Huawei]ip route-statiC 0.0.0.0 255.255.255.255 192.168.1.1</p><p>试题答案：B</p><p>试题解析：根据默认路由的配置格式：ip route-stacic 0.0.0.0 0.0.0.0 下一跳IP地址（应为单播地址）。</p><p>16、主机的IPv4地址为200.200.200.201/30、拥有下列哪个IPv4地址的主机和其通信不需要经过路由器转发？（  ）</p><p>A、200.200.200.202    B、200.200.200.200</p><p>C、200.200.200.203    D、200.200.200.1</p><p>试题答案：A</p><p>试题解析：同一网段不需要路由可以通信，200.200.200.201/30 网段内只有4个主机位，200.200.200.200-200.200.200.203，去掉一个广播地址200.200.200.203，去掉一个网络地址200.200.200.200，只有200.200.200.201与200.202可用.所以本题选A。</p><p>17、OSPF协议的HELLO报文中不包含以下哪个字段？（  ）</p><p>A、Neighbor     B、Network Mask</p><p>C、HelloInterval    D、Sysname</p><p>试题答案：D</p><p>试题解析：HELLO报文包含Network Mask、HELLO Intval、options、Router priority、router dead interval、designated router、Backup designated router、active neighbor等。本题不包含Sysname，选D。</p><p>18、管理员要在路由器的G0/0/0接口上配IP地址，那么使用下面哪个地址才是正确的？（  ）</p><p>A、192.168.10.112/30     B、237.6.1.2/24</p><p>C、127.3.1.4/28   D、145.4.2.55/26</p><p>试题答案：D</p><p>试题解析：子网掩码为/30时，192.168.10.112是一个广播地址，选项A错误。237.6.1.2/24是组播地址，B错误。127.3.1.4/28属于本地回环地址，C错误。所以本题选D。</p><p>19、如果一个网络的广播地址为172.16.1.255，那么它的网络地址可能是？（  ）</p><p>A、172.16.1.128    B、172.16.2.0</p><p>C、172.16.1.1   D、172.86.1.253</p><p>试题答案：A</p><p>试题解析：广播地址为172.16.1.255，它的网络地址不可能到2.0网段，所以B错误。当子网掩码为24位时，网络地址为172.16.1.0.选项C错误。子网掩码为31位时，网络地址为172.86.1.254，子网掩码为30位时，网络地址为172.86.1.252，所以选项D错误。当子网掩码为25位时，网络地址为172.16.1.128。所以本题选A。</p><p>20、OSPF报文类型有多少种？（  ）</p><p>A、2   B、4   C、5  D、3</p><p>试题答案：C</p><p>试题解析：OSPF包含Hello、DD、LSR、LSU、LSACK五种报文。所以本题选C。</p><p>21、当以IPv4协议作为网络层协议时，网络层首部不包含哪个字段?（  ）</p><p>A、Source IPv4 Address   B、TTL</p><p>C、Destination IPv4 Address    D、Sequence Number</p><p>试题答案：D</p><p>试题解析：Sequence Number 是TCP序列号，其他都是网络层首部的内容。本题选D 。</p><p>22、某公司申请到一个C类地址段，需要平均分配给8个子公司，最大的一个子公司有14台计算机，不同的子公司必须在不同的网段中，则子网掩码应该设计为？（  ）</p><p>A、255.255.255.240    B、255.255.255.128</p><p>C、255.255.255.192   D、255.255.255.0</p><p>试题答案：A</p><p>试题解析：因为最大的一个子公司有14台主机，所以每个网段需满足至少16个主机位（要去掉一个网络地址、一个广播地址），所以本题选A 255.255.255.240。 选项B只有两个网段，选项C只有4个网段，选项D只有一个网段。</p><p>23、下列哪个属性不能作为衡量Cost的参数？（  ）</p><p>A、带宽   B、Sysname   C、时延   D、跳数</p><p>试题答案：B</p><p>试题解析：动态路由衡量cost有度量值、跳数、带宽、时延、负载等等。sysname 系统名不能作为衡量Cost的参数，本题选B。</p><p>24、缺省情况下，广播网络上ospf协议RouterDeadInterval是？（  ）</p><p>A、10s   B、40s  C、30s  D、20s</p><p>试题答案：B</p><p>试题解析：ospf的 RouterDeadInterval为四倍hello time时间，hello time 周期默认为10s，所以 RouterDeadInterval 默认为40s ，当设备40s内没有收到邻居发送的 hello报文，则认为邻居失效，因此答案选B 。</p><p>25、缺省情况下，广播网络上OSPF协议HELLO报文发送的周期为？（  ）</p><p>A、10s  B、40s  C、30s  D、20s</p><p>试题答案：A</p><p>试题解析：ospf的hello报文发送周期为10s一次，用于建立以及维护邻居关系。因此答案选A 。</p><p>26、下列哪一个IPv4地址是A类地址？（  ）</p><p>A、192.168.1.1     B、100.1.1.1      C、127.0.0.1      D、172.16.1.1</p><p>试题答案：B</p><p>试题解析：A类地址的取值范围为0.0.0.0-126.255.255.255，127.0.0.0-127.255.255.255 属于特殊地址，用于测试网卡以及TCP/IP协议栈是否正常的，B类地址的取值范围为128.0.0.0-191.255.255.255，C类地址的取值范围为192.0.0.0-223.255.255.255 ， 因此答案选B 。</p><p>27、已知某台路由器的路由表中有如图两个表项，如果该路由器要转发目的地址为9.1.4.5的报文，则下列说法中正确的是？（  ）</p><p>A、选择第二项作为最优匹配项，因为RIP协议的代价值较小</p><p>B、选择第二项作为最优匹配项，因为该路由相对于目的地为9.1.4.5来说，是更精确的匹配</p><p>C、选择第二项作为最优匹配项，因为Ethemet0的速度比serial0的速度更快</p><p>D、选择第一项作为最优匹配项，因为ospf协议的优先级值较高</p><p>试题答案：B</p><p>试题解析：从图片可以看出，目的ip为9.1.4.5的数据报可以匹配9.0.0.0/8、9.1.0.0/16两条路由条目，9.0.0.0/8是通过ospf协议学习到的，路由优先级为10 开销值为50 ，9.1.0.0/16是通过isis学习到的，路由优先级为15，开销值为100，由于路由的优先原则， 先比较路由条目的子网掩码，越长越优先，再比较路由条目的优先级和开销值，9.1.0.0/16比9.0.0.0/8掩码长度更长，相对而言更加精确，因此会选择9.1.0.0/16这条路由条目进行转发，而不会再比较优先级以及开销值，所以答案选B 。</p><p>28、下面关于IP报文头部中TTL字段的说法正确的是？（  ）</p><p>A、TTL定义了源主机可以发送数据包的时间间隔</p><p>B、TTL定义了源主机可以发送数据包的数量</p><p>C、IP报文每经过一台路由器时,其TTL值会被减1</p><p>D、IP报文每经过一台路由器时,其TTL值会1被加1</p><p>试题答案：C</p><p>试题解析：TTL值的主要作用是设置数据包可以经过的路由器数量，每经过一台路由器是，TTL值会被减1 ，当数据包的TTL数值为0时，将会被丢弃，其作用是当网络中出现环路的时候，起到破环的作用。因此答案选C 。</p><p>29、一个网段150.25.0.0的子网掩码是255.255.224.0，那么该网段中的有效的主机地址是？（  ）。</p><p>A、150.25.2.24    B、150.25.0.0     C、150.25.1.255   D、150.15.3.30</p><p>试题答案：A;C</p><p>试题解析：Ip地址为150.25.0.0 子网掩码为255.255.224.0（网络位19，主机位13位）。网络地址为：150.25.0.0。广播地址为：150.25.31.255。主机地址为：150.25.0.1-150.25.31.254。答案B为网络地址，答案D为150.15.3.30不在150.25.0.0。</p><p>30、ospf协议在网络层对应的协议号是多少？（  ）</p><p>A、89    B、6   C、0    D、1</p><p>试题答案：A</p><p>试题解析：ospf用ip报文直接封装协议报文，其协议号为89.因此答案选A。</p><p>31、OSPF协议的Hello报文中不包含以下哪个字段？（  ）</p><p>A、Network Mask   B、sysname   C、HelloInterval   D、Neighbor</p><p>试题答案：B</p><p>试题解析：ospf的hello报文中包含network mask（子网掩码）、hellointerval（hello报文间隔）、routedeadinterval（死亡时间）、neighbor（邻居列表） 。并不包含sysname ，ospf之间来代表身份的是使用设备的route id而不是sysname ，所以答案选B。</p><p>32、下列配置默认路由的命令中正确的是？（  ）</p><p>A、[huawei-serial0]ip route-statiC 0.0.0.0 0.0.0.0 0.0.0.0</p><p>B、[huawei] ip route-statiC 0.0.0.0 255 255.255 255 192. 168.1.1</p><p>C、[huawei] ip route-statiC 0.0.0.0 0.0.0.0 192.168.1.1</p><p>D、[huawei] ip route-statiC 0.0.0.0 0.0.0.0 0.0.0.0</p><p>试题答案：C</p><p>试题解析：默认路由的目标网段为0.0.0.0 0.0.0.0 ，表示一个未知网段，下一跳地址一定是一个有效的ip地址，而A D两个答案的0.0.0.0 明显不符合要求，B的目标网段写法错误，因此答案选C 。</p><p>33、192.168.1.127/25代表的是什么地址？</p><p>A、广播    B、组播     C、网络    D、主机</p><p>试题答案：A</p><p>试题解析：由题目提供信息可看出，192.168.1.127/25 此ip网段的网络位为25位，主机位为7位，此网段最小的ip地址就是将主机位的比特位全取0，127化成二进制为 0111 1111 ，主机位全取0 （0000 0000） ，那么网络地址就是192.168.1.0，当主机位全取1（0111 1111）的时候，此地址为此网段的广播地址，算出来是192.168.1.127 ，因此192.168.1.127是本网段的广播地址。答案选A。</p><p>34、ip route-static 10.0.12.0 255.255.255.0 192.168.1.1关于此命令描述正确的是？（  ）</p><p>A、此命令配置了一条到达10.0. 12.0网络的路由</p><p>B、该路由的优先级为100</p><p>C、如果路由器通过其他协议学习到和此路由相同目的网络的路由器，路由器将会优先选择此路由</p><p>D、此命令配置了一条到达192. 168.1.1网络的路由</p><p>试题答案：A</p><p>试题解析：ip route-static10.0.12.0 255.255.255.0 192.168.1.1，此命令配置了一条目标网段为10.0.12.0/24 ，下一跳为192.168.1.1的静态路由，默认优先级为60，如果通过其他协议学习到相同的目的网络的路由条目，路由器会跟据优先级进行路由的优选，优先级越小越优先。因此答案选A。</p><p>35、如下图所示的网络，当OSPF邻居状态稳定后，RouterB和RouterC的邻居状态为?（  ）</p><p>A、Attempt     B、2-way     C、Full     D、Down</p><p>试题答案：B</p><p>试题解析：路由器B和C的优先级都为0，只能成为DR-other，DR-other之间的邻居关系为two-way,故选B。</p><p>36、如下图所示，下列说法正确是？（  ）</p><p>A、主机A可以ping通主机B</p><p>B、只有把主机A和主机B的掩码设置为一致，主机A和主机B才能通信</p><p>C、主机A和主机B的广播地址相同</p><p>D、主机A和主机B的IP地址掩码不同，所以主机A和主机B不能通信</p><p>试题答案：D</p><p>试题解析：由题目可以得知，host A的ip为10.1.12.1/30 ，属于10.1.12.0/30网段,host B的ip为10.0.12.5/24，属于10.0.12.0/24网段 ，双方主机不属于一个网段，虽然host B会有10.1.12.1的路由信息，但是host B没有10.0.12.5的路由信息，因此会导致hostB能够发送报文给hostA ，但是host A无法回包，导致不能通信。因此答案选D。</p><p>37、VRP操作平台、以下哪条命令可以只查看静态路由？（  ）</p><p>A、display ip routing-table protocol static</p><p>B、display ip routing-table</p><p>C、display ip routing-table verbose</p><p>D、display ip routing-table statistics</p><p>试题答案：A</p><p>试题解析：在VRP平台中查看路由条目的命令是display ip routing-table，如果想单独查看不同的路由协议产生的路由条目，可以使用 display ip routing-table protocl (路由类型)，如查看静态路由就使用display ip routing-table protocol static。查看ospf产生的路由条目就使用 display ip routing-table protocol ospf 。因此答案选A。</p><p>38、如下图所示的网络，所有路由器运行OSPF协议，链路开销值如图，则RTA路由表中到达网络10.0.0.0/8的路由条目的cost值是多少？（  ）</p><p>A、70     B、100       C、20      D、60</p><p>试题答案：D</p><p>试题解析：通过题目拓扑可以得知，RTA分别可以从RTB、RTC、RTD学习到10.0.0.0/8 的路由条目，开销值分别是70、60、100,由于都是通过ospf学习到的路由相同网段的条目，此时会比较路由条目的开销值，越小越优先。因此答案选D。</p><p>39、某台运行了OSPF的设备，在没有指定router-id是多少的时候，会使用以下哪个接口的IP地址作为自己OSPF进程的router-id ?（  ）</p><p>A、Ethernet0/0/0 10.0.12.1</p><p>B、Ethernet0/0/1 10.0.21.1</p><p>C、Loopback0 1.1.1.1</p><p>D、Loopback1 2.2.2.2</p><p>试题答案：D</p><p>试题解析：如果OSPF 路由器未使用 OSPF router-id 命令进行配置，如果配置了环回口，则以环回口地址最大的ip作为router id，如果未配置环回口，则比较接口ip地址，越大越优先，所以选择选项&quot;D&quot;。</p><p>40、路由表不包含以下哪项参数?（  ）</p><p>A、目的地址/掩码     B、Cost开销   C、MAC地址   D、next-hop下一跳</p><p>试题答案：C</p><p>试题解析：因为路由表包含的参数只有网络地址（Network Destination）、网络掩码（Netmask）、网关（Gateway，又称为下一跳服务器）、接口（Interface）、跃点数（Metric），而MAC地址不属于路由器包含的参数。所以选择选项&quot;C&quot;。</p><p>41、接口通过数据帧的哪个信息判断进行二层转发或三层转发？（  ）</p><p>A、源IP      B、源MAC     C、目的端口     D、目的MAC</p><p>试题答案：D</p><p>试题解析：当接口收到一个数据帧的时候，如果目的mac地址为自己的mac地址，说明此数据需要交给本设备处理，则进行三层转发，如果目的mac地址不是自己的mac地址，则通过查找mac地址表进行二层转发。 所以此题答案选D 。</p><p>42、以下关于交换机的描述，说法错误的是？（  ）</p><p>A、交换机一般作为网络的出口设备</p><p>B、交换机一般工作在数据链路层</p><p>C、交换机能够完成数据帧的交换工作</p><p>D、交换机可以为终端设备（PC/服务器）提供网络接入服务</p><p>试题答案：A</p><p>试题解析：交换设备分为二层交换机和三层交换机，交换设备一般工作在数据链路层，并且能够通过mac地址完成数据帧的交换工作，二层交换一般为终端设备提供接入服务，网络出口设备通常会选择路由器实现不同网络之间的选路及转发工作。</p><p>43、STP协议中端口处于哪个工作状态时可以不经过其它状态转为Forwarding状态？（  ）</p><p>A、BIocking    B、Learning    C、Listening    D、Disabled</p><p>试题答案：B</p><p>试题解析：在Learning状态下经过一段时间的延迟，将自动进入Forwarding状态，本题选B。</p><p>44、命令port trunk allow-pass vlan all有什么作用？（  ）</p><p>A、如果为相连的远端设备配置了port default vlan3命令，则两台设备间VLAN3无法互通</p><p>B、该端口上允许所有VLAN的数据帧通过</p><p>C、相连的对端设备可以动态确定允许哪些VLAN ID .通过</p><p>D、与该端口相连的对端端口必须同时配置port trunk permit vlan all确认</p><p>试题答案：B</p><p>试题解析：port trunk allow-pass vlan all 作为vlan trunk的配置命令，可以放行所有VLAN通过，所以本题选B。</p><p>45、关于传输层协议说法正确的有（  ）。</p><p>A、UDP适合传输对时延敏感的流量，并且可以依据报文首部中的序列号字段进行重组</p><p>B、知名端口号范围为0-1023</p><p>C、UDP使用SYN和ACK标志位来请求建立连接和确认建立连接</p><p>D、TCP连接的建立是个三次握手的过程，而TCP连接的终止则要经过四次握手</p><p>试题答案：B;D</p><p>试题解析：UDP适合传输对时延敏感的流量，依据报文首部中的序列号字段进行重组的是TCP。A错误。TCP使用SYN和ACK标志位来请求建立连接和确认建立连接.C错误。本题选B、D</p><p>46、以下哪些与封装和解封装的目的有关？（  ）</p><p>A、封装和解封装是实现不同协议功能的重要步骤</p><p>B、不同网络之间的互通</p><p>C、缩短报文的长度</p><p>D、封装和解封装可以完成网络故障的定位</p><p>试题答案：A;B</p><p>试题解析：封装和解封装不能缩短报文的长度，也不能完成网络故障定位（ping命令可以实现）。所以本题选A、B</p><p>47、网络管理员使用Ping来测试网络的连通性，在这个过程中下面哪些协议可能会被使用到？（  ）</p><p>A、ICMP   B、UDP   C、TCP  D、ARP</p><p>试题答案：A;D</p><p>试题解析：ping命令是使用ICMP进行网络测试，传输过程会用到ARP。TCP和UDP是传输层协议，ping用不到。本题选A、D</p><p>48、如果以太网数据帧Length/Type=0X0806下列说法正确的是（  ）。</p><p>A、次数据帧的源MAC .地址一定不是FFFF-FFFF-FFFF</p><p>B、此数据帧为IEEE 802.3帧</p><p>C、次数据帧为Ethernet II帧</p><p>D、此数据帧的目的MAC .地址有可能是FFFF-FFFF-FFFF</p><p>试题答案：A;C</p><p>试题解析：0x0806代表ARP协议，次数据帧为Ethernet II帧，次数据帧的源MAC .地址一定不是FFFF-FFFF-FFFF。本题选A、C</p><p>49、以下应用程序中基于TCP协议的是哪一项？（  ）</p><p>A、Ping    B、TFTP   C、FTP   D、HTTP</p><p>试题答案：C;D</p><p>试题解析：FTP、HTTP属于TCP协议。TFTP属于UDP协议，ping属于icmp协议。因此答案选CD。</p><p>50、路由表中某条路由信息的Proto为OSPF，则此路由的优先级一定为10。（  ）</p><p>A、对   B、错</p><p>试题答案：B</p><p>试题解析：ospf的路由优先级可在ospf的协议视图进行修改，默认为10。本题选错。</p><p>51、如果一个网络的网络地址为192.168.1.0，那么它的广播地址一定是192.168.1.255。（  ）</p><p>A、对   B、错</p><p>试题答案：B</p><p>试题解析：如果一个网络的网络地址为192.168.1.0，只有当子网掩码为255.255.255.0的时候广播地址才为192.168.1.255.子网掩码发生变化，广播地址也会发生变化。所以本题选错 。</p><p>53、路由器所有的接口属于同一个广播域。（  ）</p><p>A、对  B、错</p><p>试题答案：B</p><p>试题解析：路由器隔离广播域，所以本题选错。</p><p>54、OSPF进程的Router ID.修改之后立即生效。（  ）</p><p>A、对   B、错</p><p>试题答案：B</p><p>试题解析：Router-ID改变之后，各协议需要通过手工执行reset命令才会重新选取新的Router-ID。本题选错。</p><p>55、如图所示的广播网绪中，OSPF运行在四台路由器上，且在同一区域，同一网段OSPF会自动选举一个DR，多个BDR，从而达到更好的备份效果。（  ）</p><p>A、对  B、错</p><p>试题答案：B</p><p>试题解析：同一区域OSPF会选举一个DR和一个BDR。本题选错。</p><p>56、路由器进行数据包转发时需要修改数据包中的目的IP地址。（  ）</p><p>A、对   B、错</p><p>试题答案：B</p><p>试题解析：路由器进行数据包转发时只修改源和目的MAC，并不对目的IP地址进行修改。本题错误。</p><p>57、运行OSPF协议的路由器所有接口必须属于同一个区域。（  ）</p><p>A、对  B、错</p><p>试题答案：B</p><p>试题解析：ospf协议是基于接口划分区域的，在同一台设备上面，不同的接口可以属于不同的区域。因此答案选错。</p><p>58、对于到达同一个目的网络的多条路径，路由器需要通过比较Prererence值的大小进行选择，如果Preference相同，则依据Cost值的大小进行选择。（  ）</p><p>A、对  B、错</p><p>试题答案：A</p><p>试题解析：对于到达同一个目的网络的多条路径，路由器会先比较路由条目的路由优先级，越小越优先，如果一样就比较路由条目的开销值，越小越优先。因此答案选对。</p><p>59、在广播网络上，DR和BDR都使用组播地址224.0.0.6来接收链路状态更新包。（  ）</p><p>A、对   B、错</p><p>试题答案：A</p><p>试题解析：在ospf的广播网络中，DR和BDR都会监听224.0.0.6这个组播地址，当DRother更新报文时，会向224.0.0.6这个组播地址发送更新报文，DR收到之后再以224.0.0.5这个组播地址同步给其他的DRother。因此答案选对。</p><p>60、运行OSPF协议的路由器先达到FULL状态,然后进行LSDB.的同步。（  ）</p><p>A、对   B、错</p><p>试题答案：B</p><p>试题解析：运行OSPF协议的路由器在完成LSDB同步，此时邻接状态建立成功，到达full 状态。答案为错。</p>]]></content>
    
    
    <summary type="html">HCIA</summary>
    
    
    
    <category term="题库" scheme="http://zxwlove.xyz/categories/%E9%A2%98%E5%BA%93/"/>
    
    
    <category term="学习" scheme="http://zxwlove.xyz/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="华为" scheme="http://zxwlove.xyz/tags/%E5%8D%8E%E4%B8%BA/"/>
    
    <category term="题库" scheme="http://zxwlove.xyz/tags/%E9%A2%98%E5%BA%93/"/>
    
  </entry>
  
  <entry>
    <title>MySQL基本介绍与安装</title>
    <link href="http://zxwlove.xyz/posts/mysql01.html"/>
    <id>http://zxwlove.xyz/posts/mysql01.html</id>
    <published>2024-11-05T08:48:00.000Z</published>
    <updated>2024-11-05T09:01:21.516Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><h1>MySQL 基本介绍</h1><p>MySQL模型：<code>层次性</code>，<code>网状型</code>，<code>关系型</code>。</p><p><font style="color:rgb(51, 51, 51);">数据库（Database）是按照数据结构来组织、存储和管理数据的仓库。</font></p><p><font style="color:rgb(51, 51, 51);">RDBMS：关系型数据库管理系统。</font></p><p><font style="color:rgb(51, 51, 51);">四大基本数据类型：</font><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;整型&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">、</font><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;浮点型&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">、</font><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;字符型&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">、</font><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;日期时间类型&lt;/font&gt;</code></p><h1><font style="color:rgb(51, 51, 51);">MySQL 安装</font></h1><p><font style="color:rgb(51, 51, 51);">MySQL 下载地址为： </font><a href="https://dev.mysql.com/downloads/mysql/">MySQL 下载</a><font style="color:rgb(51, 51, 51);"> 。 安装需要开启管理员权限。</font></p><h2 id="font-style-color-rgb-51-51-51-Linux上安装MySQL-font"><font style="color:rgb(51, 51, 51);">Linux上安装MySQL</font></h2><h2 id="windows系统上安装MySQL">windows系统上安装MySQL</h2><p><img src="https://cdn.nlark.com/yuque/0/2024/png/29368235/1730793074798-5fa7121a-f82d-4be9-a051-dde2c91a9f24.png" alt=""></p><p>下载msi installer格式的文件后直接安装（差不多一直next就像）</p><p><img src="https://cdn.nlark.com/yuque/0/2024/jpeg/29368235/1730793228185-eaa5a46a-d923-4d35-993b-e21a5b7b5d5c.jpeg" alt=""></p><p><img src="https://cdn.nlark.com/yuque/0/2024/jpeg/29368235/1730793200753-b0ddc7c5-96d7-4cab-adc8-fd6b6e0dde81.jpeg" alt=""></p><p>省略一部分大部分都是next</p><p><img src="https://cdn.nlark.com/yuque/0/2024/jpeg/29368235/1730793419346-c1180df7-6bed-44e6-8716-113c544bce71.jpeg" alt=""></p><p><img src="https://cdn.nlark.com/yuque/0/2024/jpeg/29368235/1730793448755-767f52f1-cbcc-4c2f-8fe3-36e1dc5e5c88.jpeg" alt=""></p><p>这里设置root账户密码</p><p><img src="https://cdn.nlark.com/yuque/0/2024/jpeg/29368235/1730793463297-e2b5c51a-b2f4-4625-94c4-cd00d04e03f4.jpeg" alt=""></p><p>点击Execute等待下载完成</p><p><img src="https://cdn.nlark.com/yuque/0/2024/jpeg/29368235/1730793604630-cdb78c17-2ccc-43b3-bc1b-84d96eee9549.jpeg" alt=""></p><p><img src="https://cdn.nlark.com/yuque/0/2024/jpeg/29368235/1730793640192-7fc43cb2-71ab-4d80-b2fc-51b8483484f4.jpeg" alt=""></p><p><font style="color:rgb(33, 37, 41);">输入 root 帐户的密码，然后单击</font><strong><font style="color:rgb(33, 37, 41);">“检查”</font></strong><font style="color:rgb(33, 37, 41);">。您将看到</font><em><font style="color:rgb(33, 37, 41);">连接成功</font></em><font style="color:rgb(33, 37, 41);">状态：</font></p><p><img src="https://cdn.nlark.com/yuque/0/2024/jpeg/29368235/1730793681850-8b69b5ed-2909-494c-930b-11101d15bdf2.jpeg" alt=""></p><h2 id="Mac-OS系统上安装MySQL">Mac OS系统上安装MySQL</h2><p>暂时没有使用该系统，未来补上。。。。。。</p><h1><font style="color:rgb(0, 0, 0);">MySQL 管理</font></h1><h2 id="font-style-color-rgb-51-51-51-启动及关闭-MySQL-服务器-font"><font style="color:rgb(51, 51, 51);">启动及关闭 MySQL 服务器</font></h2><p>查看版本：</p><ul class="lvl-0"><li class="lvl-2"><p>没有登陆mysql：mysql -V</p></li><li class="lvl-2"><p>登陆成功时会提示当前数据库的版本</p></li><li class="lvl-2"><p>登录到mysql之后：select version();</p></li></ul><h3 id="font-style-color-rgb-51-51-51-Windows-系统下-font"><font style="color:rgb(51, 51, 51);">Windows 系统下</font></h3><p><strong><font style="color:rgb(51, 51, 51);">启动 MySQL 服务器:</font></strong></p><ol><li class="lvl-3"><p><strong><font style="color:rgb(51, 51, 51);">通过 “服务” 管理工具： </font></strong><font style="color:rgb(51, 51, 51);">打开&quot;运行&quot;对话框（Win + R），输入 </font><code>**&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;services.msc&lt;/font&gt;**</code><font style="color:rgb(51, 51, 51);">，找到&quot;MySQL&quot;服务，右击选择&quot;启动&quot;。</font></p></li><li class="lvl-3"><p><strong><font style="color:rgb(51, 51, 51);">通过命令提示符： </font></strong><font style="color:rgb(51, 51, 51);">打开命令提示符（以管理员身份），输入以下命令：</font></p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">net start mysql</span><br></pre></td></tr></table></figure><p><strong><font style="color:rgb(51, 51, 51);">关闭MySQL服务器:</font></strong></p><ol><li class="lvl-3"><p><font style="color:rgb(51, 51, 51);"></font><strong><font style="color:rgb(51, 51, 51);">通过 “服务” 管理工具：</font></strong><font style="color:rgb(51, 51, 51);">同样打开&quot;运行&quot;对话框，输入 services.msc，找到 “MySQL” 服务，右击选择&quot;停止&quot;。</font></p></li><li class="lvl-3"><p><font style="color:rgb(51, 51, 51);"></font><strong><font style="color:rgb(51, 51, 51);">通过命令提示符：</font></strong><font style="color:rgb(51, 51, 51);"> 打开命令提示符（以管理员身份），输入以下命令：</font></p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">net stop mysql</span><br></pre></td></tr></table></figure><h3 id="font-style-color-rgb-51-51-51-Linux-系统下-font"><font style="color:rgb(51, 51, 51);">Linux 系统下</font></h3><p><strong><font style="color:rgb(51, 51, 51);">1、启动 MySQL 服务：</font></strong></p><p><font style="color:rgb(51, 51, 51);">使用 </font><code>**&lt;font style=&quot;color:rgb(51, 51, 51);background-color:rgb(236, 234, 230);&quot;&gt;systemd&lt;/font&gt;**</code><font style="color:rgb(51, 51, 51);">命令（适用于大多数现代 Linux 发行版，如 Ubuntu、CentOS 等）：</font></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl start mysql</span><br></pre></td></tr></table></figure><p><font style="color:rgb(51, 51, 51);">使用</font><code>**&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;service&lt;/font&gt;**</code><font style="color:rgb(51, 51, 51);">命令（在一些较旧的发行版中）：</font></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo service mysql start</span><br></pre></td></tr></table></figure><p><strong><font style="color:rgb(51, 51, 51);">2、关闭 MySQL 服务：</font></strong></p><p><strong><font style="color:rgb(51, 51, 51);">使用 systemd：</font></strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl stop mysql</span><br></pre></td></tr></table></figure><p><font style="color:rgb(51, 51, 51);">使用 service 命令：</font></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo service mysql stop</span><br></pre></td></tr></table></figure><p><strong><font style="color:rgb(51, 51, 51);">3、重启 MySQL 服务：</font></strong></p><p><strong><font style="color:rgb(51, 51, 51);">使用 systemd：</font></strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl restart mysql</span><br></pre></td></tr></table></figure><p><font style="color:rgb(51, 51, 51);">使用 service 命令：</font></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo service mysql restart</span><br></pre></td></tr></table></figure><p><strong><font style="color:rgb(51, 51, 51);">4、检查 MySQL 服务状态：</font></strong></p><p><font style="color:rgb(51, 51, 51);">使用 systemd命令：</font></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl status mysql</span><br></pre></td></tr></table></figure><p><font style="color:rgb(51, 51, 51);">使用 service 命令：</font></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo service mysql status</span><br></pre></td></tr></table></figure><h2 id="font-style-color-rgb-51-51-51-MySQL-用户设置-font"><font style="color:rgb(51, 51, 51);">MySQL 用户设置</font></h2><p><font style="color:rgb(51, 51, 51);">在 MySQL 中，用户设置包括创建用户、设置权限、管理用户等操作。以下是一些常用的 MySQL 用户设置操作，包括创建用户、设置权限、查看和删除用户等。</font></p><h3 id="font-style-color-rgb-51-51-51-创建用户-font"><font style="color:rgb(51, 51, 51);">创建用户</font></h3><p>sql命令：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CREATE USER &#x27;username&#x27;@&#x27;host&#x27; IDENTIFIED BY &#x27;password&#x27;;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;username&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">：用户名。</font></p></li><li class="lvl-2"><p><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;host&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">：指定用户可以从哪些主机连接。例如，</font><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;localhost&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);"> </font><font style="color:rgb(51, 51, 51);">仅允许本地连接，</font><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;%&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);"> </font><font style="color:rgb(51, 51, 51);">允许从任何主机连接。</font></p></li><li class="lvl-2"><p><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;password&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">：用户的密码。</font></p></li></ul><h3 id="font-style-color-rgb-51-51-51-授权权限-font"><font style="color:rgb(51, 51, 51);">授权权限</font></h3><p><font style="color:rgb(51, 51, 51);">创建用户后，你需要授予他们访问权限，使用</font><font style="color:rgb(51, 51, 51);"> </font><strong><font style="color:rgb(51, 51, 51);background-color:rgb(236, 234, 230);">GRANT</font></strong><font style="color:rgb(51, 51, 51);"> </font><font style="color:rgb(51, 51, 51);">命令来授予权限：</font></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">GRANT privileges ON database<span class="emphasis">_name.* TO &#x27;username&#x27;@&#x27;host&#x27;;</span></span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;privileges&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">：所需的权限，如 </font><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;ALL PRIVILEGES&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">、</font><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;SELECT&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">、</font><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;INSERT&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">、</font><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;UPDATE&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">、</font><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;DELETE&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);"> 等。</font></p></li><li class="lvl-2"><p><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;database_name.*&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">：表示对某个数据库或表授予权限。</font><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;database_name.*&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);"> </font><font style="color:rgb(51, 51, 51);">表示对整个数据库的所有表授予权限，</font><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;database_name.table_name&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);"> </font><font style="color:rgb(51, 51, 51);">表示对指定的表授予权限。</font></p></li><li class="lvl-2"><p><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;TO 'username'@'host'&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">：指定授予权限的用户和主机。</font></p></li></ul><h3 id="font-style-color-rgb-51-51-51-刷新权限-font"><font style="color:rgb(51, 51, 51);">刷新权限</font></h3><p><font style="color:rgb(51, 51, 51);">授予或撤销权限后，需要刷新权限使更改生效：</font></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">FLUSH PRIVILEGES;</span><br></pre></td></tr></table></figure><h3 id="font-style-color-rgb-51-51-51-查看用户权限-font"><font style="color:rgb(51, 51, 51);">查看用户权限</font></h3><p><font style="color:rgb(51, 51, 51);">要查看特定用户的权限，可以使用以下命令：</font></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SHOW GRANTS FOR &#x27;username&#x27;@&#x27;host&#x27;;</span><br></pre></td></tr></table></figure><h3 id="font-style-color-rgb-51-51-51-删除用户-font"><font style="color:rgb(51, 51, 51);">删除用户</font></h3><p><font style="color:rgb(51, 51, 51);">如果需要删除用户，可以使用以下命令：</font></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">DROP USER &#x27;username&#x27;@&#x27;host&#x27;;</span><br></pre></td></tr></table></figure><h3 id="font-style-color-rgb-51-51-51-修改用户密码-font"><font style="color:rgb(51, 51, 51);">修改用户密码</font></h3><p><font style="color:rgb(51, 51, 51);">要修改用户的密码，可以使用 ALTER USER 命令：</font></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ALTER USER &#x27;username&#x27;@&#x27;host&#x27; IDENTIFIED BY &#x27;new<span class="emphasis">_password&#x27;;</span></span><br></pre></td></tr></table></figure><h2 id="font-style-color-rgb-51-51-51-管理MySQL的命令-font"><font style="color:rgb(51, 51, 51);">管理MySQL的命令</font></h2><p><strong><font style="color:rgb(51, 51, 51);">SHOW DATABASES:</font></strong><br><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;show databases;&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">列出 MySQL 数据库管理系统的数据库列表。</font></p><p><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;select database();&lt;/font&gt;</code>查看当前所在的数据库。</p><p><strong><font style="color:rgb(51, 51, 51);">USE </font></strong><em><strong><font style="color:rgb(51, 51, 51);">数据库名</font></strong></em><font style="color:rgb(51, 51, 51);"> :<br></font><font style="color:rgb(51, 51, 51);">选择或者切换操作的Mysql数据库，使用该命令后所有Mysql命令都只针对该数据库。</font></p><p><strong><font style="color:rgb(51, 51, 51);">SHOW TABLES:</font></strong><font style="color:rgb(51, 51, 51);"><br></font><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;show table;&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">显示指定数据库的所有表，使用该命令前需要使用 use 命令来选择要操作的数据库。</font></p><p><strong><font style="color:rgb(51, 51, 51);">日期和时间查询:</font></strong></p><p><font style="color:rgb(51, 51, 51);">查看当前系统日期时间： </font><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;select now();&lt;/font&gt;</code></p><p><font style="color:rgb(51, 51, 51);">查看当前系统日期：</font><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;select curdate();&lt;/font&gt;</code></p><p><font style="color:rgb(51, 51, 51);">查看当前系统时间：</font><code>&lt;font style=&quot;color:rgb(51, 51, 51);&quot;&gt;select curtime();&lt;/font&gt;</code></p><p><font style="color:rgb(51, 51, 51);"></font></p><p><font style="color:rgb(51, 51, 51);">查看表结构：desc 表名；</font></p>]]></content>
    
    
    <summary type="html">MySQL</summary>
    
    
    
    <category term="学习" scheme="http://zxwlove.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="笔记" scheme="http://zxwlove.xyz/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="MySQL" scheme="http://zxwlove.xyz/tags/MySQL/"/>
    
  </entry>
  
  <entry>
    <title>DML数据操作</title>
    <link href="http://zxwlove.xyz/posts/hive05.html"/>
    <id>http://zxwlove.xyz/posts/hive05.html</id>
    <published>2024-11-01T05:26:00.000Z</published>
    <updated>2024-11-01T05:34:02.141Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><blockquote><p>由于最近个人原因断更了2个月</p></blockquote><h2 id="数据导入">数据导入</h2><h3 id="向表中装载数据（Load）">向表中装载数据（Load）</h3><ol><li class="lvl-3"><p>基本语法</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; load data [local] inpath &#x27;数据的 path&#x27; [overwrite] into table table<span class="emphasis">_name [partition </span></span><br><span class="line"><span class="emphasis">(partcol1=val1,…)];</span></span><br></pre></td></tr></table></figure><table><thead><tr><th>Load data</th><th>加载数据</th></tr></thead><tbody><tr><td>Local</td><td>表示从本地加载数据到hive表，否则是从HDFS加载数据到Hive表</td></tr><tr><td>Inpath</td><td>表是加载数据的路径</td></tr><tr><td>Overwrite</td><td>表示覆盖表中已有数据，否则表示追加</td></tr><tr><td>Into table</td><td>表示加载数据到哪张表中</td></tr><tr><td>Partition</td><td>表示加载数据到指定分区</td></tr></tbody></table><ol start="2"><li class="lvl-3"><p>实操案例</p></li><li class="lvl-3"><p>创建一张表student</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">hive (default)&gt; create table student( </span><br><span class="line">id string,  </span><br><span class="line">name string </span><br><span class="line">) </span><br><span class="line">row format delimited fields terminated by &#x27;\t&#x27;;</span><br></pre></td></tr></table></figure><pre><code>1. 加载本地文件到hive</code></pre><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; load data local inpath &#x27;/opt/module/hive/datas/student.txt&#x27; into table </span><br><span class="line">default.student;</span><br></pre></td></tr></table></figure><pre><code>2. 加载HDFS文件到hive中    1. 上传文件到HDFS</code></pre><p><code> hive (default)&gt; dfs -put /opt/module/hive/datas/student.txt /input;</code></p><pre><code>    2. 加载HDFS上数据</code></pre><p><code> hive (default)&gt; load data inpath '/input/student.txt' into table default.student;</code></p><pre><code>3. 加载数据覆盖表中已有的数据</code></pre><p>加载数据覆盖表中已有的数据</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; load data inpath &#x27;/input/student.txt&#x27; overwrite into table default.student; </span><br><span class="line">FAILED: SemanticException Line 1:17 Invalid path &#x27;&#x27;/input/student.txt&#x27;&#x27;: No files matching path </span><br><span class="line">hdfs://hadoop102:8020/input/student.txt</span><br></pre></td></tr></table></figure><p><font style="color:#DF2A3F;">竟然报错了，信息显示文件不存在？显然，加载HDFS上的文件到hive表中，采用的类似剪切的方式，将文件拷贝到表的映射目录下。</font></p><p><font style="color:#DF2A3F;"></font>上传文件到HDFS</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; dfs -put /opt/module/hive/datas/student.txt /input;</span><br></pre></td></tr></table></figure><p>加载HDFS上数据</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; load data inpath &#x27;/input/student.txt&#x27; overwrite into table default.student;</span><br></pre></td></tr></table></figure><p>查看表中数据是否被覆盖。</p><h3 id="向表中插入数据（Insert）">向表中插入数据（Insert）</h3><ol><li class="lvl-3"><p>创建一张表</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; create table student2(id int, name string) row format delimited fields </span><br><span class="line">terminated by &#x27;\t&#x27;;</span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>基本插入数据</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; insert into table  student2 values(1,&#x27;wangwu&#x27;),(2,&#x27;zhaoliu&#x27;);</span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>将查询结果插入表中</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; insert overwrite table student2 select id, name from student ;</span><br></pre></td></tr></table></figure><table><thead><tr><th>Insert into：</th><th>以追加数据的方式插入到表或分区，原有数据不会删除</th></tr></thead><tbody><tr><td>Insert overwrite：</td><td>会覆盖表中已存在的数据</td></tr></tbody></table><p><font style="color:#DF2A3F;">注意：insert不支持插入部分字段。</font></p><h3 id="查询语句中创建表并加载数据（As-Select）">查询语句中创建表并加载数据（As Select）</h3><p>根据查询结果创建表（查询的结果会添加到新创建的表中）</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; create table if not exists student4 </span><br><span class="line">as select id, name from student; </span><br></pre></td></tr></table></figure><h3 id="创建表时通过Location指定加载数据路径">创建表时通过Location指定加载数据路径</h3><ol><li class="lvl-3"><p>上传数据到hdfs上</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; dfs -mkdir /input/student; </span><br><span class="line">hive (default)&gt; dfs -put /opt/module/hive/datas/student.txt /input/student/student.txt;</span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>创建表，并指定在hdfs上的位置</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">hive (default)&gt; create external table if not exists student5( </span><br><span class="line"><span class="code">              id int, </span></span><br><span class="line"><span class="code">              name string </span></span><br><span class="line"><span class="code">) </span></span><br><span class="line"><span class="code">row format delimited fields terminated by &#x27;\t&#x27; </span></span><br><span class="line"><span class="code">location &#x27;/input/student&#x27;;</span></span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>查询数据</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">hive (default)&gt; select * from student5; </span><br><span class="line">OK </span><br><span class="line">student5.id     student5.name </span><br><span class="line">1001    ss1 </span><br><span class="line">1002    ss2 </span><br><span class="line">…… </span><br></pre></td></tr></table></figure><p><font style="color:#DF2A3F;">注意：hive创建表时，默认时将表的名字作为默认HDFS上表对应的存储路径的名字，但是，如果你通过 localtion指定存储路径，就不会修改路径名字为表名了。如上边的表名为student5和其在HDFS上的存储 路径student。</font></p><h2 id="数据导出">数据导出</h2><h3 id="Insert导出">Insert导出</h3><ol><li class="lvl-3"><p>将查询的结果导出到本地</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; insert overwrite local directory &#x27;/opt/module/hive/datas/export/student&#x27; </span><br><span class="line">select * from student;</span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>将查询的结果<code>格式化</code>导出到本地</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; insert overwrite local directory &#x27;/opt/module/hive/datas/export/student&#x27; </span><br><span class="line">ROW FORMAT DELIMITED FIELDS TERMINATED BY &#x27;\t&#x27;             select * from </span><br><span class="line">bigdata1.student;</span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>将查询的结果导出到HDFS上(<code>没有local</code>)</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; insert overwrite directory &#x27;/output/student&#x27; </span><br><span class="line">ROW FORMAT DELIMITED FIELDS TERMINATED BY &#x27;\t&#x27;  </span><br><span class="line">select * from student;</span><br></pre></td></tr></table></figure><p><font style="color:#DF2A3F;">注意：insert 导出时，hive 会自动创建导出目录，但是由于是 overwrite，所以导出路径一定要写准确，否 则存在误删数据的可能。</font></p><h2 id="数据迁移">数据迁移</h2><p>export 和import 命令主要用于两个Hadoop平台集群之间Hive表迁移。<code>（元数据源+真实数据）</code></p><h3 id="Export-导出到HDFS-上">Export 导出到HDFS 上</h3><p><code>hive(default)&gt; export table default.student2 to '/地址'; 导出到哪里</code></p><h3 id="Import-数据到指定Hive-表中">Import 数据到指定Hive 表中</h3><p>注意：先用export导出后，再将数据导入。</p><p><code>hive (default)&gt; import table student2 from '/地址 '; 从哪里导入</code></p>]]></content>
    
    
    <summary type="html">hive基本概念</summary>
    
    
    
    <category term="学习" scheme="http://zxwlove.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="笔记" scheme="http://zxwlove.xyz/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="Hive" scheme="http://zxwlove.xyz/tags/Hive/"/>
    
    <category term="学习" scheme="http://zxwlove.xyz/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>DDL数据定义</title>
    <link href="http://zxwlove.xyz/posts/hive04.html"/>
    <id>http://zxwlove.xyz/posts/hive04.html</id>
    <published>2024-08-22T05:29:34.000Z</published>
    <updated>2024-08-22T05:30:12.449Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><blockquote><p>先一下唠嗑：最近更新的话会比较慢<s>一个月一次</s>，也是比较忙的。月底有可能会写一个小总结及提一下未来的小目标。博客我也是会偶尔看一下的！<br>~~言归正传以免忘记，~~以下的数据库都是test，用的是虚拟机直接复制的代码有可能会看起来有点别扭，有啥补充的，可以指点指点！</p></blockquote><h2 id="创建数据库">创建数据库</h2><p>创建数据库语法：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">CREATE DATABASE [IF NOT EXISTS] database<span class="emphasis">_name </span></span><br><span class="line"><span class="emphasis">[COMMENT database_</span>comment] </span><br><span class="line">[LOCATION hdfs<span class="emphasis">_path] </span></span><br><span class="line"><span class="emphasis">[WITH DBPROPERTIES (property_</span>name=property<span class="emphasis">_value, ...)]; </span></span><br></pre></td></tr></table></figure><ol><li class="lvl-3"><p>创建一个数据库，数据库在HDFS上的默认存储路径是<code>/user/hive/warehouse/*.db</code>。</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; create database test;</span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>避免要创建的数据库已经存在错误，增加<code>if not exists</code>判断。（标准写法）</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; create database test; </span><br><span class="line">FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Database </span><br><span class="line">db<span class="emphasis">_hive already exists </span></span><br><span class="line"><span class="emphasis">hive (default)&gt; create database if not exists test; </span></span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>创建一个数据库，指定数据库在HDFS上存放的位置</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; create database test2 location &#x27;/test2.db&#x27;;</span><br></pre></td></tr></table></figure><h2 id="查询数据库">查询数据库</h2><h4 id="显示数据库">显示数据库</h4><ul class="lvl-0"><li class="lvl-2"><p>显示数据库</p></li></ul><p>hive(default)&gt; <code>show databases</code>;</p><ul class="lvl-0"><li class="lvl-2"><p>过滤显示查询到数据库</p></li></ul><p>hive(default)&gt; <code>show databases like 'test*'</code>;</p><h4 id="查看数据库详情">查看数据库详情</h4><ul class="lvl-0"><li class="lvl-2"><p>显示数据库信息</p></li></ul><p>hive(default)&gt; <code>desc database test</code>;</p><ul class="lvl-0"><li class="lvl-2"><p>显示数据库详细信息</p></li></ul><p>hive(default)&gt; <code>desc database extended test</code>;</p><ul class="lvl-0"><li class="lvl-2"><p>创建数据库test3，并设置其createtime属性</p></li></ul><p>hive(default)&gt; <code>create database test3 with dbproperties('createtime'='20240819')</code>;</p><h4 id="切换当前数据库">切换当前数据库</h4><p>hive (default)&gt; <code>use test</code>;</p><h2 id="修改数据库">修改数据库</h2><p>用户可以使用 <code>ALTER DATABASE</code> 命令为某个数据库的 <code>DBPROPERTIES</code> 设置键-值对属性值，来描述这个数据库的属 性信息。数据库其他的元数据信息都是不可以修改的，包括数据库名和数据库所在的目录位置。<br>hive (default)&gt; <code>alter database test set dbproperties('createtime'='20211022')</code>;</p><h2 id="删除数据库">删除数据库</h2><ul class="lvl-0"><li class="lvl-2"><p>删除空数据库</p></li></ul><p>hive(default)&gt;<code>drop database</code> test2;</p><ul class="lvl-0"><li class="lvl-2"><p>如果删除的数据库不存在，最好采用 if exists判断数据库是否存在</p></li></ul><p>hive(default)&gt; <code>drop database if exists</code> test2;</p><ul class="lvl-0"><li class="lvl-2"><p>如果数据库不为空，可以采用<code>cascade</code>命令，强制删除</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; drop database test; (以下是报错！！！)</span><br><span class="line">FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. </span><br><span class="line">InvalidOperationException(message:Database test is not empty. One or more tables exist.) </span><br><span class="line">hive(default)&gt; drop database test cascade; </span><br></pre></td></tr></table></figure><h2 id="创建表">创建表</h2><ol><li class="lvl-3"><p>语法 create table …</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table<span class="emphasis">_name  </span></span><br><span class="line"><span class="emphasis">[(col_</span>name data<span class="emphasis">_type [COMMENT col_</span>comment], ...)]  </span><br><span class="line">[COMMENT table<span class="emphasis">_comment]  </span></span><br><span class="line"><span class="emphasis">[PARTITIONED BY (col_</span>name data<span class="emphasis">_type [COMMENT col_</span>comment], ...)]  </span><br><span class="line">[CLUSTERED BY (col<span class="emphasis">_name, col_</span>name, ...)  </span><br><span class="line">[SORTED BY (col<span class="emphasis">_name [ASC|DESC], ...)] INTO num_</span>buckets BUCKETS]  </span><br><span class="line">[ROW FORMAT row<span class="emphasis">_format]  </span></span><br><span class="line"><span class="emphasis">[STORED AS file_</span>format]  </span><br><span class="line">[LOCATION hdfs<span class="emphasis">_path] </span></span><br><span class="line"><span class="emphasis">[TBLPROPERTIES (property_</span>name=property<span class="emphasis">_value, ...)] </span></span><br><span class="line"><span class="emphasis">[AS select_</span>statement] </span><br><span class="line">[LIKES existing<span class="emphasis">_table_</span>or<span class="emphasis">_view_</span>name] </span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>字段解释说明</p></li></ol><table><thead><tr><th>CREATE TABLE</th><th>创建一个指定名字的表。如果相同名字的表已经存在，则抛出异常；用户可以用 IF NOT EXISTS 选项来忽略这个异常</th></tr></thead><tbody><tr><td>EXTERNAL</td><td>1. 关键字可以让用户创建一个外部表 在建表的同时可以指定一个指向实际数据的路径（LOCATION）2. 在删除表的时候 内部表的元数据和数据会被一起删除， 外部表只删除元数据，不删除数据。</td></tr><tr><td>COMMENT</td><td>为表和列添加注释。</td></tr><tr><td>PARTITIONED BY</td><td>创建分区表</td></tr><tr><td>CLUSTERED BY</td><td>创建分桶表</td></tr><tr><td>SORTED BY</td><td>不常用，对桶中的一个或多个列另外排序</td></tr><tr><td>ROW FROMAT</td><td>- ROW FORMAT DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char] [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, … )]- Fields 指定字段之间的分隔符 Collection 用于指定集合中元素间的分隔符 Map 用于指定map集合中键值对间的分隔符 Lines 用于指定每行记录间的分隔符 SerDe是Serialize/Deserialize的简称 用户在建表时可以自定义SerDe或使用自带的 SerDe 若未指定Row Format，则用自带的SerDe</td></tr><tr><td>STORE AS</td><td>指定存储文件类型 常用的文件存储类型： SEQUENCEFILE（二进制序列文件）、TEXTFILE（文本）、RCFILE（列式存储格式文件） 如：store as textfile、store as sequencefile</td></tr><tr><td>LOCATION</td><td>指定表在HDFS上的存储位置</td></tr><tr><td>AS</td><td>后跟查询语句，根据查询语句结果创建表</td></tr><tr><td>LIKE</td><td>允许用户复制现有的表结构，但是不复制数据</td></tr></tbody></table><h2 id="管理表">管理表</h2><h3 id="内部表">内部表</h3><h4 id="理论">理论</h4><ol><li class="lvl-3"><p>默认创建的表都是所谓的<code>管理表</code>，有时也被称为<code>内部表</code>。</p></li><li class="lvl-3"><p>管理表，Hive会控制着<code>元数据</code>和<code>真实数据</code>的生命周期。</p></li><li class="lvl-3"><p>Hive默认会将这些表的数据存储在<code>hive.metastore.warehouse.dir</code>定义目录的子目录下。</p></li><li class="lvl-3"><p>当我们删除一个管理表时，Hive也会删除这个表中数据。</p></li><li class="lvl-3"><p>管理表<code>不适合和其他工具共享数据</code>。</p></li></ol><h4 id="案例实操">案例实操</h4><ol><li class="lvl-3"><p>创建数据文件，在/opt/module/hive/datas目录下创建文件student.txt，编辑如下内容：</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">[root@hadoop datas]$ vim student.txt </span><br><span class="line">1001 ss1 </span><br><span class="line">1002 ss2 </span><br><span class="line">1003 ss3 </span><br><span class="line">1004 ss4 </span><br><span class="line">1005 ss5 </span><br><span class="line">1006 ss6 </span><br><span class="line">1007 ss7 </span><br><span class="line">1008 ss8 </span><br><span class="line">1009 ss9 </span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>在hive中创建内部表student</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">create table if not exists student( </span><br><span class="line">id int, </span><br><span class="line">name string </span><br><span class="line">) </span><br><span class="line">row format delimited </span><br><span class="line">fields terminated by &#x27;\t&#x27; </span><br><span class="line">stored as textfile </span><br><span class="line">location &#x27;/user/hive/warehouse/student&#x27;;</span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>查询表的类型</p></li></ol><p>hive (default)&gt; <code>desc formatted student;</code></p><ol start="4"><li class="lvl-3"><p>根据查询结果创建表（查询的结果会添加到新创建的表中）</p></li></ol><p>hive(default)&gt; <code>create table if not exists student2 as select id, name from student;</code></p><ol start="5"><li class="lvl-3"><p>根据已经存在的表结构创建表</p></li></ol><p>hive(default)&gt; <code>create table if not exists student3 like student;</code></p><ol start="6"><li class="lvl-3"><p>查询表的类型</p></li></ol><p>hive (default)&gt; <code>desc formatted student2;</code></p><ol start="7"><li class="lvl-3"><p>删除表student2后，观察表的元数据和数据文件是否还存在</p></li></ol><p>hive(default)&gt; <code>drop table student2;</code></p><h3 id="外部表">外部表</h3><h4 id="理论-2">理论</h4><p>因为表是外部表，所以Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据，不过描述表的元数据信息会被删除掉。使用场景：每天将收集到的网站日志定期流入HDFS文本文件。在<code>外部表（原始日志表）</code>的基础上做大量的统计分析，用到的中间表、结果表使用<code>内部表</code>存储，数据通过 SELECT+INSERT进入内部表。外部表多用于存储原始数据，为多个部门、小组所使用，采用外部表共易<code>共享数据</code>。</p><h4 id="案例实操-2">案例实操</h4><ol><li class="lvl-3"><p>在/opt/module/hive/datas路径上，创建teacher.txt文件，并输入如下内容。</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">1001 teacher1 </span><br><span class="line">1002 teacher2 </span><br><span class="line">1003 teacher3 </span><br><span class="line">1004 teacher4 </span><br><span class="line">1005 teacher5</span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>上传数据到HDFS</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@hadoop datas]$ hadoop fs -mkdir -p /school/teacher </span><br><span class="line">[root@hadoop datas]$ hadoop fs -put teacher.txt /school/teacher </span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>在hive中创建外部表teacher</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; </span><br><span class="line">create external table if not exists teacher( </span><br><span class="line"><span class="code">    id int,  </span></span><br><span class="line"><span class="code">    name string </span></span><br><span class="line"><span class="code">) </span></span><br><span class="line"><span class="code">row format delimited fields terminated by &#x27;\t&#x27; </span></span><br><span class="line"><span class="code">location &#x27;/school/teacher&#x27;;</span></span><br></pre></td></tr></table></figure><ol start="4"><li class="lvl-3"><p>查看创建的表</p></li></ol><p>hive (default)&gt; <code>show tables;</code></p><ol start="5"><li class="lvl-3"><p>查看表格式化信息</p></li></ol><p>hive (default)&gt; <code>desc formatted dept;</code></p><ol start="6"><li class="lvl-3"><p>删除外部表，观察表的元数据和相应hdfs中的数据</p></li></ol><p>hive (default)&gt; <code>drop table dept;</code></p><h3 id="管理表与外部表的互相转换">管理表与外部表的互相转换</h3><ol><li class="lvl-3"><p>查询表的类型</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; desc formatted student2; </span><br><span class="line">Table Type:             MANAGED<span class="emphasis">_TABLE</span></span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>修改内部表student2为外部表</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">alter table student2 set tblproperties(&#x27;EXTERNAL&#x27;=&#x27;TRUE&#x27;);</span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>查询表的类型</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; desc formatted student2; </span><br><span class="line">Table Type:             EXTERNAL<span class="emphasis">_TABLE</span></span><br></pre></td></tr></table></figure><ol start="4"><li class="lvl-3"><p>修改外部表student2为内部表</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">alter table student2 set tblproperties(&#x27;EXTERNAL&#x27;=&#x27;FALSE&#x27;);</span><br></pre></td></tr></table></figure><ol start="5"><li class="lvl-3"><p>查询表的类型</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; desc formatted student2; </span><br><span class="line">Table Type:             MANAGED<span class="emphasis">_TABLE</span></span><br></pre></td></tr></table></figure><h2 id="修改表">修改表</h2><h3 id="重命名表">重命名表</h3><p>语法</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ALTER TABLE table<span class="emphasis">_name RENAME TO new_</span>table<span class="emphasis">_name</span></span><br></pre></td></tr></table></figure><p>实操案例</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; alter table student3 rename to student4;</span><br></pre></td></tr></table></figure><h3 id="增加、修改和删除表分区">增加、修改和删除表分区</h3><p>之后的<a href="https://zxwlove.xyz/posts/hive07.html">分区表基本操作</a>详情</p><h3 id="增加-修改-替换列信息">增加/修改/替换列信息</h3><h4 id="语法">语法</h4><p>更新列</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ALTER TABLE table<span class="emphasis">_name CHANGE [COLUMN] col_</span>old<span class="emphasis">_name col_</span>new<span class="emphasis">_name column_</span>type [COMMENT col<span class="emphasis">_comment] [FIRST|AFTER column_</span>name]</span><br></pre></td></tr></table></figure><p>增加和替换列</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ALTER TABLE table<span class="emphasis">_name ADD|REPLACE COLUMNS (col_</span>name data<span class="emphasis">_type [COMMENT col_</span>comment], ...)</span><br></pre></td></tr></table></figure><p>注：ADD是代表新增一字段，字段位置在所有列<code>后面</code>(partition列前)，<code>REPLACE则是表示替换表中所有字段</code>。 REPLACE使用的时候，字段的类型要跟之前的类型对应上，数量可以减少或者增加，其中就包含了更新列、增加 列、删除列的功能。</p><h4 id="实操案例">实操案例</h4><ol><li class="lvl-3"><p>查询表结构</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; desc test2; </span><br><span class="line">OK </span><br><span class="line">col<span class="emphasis">_name        data_</span>type       comment </span><br><span class="line">id                      int </span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>更新列：将列名id修改为student_id，类型不变。</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; alter table test2 change column id student<span class="emphasis">_id int; </span></span><br><span class="line"><span class="emphasis">OK </span></span><br><span class="line"><span class="emphasis">Time taken: 0.083 seconds </span></span><br><span class="line"><span class="emphasis">hive(default)&gt; desc test2; </span></span><br><span class="line"><span class="emphasis">OK </span></span><br><span class="line"><span class="emphasis">col_</span>name        data<span class="emphasis">_type       comment </span></span><br><span class="line"><span class="emphasis">student_</span>id              int</span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>更新列：不修改列名，仅修改列的类型为string。</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; alter table test2 change column student<span class="emphasis">_id student_</span>id string; </span><br><span class="line">OK </span><br><span class="line">Time taken: 0.083 seconds </span><br><span class="line">hive(default)&gt; desc test2; </span><br><span class="line">OK </span><br><span class="line">col<span class="emphasis">_name        data_</span>type       comment </span><br><span class="line">student<span class="emphasis">_id</span></span><br></pre></td></tr></table></figure><ol start="4"><li class="lvl-3"><p>新增列：向test2表中新增一列，列名为name，类型为string。</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">hive (default)&gt; alter table test2 add columns(name string);</span><br><span class="line">hive(default)&gt; desc test2; </span><br><span class="line">OK </span><br><span class="line">col<span class="emphasis">_name        data_</span>type       comment </span><br><span class="line">student<span class="emphasis">_id              string                                       </span></span><br><span class="line"><span class="emphasis">name                    string</span></span><br></pre></td></tr></table></figure><ol start="5"><li class="lvl-3"><p>调整列的位置:现在想让name的列在最前面，做如下操作：</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">hive(default)&gt; alter table test2 change name name string first; </span><br><span class="line">OK </span><br><span class="line">Time taken: 0.139 seconds </span><br><span class="line">hive (default)&gt; desc test2; </span><br><span class="line">OK </span><br><span class="line">col<span class="emphasis">_name        data_</span>type       comment </span><br><span class="line">name                    string                                       </span><br><span class="line">student<span class="emphasis">_id              string                                       </span></span><br><span class="line"><span class="emphasis">Time taken: 0.036 seconds, Fetched: 2 row(s)</span></span><br></pre></td></tr></table></figure><ol start="6"><li class="lvl-3"><p>调整列的位置:将name更新到指定列的后面，操作如下:</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; alter table test2 change name name string after student<span class="emphasis">_id; </span></span><br><span class="line"><span class="emphasis">OK </span></span><br><span class="line"><span class="emphasis">Time taken: 0.069 seconds </span></span><br><span class="line"><span class="emphasis">hive (default)&gt; desc test2; </span></span><br><span class="line"><span class="emphasis">OK </span></span><br><span class="line"><span class="emphasis">col_</span>name        data<span class="emphasis">_type       comment </span></span><br><span class="line"><span class="emphasis">student_</span>id              string                                       </span><br><span class="line">name                    string                                       </span><br><span class="line">Time taken: 0.033 seconds, Fetched: 2 row(s)</span><br></pre></td></tr></table></figure><ol start="7"><li class="lvl-3"><p>替换列（替换所有的列）</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">hive (default)&gt; alter table test2 replace columns(id double); </span><br><span class="line">OK </span><br><span class="line">Time taken: 0.058 seconds </span><br><span class="line">hive (default)&gt; desc test2; </span><br><span class="line">OK </span><br><span class="line">col<span class="emphasis">_name        data_</span>type       comment </span><br><span class="line">id                      double                                       </span><br><span class="line">Time taken: 0.032 seconds, Fetched: 1 row(s)</span><br></pre></td></tr></table></figure><h2 id="删除表">删除表</h2><p>删除表的操作相对简单<br>hive (default)&gt; <code>drop table</code> test2;</p><h2 id="清除表中数据（Truncate）">清除表中数据（Truncate）</h2><p><code>注意</code>：Truncate只能删除<code>管理表</code>，不能删除<code>外部表</code>中数据<br>hive (default)&gt; <code>truncate table</code> student;</p>]]></content>
    
    
    <summary type="html">hive基本概念</summary>
    
    
    
    <category term="学习" scheme="http://zxwlove.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="笔记" scheme="http://zxwlove.xyz/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="Hive" scheme="http://zxwlove.xyz/tags/Hive/"/>
    
    <category term="学习" scheme="http://zxwlove.xyz/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>Hive数据类型</title>
    <link href="http://zxwlove.xyz/posts/hive03.html"/>
    <id>http://zxwlove.xyz/posts/hive03.html</id>
    <published>2024-08-17T13:53:03.000Z</published>
    <updated>2024-12-05T01:25:58.999Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><h2 id="基本数据类型">基本数据类型</h2><table><thead><tr><th>Hive数据类型</th><th>Java数据类型</th><th>长度</th><th>例子</th></tr></thead><tbody><tr><td>TINYINT</td><td>byte</td><td>1byte有符号整数</td><td>20</td></tr><tr><td>SMALINT</td><td>short</td><td>2byte有符号整数</td><td>20</td></tr><tr><td><code>INt</code></td><td>int</td><td>4byte有符号整数</td><td>20</td></tr><tr><td><code>BIGINT</code></td><td>long</td><td>8byte有符号整数</td><td>20</td></tr><tr><td>BOOLEAN</td><td>boolean</td><td>布尔类型，true或者false</td><td>TRUE FALSE</td></tr><tr><td>FLOAT</td><td>float</td><td>单精度浮点数</td><td>3.14159</td></tr><tr><td><code>DOUBLE</code></td><td>double</td><td>双精度浮点数</td><td>3.14159</td></tr><tr><td><code>STRING</code></td><td>string</td><td>字符系列。可以指定字符集。可以使用单引号或者双引号</td><td>‘now is the time’ “for all good men“</td></tr></tbody></table><p>对于Hive的String类型相当于数据库的varchar类型，该类型是一个可变的字符串，不过它不能声明其中 最多能存储多少个字符，理论上它可以存储2GB的字符数.</p><h2 id="集合数据类型">集合数据类型</h2><table><thead><tr><th>数据类型</th><th>描述</th><th>语法示例</th></tr></thead><tbody><tr><td>STRUCT</td><td>和c语言中的struct类似，都可以通过“点”符号访问元素内容。例如：如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过字段.first来引用。</td><td>struct() 例如： struct&lt; street:string, city:string  &gt;</td></tr><tr><td>MAP</td><td>MAP是一组键-值对元组集合，使用数组表示法可以访问数据。例如：如果某个列的数据类型是MAP，其中键-&gt;值对是’first’-&gt;’John’和’last’-&gt;’ Doe’，那么可以通过字段名[‘last’]获取最后一个元素</td><td>map() 例如： map&lt; string, int  &gt;</td></tr><tr><td>ARRAY</td><td>数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素，每个数组元素都有一个编号，编号从零开始。例如： 数组值为[‘John’, ‘Doe’]，那么第2个元素可以通过数组名[1]进行引用。</td><td>Array() 例如：array&lt; string  &gt;</td></tr></tbody></table><p>Hive有三种复杂数据类型ARRAY、MAP 和 STRUCT。ARRAY和MAP与Java中的Array和Map类似，而 STRUCT与C语言中的Struct类似，它封装了一个命名字段集合，复杂数据类型允许任意层次的嵌套.</p><h2 id="类型转换">类型转换</h2><ol><li class="lvl-3"><p>Hive 的基本数据类型是可以进行隐式转换的，类似于Java的类型转换</p></li></ol><p>例如:某表达式使用INT类型，TINYINT会自动转换为INT类型，但是Hive不会进行反向转化例如，某表达式使用TINYINT 类型，INT 不会自动转换为TINYINT 类型，它会返回错误，除非使用CAST 操作。</p><ol start="2"><li class="lvl-3"><p>隐式类型转换规则如下</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>任何整数类型都可以隐式地转换为一个范围更广的类型，如INT可以转换成BIGINT。</p></li><li class="lvl-2"><p>所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。</p></li><li class="lvl-2"><p>TINYINT、SMALLINT、INT 都可以转换为FLOAT。</p></li><li class="lvl-2"><p>BOOLEAN 类型不可以转换为任何其它的类型。</p></li></ul><ol start="3"><li class="lvl-3"><p>可以使用CAST操作显示进行数据类型转换例如：CAST(‘1’ AS INT)将把字符串’1’ 转换成整数1；如果强制类型转换失败，如执行CAST(‘X’ AS INT)，表达式返回空值 NULL。</p></li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><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></pre></td><td class="code"><pre><span class="line">hive(default)&gt; select &#x27;1&#x27;+2, cast(&#x27;1&#x27;as int) + 2; </span><br><span class="line">+------+------+--+ </span><br><span class="line">| <span class="emphasis">_c0  | _</span>c1  | </span><br><span class="line">+------+------+--+ </span><br><span class="line">| 3.0  | 3    | </span><br><span class="line">+------+------+--+ </span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">hive基本概念</summary>
    
    
    
    <category term="学习" scheme="http://zxwlove.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="笔记" scheme="http://zxwlove.xyz/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="Hive" scheme="http://zxwlove.xyz/tags/Hive/"/>
    
    <category term="学习" scheme="http://zxwlove.xyz/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
</feed>
