<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>网络 on 个人技术随想</title>
        <link>https://www.dhao2001.com/tags/%E7%BD%91%E7%BB%9C/</link>
        <description>Recent content in 网络 on 个人技术随想</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Wed, 04 Dec 2024 22:00:00 +0800</lastBuildDate><atom:link href="https://www.dhao2001.com/tags/%E7%BD%91%E7%BB%9C/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Incus网络配置指北</title>
            <link>https://www.dhao2001.com/2024/12/04/incus-networking-guide/</link>
            <pubDate>Wed, 04 Dec 2024 22:00:00 +0800</pubDate>
            <guid>https://www.dhao2001.com/2024/12/04/incus-networking-guide/</guid>
            <description>&lt;p&gt;网络配置大概是容器配置中最无聊的部分了。&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;incus与macvtap&#34;&gt;&lt;a href=&#34;#incus%e4%b8%8emacvtap&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Incus与Macvtap&#xA;&lt;/h2&gt;&lt;p&gt;什么是Macvtap？太简单了请自行百度。总之就是快速将虚拟机/容器作为一个独立机器，暴露给主机所在的网络的功能。&lt;/p&gt;&#xA;&lt;p&gt;需要注意，Macvtap能实现与局域网内其他主机的通信，&lt;strong&gt;但唯独不能实现与主机的通信！&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;如果有和主机通信的需要，建议为虚拟机配置一块额外的网卡，或使用传统的Bridge网络。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 创建一个配置文件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# macvlan-enp4s0是配置文件名称&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# eth0是虚拟机中这个macvtap网卡的名称&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# enp4s0是想要连接到的主机网卡名称&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;incus profile device add macvlan-enp4s0 eth0 nic &lt;span class=&#34;nv&#34;&gt;nictype&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;macvlan &lt;span class=&#34;nv&#34;&gt;parent&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;enp4s0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 以该配置创建一个新容器&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;incus init images:debian/12 my-debian --profile default --profile macvlan-enp4s0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 或是为虚拟机设置配置文件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;incus profile add my-debian macvtap-enp4s0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h2 id=&#34;incus端口发布&#34;&gt;&lt;a href=&#34;#incus%e7%ab%af%e5%8f%a3%e5%8f%91%e5%b8%83&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Incus端口发布&#xA;&lt;/h2&gt;&lt;p&gt;在Docker中，我们可能已经习惯了采用&lt;code&gt;-p 10086:80&lt;/code&gt;这样的命令，将容器的一个端口映射到主机上另一个端口。&lt;/p&gt;&#xA;&lt;p&gt;这一目标在Incus中，需要借助&lt;a class=&#34;link&#34; href=&#34;https://linuxcontainers.org/incus/docs/main/reference/devices_proxy/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Proxy&lt;/a&gt;这一设备类型实现，不过会稍显复杂。&lt;/p&gt;&#xA;&lt;blockquote class=&#34;alert alert-note&#34;&gt;&#xA;        &lt;div class=&#34;alert-header&#34;&gt;&#xA;            &lt;span class=&#34;alert-icon&#34;&gt;📝&lt;/span&gt;&#xA;            &lt;span class=&#34;alert-title&#34;&gt;备注&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div class=&#34;alert-body&#34;&gt;&#xA;            &lt;h5 id=&#34;network-forward转发与proxy有什么区别&#34;&gt;&lt;a href=&#34;#network-forward%e8%bd%ac%e5%8f%91%e4%b8%8eproxy%e6%9c%89%e4%bb%80%e4%b9%88%e5%8c%ba%e5%88%ab&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Network Forward转发与Proxy有什么区别？&#xA;&lt;/h5&gt;&lt;p&gt;参考：&lt;a class=&#34;link&#34; href=&#34;https://discuss.linuxcontainers.org/t/difference-between-network-forward-and-proxy-device/13421&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Difference between network forward and proxy device&lt;/a&gt;&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;The proxy device is instance specific and can forward connections in either direction, between protocols, and when operating in non Nat mode doesn’t require a network connection between host and instance.&lt;/p&gt;&#xA;&lt;p&gt;A forward on the other hand is more like a proxy device operating in Nat mode. But its defined at the network level rather than instance level and allows sharing an ip between multiple instances because it can forward different ports to different ips.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;        &lt;/div&gt;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;首先，如果是绑定到普通用户默认&lt;a class=&#34;link&#34; href=&#34;https://linuxcontainers.org/incus/docs/main/reference/projects/#&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Project&lt;/a&gt;的容器实例，我们要先解除该Project禁止设置Proxy设备的限制。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo incus project edit user-1000&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;是的，&lt;code&gt;sudo&lt;/code&gt;，除非账户在&lt;code&gt;incus-admin&lt;/code&gt;用户组里，否则请用&lt;code&gt;sudo&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;在&lt;code&gt;config&lt;/code&gt;下添加一行：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# ......&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restricted.devices.proxy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;allow&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;保存。现在我们就可以向容器示例添加&lt;code&gt;proxy&lt;/code&gt;设备了。&lt;/p&gt;&#xA;&lt;p&gt;假设在容器&lt;code&gt;my-http&lt;/code&gt;里，有一个Nginx正在监听80端口，我们现在希望将容器的80端口映射到主机的10086端口，以实现访问主机的10086端口，就能访问到容器的80端口。那么，命令如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;incus config device add my-http port10086to80 proxy &lt;span class=&#34;nv&#34;&gt;connect&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;tcp:127.0.0.1:80&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;listen&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;tcp:0.0.0.0:10086&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;完成以后，可以在主机运行&lt;code&gt;curl http://127.0.0.1:10086&lt;/code&gt;命令，查看绑定是否成功。&lt;/p&gt;&#xA;&lt;p&gt;如果计划使用反向代理将外部的请求转发到容器，同时禁止外部网络直接通过访问端口号访问到容器内服务，那么可以将最后的&lt;code&gt;listen&lt;/code&gt;字段中IP，改成&lt;code&gt;127.0.0.1&lt;/code&gt;。&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>简易使用局域网Local域名</title>
            <link>https://www.dhao2001.com/2024/08/14/play-with-local-domain/</link>
            <pubDate>Wed, 14 Aug 2024 12:00:00 +0800</pubDate>
            <guid>https://www.dhao2001.com/2024/08/14/play-with-local-domain/</guid>
            <description>&lt;p&gt;习惯了在公网服务器上用多个子域名访问不同应用，在局域网环境中我们也常常希望这么做。&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;p&gt;对于自带DNS服务器并维护了&lt;code&gt;.lan&lt;/code&gt;域名的路由器来说，一切非常简单，不需要额外配置就能直接使用&lt;code&gt;主机名.lan&lt;/code&gt;解析其他主机地址。当然，也仅限于此，增加子域名解析或泛域名解析还需要额外配置。&lt;/p&gt;&#xA;&lt;p&gt;在局域网里增设一个DNS服务器，直接解析内网主机的地址，或许这是最为强大的方法，但也或许是最麻烦的方法。&lt;/p&gt;&#xA;&lt;p&gt;Windows的NetBIOS，以及Linux的Avahi，是操作系统附带的主机地址广播方案，在我看来似乎是更加灵活的选择。&lt;/p&gt;&#xA;&lt;p&gt;且Windows 10自较为近期的版本开始，就自带解析 &lt;code&gt;.local&lt;/code&gt; mDNS的组件，Windows和Linux之间的地址广播方案实现了互通。&lt;/p&gt;&#xA;&lt;p&gt;接下来就以在Linux服务器上配置&lt;code&gt;.local&lt;/code&gt;域名作为例子。&lt;/p&gt;&#xA;&lt;h2 id=&#34;基本组件&#34;&gt;&lt;a href=&#34;#%e5%9f%ba%e6%9c%ac%e7%bb%84%e4%bb%b6&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;基本组件&#xA;&lt;/h2&gt;&lt;p&gt;在Debian系统上直接安装：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install avahi-daemon avahi-utils&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;现在起，&lt;code&gt;&amp;lt;主机名&amp;gt;.local&lt;/code&gt;将指向这台主机。&lt;/p&gt;&#xA;&lt;h2 id=&#34;添加额外域名&#34;&gt;&lt;a href=&#34;#%e6%b7%bb%e5%8a%a0%e9%a2%9d%e5%a4%96%e5%9f%9f%e5%90%8d&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;添加额外域名&#xA;&lt;/h2&gt;&lt;p&gt;在一些服务，尤其是HTTP服务中，通过不同域名指向不同服务是非常便利的方法，如&lt;code&gt;blog.&amp;lt;主机名&amp;gt;.local&lt;/code&gt;指向博客，&lt;code&gt;nextcloud.&amp;lt;主机名&amp;gt;.local&lt;/code&gt;指向Nextcloud实例等等。&lt;/p&gt;&#xA;&lt;p&gt;甚至，有些HTTP应用必须运行在&lt;code&gt;/&lt;/code&gt;下，无法通过绑定子目录方式访问，此时必须为其分配独立的域名/子域名。&lt;/p&gt;&#xA;&lt;p&gt;Avahi的确可以添加泛域名或子域名记录，但大部分操作系统并不能正确解析mDNS的泛域名或子域名记录，或是依赖客户端系统的复杂配置，并不简单易行。&lt;/p&gt;&#xA;&lt;p&gt;但是，在局域网环境中，域名空间常常充足，退而求其次，我们完全可以为同一台主机分配多个&lt;code&gt;.local&lt;/code&gt;记录，只要不与网内其他主机冲突即可。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;avahi-utils&lt;/code&gt;软件包提供了&lt;code&gt;avahi-publish&lt;/code&gt;工具，该工具可以广播用户指定的mDNS记录到内网。例如：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;avahi-publish -a -R another.local 192.168.1.123&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;这可以将&lt;code&gt;another.local&lt;/code&gt;域名指向IP地址&lt;code&gt;192.168.1.123&lt;/code&gt;。&lt;code&gt;-R&lt;/code&gt;选项代表不要广播反向（IP到主机名）解析记录，由于IP地址到主机名的唯一性，这一选项应当被保留。&lt;/p&gt;&#xA;&lt;p&gt;也可以将其编写成一个Systemd服务单元，例如，可以将以下内容填入&lt;code&gt;/etc/systemd/system/avahi-alias@.service&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[Unit]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Description=Publish %I as alias for %H.local via mdns&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Requires=avahi-daemon.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;After=avahi-daemon.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[Service]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type=simple&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ExecStart=/bin/bash -c &amp;#34;/usr/bin/avahi-publish -a -R %I $(avahi-resolve -4 -n %H.local &amp;gt; /dev/null &amp;amp;&amp;amp; ip route get 1 | awk &amp;#39;{print $7;exit}&amp;#39;)&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Restart=always&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RestartSec=3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[Install]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;WantedBy=multi-user.target&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;之后执行：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl daemon-reload&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; --now avahi-alias@another.local&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;即可对外发布mDNS记录。&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Docker镜像本地拉取与迁移</title>
            <link>https://www.dhao2001.com/2024/06/29/docker-images-pulling-transfering/</link>
            <pubDate>Sat, 29 Jun 2024 12:00:00 +0800</pubDate>
            <guid>https://www.dhao2001.com/2024/06/29/docker-images-pulling-transfering/</guid>
            <description>&lt;p&gt;由于网络连通性原因，DockerHub的访问变得困难。然而在服务器上部署服务时，又经常需要使用Docker。&lt;/p&gt;&#xA;&lt;p&gt;为了避免在服务器上进行复杂的网络设置，一种相对折中的方法是：在一台网络流畅（下面称为本机）的机器上获取Docker镜像，再将镜像复制到服务器上使用。&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;工具---skopeo&#34;&gt;&lt;a href=&#34;#%e5%b7%a5%e5%85%b7---skopeo&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;工具 - Skopeo&#xA;&lt;/h2&gt;&lt;p&gt;一种传统的方法是，在本机上也安装一个Docker Engine，使用&lt;code&gt;docker pull&lt;/code&gt;命令拉取镜像，再使用&lt;code&gt;docker save&lt;/code&gt;导出镜像。&lt;/p&gt;&#xA;&lt;p&gt;这种方法的缺点在于，我们在本机上或许并不需要/不想要/难以安装Docker引擎。&lt;/p&gt;&#xA;&lt;p&gt;而维新派指出，在Docker引擎官方代码仓库&lt;a class=&#34;link&#34; href=&#34;https://github.com/moby/moby/blob/master/contrib/download-frozen-image-v2.sh&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;moby/moby/contrib&lt;/a&gt;下，有一个&lt;a class=&#34;link&#34; href=&#34;https://github.com/moby/moby/blob/master/contrib/download-frozen-image-v2.sh&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;download-frozen-image-v2.sh&lt;/a&gt;脚本，该脚本提供了对Docker镜像的下载功能。听起来不错？&lt;/p&gt;&#xA;&lt;p&gt;而当然，也有更便捷的工具：&lt;a class=&#34;link&#34; href=&#34;https://github.com/containers/skopeo&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;containers/skopeo&lt;/a&gt;。这也是本文介绍的主角。&lt;/p&gt;&#xA;&lt;h2 id=&#34;安装skopeo&#34;&gt;&lt;a href=&#34;#%e5%ae%89%e8%a3%85skopeo&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;安装Skopeo&#xA;&lt;/h2&gt;&lt;p&gt;安装skopeo相当简单，例如在Debian 11+/Ubuntu 20.10+内，可以直接在apt源中下载安装。Alpine Linux同样可以使用apk直接添加。&lt;/p&gt;&#xA;&lt;p&gt;尽管skopeo不支持Windows版本，但完全可以创建一个简易的Alpine Linux WSL环境完成以上任务。&lt;/p&gt;&#xA;&lt;h2 id=&#34;使用skopeo获取镜像&#34;&gt;&lt;a href=&#34;#%e4%bd%bf%e7%94%a8skopeo%e8%8e%b7%e5%8f%96%e9%95%9c%e5%83%8f&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;使用Skopeo获取镜像&#xA;&lt;/h2&gt;&lt;p&gt;主要使用的是&lt;code&gt;skopeo copy&lt;/code&gt;命令，文档参见&lt;a class=&#34;link&#34; href=&#34;https://github.com/containers/skopeo/blob/main/docs/skopeo-copy.1.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;skopeo/docs/skopeo-copy.1.md&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;p&gt;具体来说，在拷贝时，我们常常希望把镜像打成一个&lt;code&gt;tar&lt;/code&gt;包，可以方便地在网络上传输。skopeo可以直接导出&lt;code&gt;tar&lt;/code&gt;文件，具体如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;skopeo copy docker://&amp;lt;image&amp;gt;:&amp;lt;tag&amp;gt; docker-archive:/path/to/archive.tar:&amp;lt;image&amp;gt;:&amp;lt;tag&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;例如，如果想要拉取busybox的最新版本镜像&lt;code&gt;busybox:latest&lt;/code&gt;，可以执行：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;skopeo copy docker://busybox:latest docker-archive:myarchive.tar:busybox:latest&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;如果镜像是由非Docker官方发布的，镜像名称中会含有斜杠，请放心，此时镜像名称&lt;code&gt;&amp;lt;image&amp;gt;&lt;/code&gt;就是包含斜杠的完整字符串。例如，以下命令当然是没问题的。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;skopeo copy docker://bitnami/postgresql:14 docker-archive:/path/to/archive.tar:bitnami/postgresql:14&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;值得注意的是，在上述命令里，附加在打包文件名后的&lt;code&gt;&amp;lt;image&amp;gt;:&amp;lt;tag&amp;gt;&lt;/code&gt;，即为之后导入docker时，该镜像所关联到的名称。&lt;/p&gt;&#xA;&lt;p&gt;例如，如果执行：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;skopeo copy docker://busybox:latest docker-archive:myarchive.tar:busybox:10086&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;导入到docker中的镜像名称也会被显示为&lt;code&gt;busybox:10086&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;user@server:~$ docker images                                                                                                                 &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;REPOSITORY    TAG          IMAGE ID       CREATED         SIZE                                                                         &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;busybox       &lt;span class=&#34;m&#34;&gt;10086&lt;/span&gt;        1234567890ab   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; months ago   1.23MB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;打包后，为了节约传输带宽和时间，可以对打包好的&lt;code&gt;tar&lt;/code&gt;文件压缩一下。可以使用&lt;code&gt;zstd&lt;/code&gt;（&lt;code&gt;gz&lt;/code&gt;等当然也行），大约能缩小2/3的体积。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;zstd -9 myarchive.tar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h2 id=&#34;在服务器上导入镜像&#34;&gt;&lt;a href=&#34;#%e5%9c%a8%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a%e5%af%bc%e5%85%a5%e9%95%9c%e5%83%8f&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;在服务器上导入镜像&#xA;&lt;/h2&gt;&lt;p&gt;使用喜欢的方法将打包文件传输到服务器后，就可以导入Docker引擎：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker load &amp;lt; myarchive.tar.zstd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;这里使用的是重定向输入文件流，当然也可以使用&lt;code&gt;-i&lt;/code&gt;参数引导读取指定路径的文件。同时，&lt;code&gt;docker load&lt;/code&gt;也可以加载包括&lt;code&gt;gz&lt;/code&gt;, &lt;code&gt;xz&lt;/code&gt;, &lt;code&gt;bzip2&lt;/code&gt;, &lt;code&gt;zstd&lt;/code&gt;在内的压缩文件。&lt;/p&gt;&#xA;&lt;h2 id=&#34;与同名同tag现有镜像的冲突&#34;&gt;&lt;a href=&#34;#%e4%b8%8e%e5%90%8c%e5%90%8d%e5%90%8ctag%e7%8e%b0%e6%9c%89%e9%95%9c%e5%83%8f%e7%9a%84%e5%86%b2%e7%aa%81&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;与同名同tag现有镜像的冲突&#xA;&lt;/h2&gt;&lt;p&gt;导入时会覆盖掉同名镜像，即原有镜像的名称会被置空，变成孤立的镜像。运行&lt;code&gt;docker images prune&lt;/code&gt;可以删除这些孤立镜像。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
