<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>博观网</title><link>http://www.bloguan.com/</link><description>分享有价值的内容</description><item><title>Ubuntu中设置网络IP地址4种方法</title><link>http://www.bloguan.com/?id=631</link><description>&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;在Ubuntu中设置网络IP地址有多种方法，详细介绍几种常见的方式：&lt;/p&gt;
&lt;h2 id=&quot;h2-u65B9u6CD51uFF1Au4F7Fu7528netplanuFF08Ubuntu2017.10u53CAu4EE5u540Eu7248u672CuFF09-3&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;方法1：使用netplan（Ubuntu 17.10及以后版本）&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;方法1：使用netplan（Ubuntu 17.10及以后版本）&lt;/h2&gt;&lt;h3 id=&quot;h3-u8BBEu7F6Eu9759u6001IP-5&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;设置静态IP&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;设置静态IP&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;查看网络接口名称&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ip addr show
# 或
nmcli device status
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;编辑netplan配置文件&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo nano /etc/netplan/01-netcfg.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;配置静态IP示例&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      addresses:
        - 192.168.1.100/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8, 1.1.1.1]
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;应用配置&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo netplan apply
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-u8BBEu7F6Eu4E3ADHCP-40&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;设置为DHCP&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;设置为DHCP&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: true
      dhcp6: true
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-u65B9u6CD52uFF1Au4F7Fu7528NetworkManageruFF08u684Cu9762u7248u5E38u7528uFF09-52&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;方法2：使用NetworkManager（桌面版常用）&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;方法2：使用NetworkManager（桌面版常用）&lt;/h2&gt;&lt;h3 id=&quot;h3-u56FEu5F62u754Cu9762u8BBEu7F6E-54&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;图形界面设置&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;图形界面设置&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;打开网络设置&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;nm-connection-editor
# 或点击系统托盘的网络图标
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;选择对应连接 → 编辑 → IPv4设置&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;手动：设置静态IP&lt;/li&gt;&lt;li&gt;自动(DHCP)：使用DHCP&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;h3 id=&quot;h3-u547Du4EE4u884Cu8BBEu7F6E-66&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;命令行设置&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;命令行设置&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;设置静态IP&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo nmcli con mod &quot;有线连接 1&quot; ipv4.addresses &quot;192.168.1.100/24&quot;
sudo nmcli con mod &quot;有线连接 1&quot; ipv4.gateway &quot;192.168.1.1&quot;
sudo nmcli con mod &quot;有线连接 1&quot; ipv4.dns &quot;8.8.8.8,1.1.1.1&quot;
sudo nmcli con mod &quot;有线连接 1&quot; ipv4.method manual
sudo nmcli con down &quot;有线连接 1&quot;
sudo nmcli con up &quot;有线连接 1&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;设置为DHCP&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo nmcli con mod &quot;有线连接 1&quot; ipv4.method auto
sudo nmcli con down &quot;有线连接 1&quot;
sudo nmcli con up &quot;有线连接 1&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-u65B9u6CD53uFF1Au4F20u7EDFifupdownu65B9u6CD5uFF08u8F83u8001u7248u672CuFF09-85&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;方法3：传统ifupdown方法（较老版本）&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;方法3：传统ifupdown方法（较老版本）&lt;/h2&gt;&lt;h3 id=&quot;h3-u8BBEu7F6Eu9759u6001IP-87&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;设置静态IP&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;设置静态IP&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;编辑接口配置&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo nano /etc/network/interfaces
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;配置内容&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;auto ens33
iface ens33 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 8.8.8.8 1.1.1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-u8BBEu7F6Eu4E3ADHCP-104&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;设置为DHCP&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;设置为DHCP&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;auto ens33
iface ens33 inet dhcp
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;重启网络服务&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart networking
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-u65B9u6CD54uFF1Au4F7Fu7528ipu547Du4EE4uFF08u4E34u65F6u8BBEu7F6EuFF09-115&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;方法4：使用ip命令（临时设置）&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;方法4：使用ip命令（临时设置）&lt;/h2&gt;&lt;h3 id=&quot;h3-u4E34u65F6u8BBEu7F6Eu9759u6001IP-117&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;临时设置静态IP&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;临时设置静态IP&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo ip addr add 192.168.1.100/24 dev ens33
sudo ip route add default via 192.168.1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-u4E34u65F6u8BBEu7F6Eu4E3ADHCP-123&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;临时设置为DHCP&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;临时设置为DHCP&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo dhclient ens33
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-u9A8Cu8BC1u914Du7F6E-128&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;验证配置&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;验证配置&lt;/h2&gt;&lt;p&gt;设置完成后，使用以下命令验证：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 查看IP配置
ip addr show

# 测试网络连通性
ping -c 4 8.8.8.8

# 查看路由表
ip route show

# 测试DNS解析
nslookup google.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-u6CE8u610Fu4E8Bu9879-146&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;注意事项&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;注意事项&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;备份配置文件&lt;/strong&gt;：修改前建议备份原配置&lt;/li&gt;&lt;li&gt;&lt;strong&gt;接口名称&lt;/strong&gt;：根据实际接口名称修改（ens33、eth0等）&lt;/li&gt;&lt;li&gt;&lt;strong&gt;网络参数&lt;/strong&gt;：根据实际网络环境修改IP、网关等参数&lt;/li&gt;&lt;li&gt;&lt;strong&gt;权限&lt;/strong&gt;：需要sudo权限修改系统网络配置&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;推荐使用&lt;strong&gt;netplan&lt;/strong&gt;方法，这是Ubuntu当前主推的网络配置工具。&lt;/p&gt;
&lt;/body&gt;</description><pubDate>Tue, 18 Nov 2025 17:41:18 +0800</pubDate></item><item><title>Python代码加密的四种方案</title><link>http://www.bloguan.com/?id=630</link><description>&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;在交付 Python 项目时，我们通常不希望源代码被轻易查看、修改或窃取。&lt;/p&gt;
&lt;p&gt;首先，需要明确一个核心概念：&lt;strong&gt;Python 作为一种解释型语言，不存在像 C++/Java 那样编译成机器码后能实现“绝对”加密的方法。&lt;/strong&gt; 我们所有的努力，都是为了&lt;strong&gt;增加逆向工程的难度和成本&lt;/strong&gt;，而不是做到完全无法破解。&lt;/p&gt;
&lt;p&gt;下面我将从易到难，从“混淆”到“编译”，介绍几种免费的方式，并分析它们的优缺点。&lt;/p&gt;
&lt;h3 id=&quot;h3-u65B9u6848u4E00uFF1Au4EE3u7801u6DF7u6DC6-7&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;方案一：代码混淆&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;方案一：代码混淆&lt;/h3&gt;&lt;p&gt;这是最简单、最直接的方式，不改变代码的执行逻辑，但让代码变得极难阅读和理解。&lt;/p&gt;
&lt;h4 id=&quot;h4-1.20u624Bu52A8u6DF7u6DC6-11&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;1. 手动混淆&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1. 手动混淆&lt;/h4&gt;&lt;p&gt;通过一些简单的约定和技巧，增加代码的阅读障碍。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;变量/函数名混淆&lt;/strong&gt;：将有意义的名称（如 &lt;code&gt;calculate_user_balance&lt;/code&gt;）替换为无意义的短名称（如 &lt;code&gt;x_y_z&lt;/code&gt;）。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;移除注释和文档字符串&lt;/strong&gt;：删除所有对代码逻辑的解释。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;使用&lt;code&gt;__all__&lt;/code&gt;&lt;/strong&gt; ：限制 &lt;code&gt;from module import *&lt;/code&gt; 时导入的符号，但这更多是规范而非加密。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;字符串加密&lt;/strong&gt;：将关键的字符串（如密码、URL）进行编码或加密，在运行时再解码。&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;完全免费，无需任何第三方库。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;简单快捷，可以立即实施。&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;安全性极低&lt;/strong&gt;：对于有经验的程序员来说，通过单步调试、打印变量等方式，很容易就能理清逻辑。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;破坏了代码的可维护性，你自己后续维护也会很痛苦。&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：只想防止“小白”用户直接查看代码，对安全性要求不高的场景。&lt;/p&gt;
&lt;h4 id=&quot;h4-2.20u81EAu52A8u6DF7u6DC6u5DE5u5177-37&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;2. 自动混淆工具&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2. 自动混淆工具&lt;/h4&gt;&lt;p&gt;使用工具自动完成上述混淆过程，效果更好，也更省力。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;推荐工具：&lt;code&gt;pyminifier&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是一个非常流行的 Python 代码混淆工具。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install pyminifier
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;使用示例&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;假设你有一个 &lt;code&gt;my_script.py&lt;/code&gt; 文件。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 基本混淆：移除注释，压缩空格

pyminifier --obfuscate my_script.py &amp;gt; my_script_obfuscated.py

# 更强混淆：替换变量名

pyminifier --obfuscate-variables my_script.py &amp;gt; my_script_obfuscated_vars.py

# 最强混淆：替换变量名，并使用 Base64 编码字符串

pyminifier --obfuscate-variables --obfuscate-classes --obfuscate-functions --replacement-length=1 my_script.py &amp;gt; my_script_obfuscated_max.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;免费、开源。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;比手动混淆更彻底、更高效。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;可以集成到自动化构建流程中。&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;依然不是真正的加密&lt;/strong&gt;。有经验的攻击者可以通过 &lt;code&gt;ast&lt;/code&gt; (抽象语法树) 分析或动态调试来还原逻辑。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;可能会引入一些意想不到的 bug，特别是当代码中大量使用 &lt;code&gt;eval()&lt;/code&gt;、&lt;code&gt;exec()&lt;/code&gt; 或动态属性访问时。&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：希望提高代码阅读门槛，防止代码被轻易复制和修改的场景。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;h3-u65B9u6848u4E8CuFF1Au7F16u8BD1u6210u5B57u8282u7801-89&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;方案二：编译成字节码&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;方案二：编译成字节码&lt;/h3&gt;&lt;p&gt;Python 在执行 &lt;code&gt;.py&lt;/code&gt; 文件时，会先将其编译成 &lt;code&gt;.pyc&lt;/code&gt; 字节码文件（存储在 &lt;code&gt;__pycache__&lt;/code&gt; 目录中）。我们可以直接分发 &lt;code&gt;.pyc&lt;/code&gt; 文件，而不是 &lt;code&gt;.py&lt;/code&gt; 源文件。&lt;/p&gt;
&lt;h4 id=&quot;h4-1.20u624Bu52A8u7F16u8BD1u5E76u5206u53D1203Ccode3E.pyc3C/code3E-93&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;1. 手动编译并分发 .pyc&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1. 手动编译并分发 &lt;code&gt;.pyc&lt;/code&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;操作步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;编译你所有的 Python 文件。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;只分发 &lt;code&gt;.pyc&lt;/code&gt; 文件，删除 &lt;code&gt;.py&lt;/code&gt; 文件。&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;如何编译&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import py_compile

# 编译单个文件

py_compile.compile('my_module.py', cfile='my_module.pyc', optimize=2)

# 或者，使用 compileall 编译整个目录

import compileall

# optimize=2 表示移除断言和文档字符串

compileall.compile_dir('.', force=True, optimize=2)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Python 内置功能，完全免费。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;隐藏了源代码的文本内容。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;略微提升启动速度（省去了编译步骤）。&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;非常容易被反编译&lt;/strong&gt;。有现成的工具（如 &lt;code&gt;uncompyle6&lt;/code&gt;）可以轻松地将 &lt;code&gt;.pyc&lt;/code&gt; 文件反编译回几乎与原始代码一模一样的 &lt;code&gt;.py&lt;/code&gt; 文件。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;
pip install uncompyle6

uncompyle6 my_module.pyc &amp;gt; my_module_decompiled.py
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;跨版本兼容性问题。用 Python 3.10 编译的 &lt;code&gt;.pyc&lt;/code&gt; 文件无法在 Python 3.11 上运行。&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：防止用户“无意中”看到源代码，或者对启动速度有微小要求的场景。&lt;strong&gt;不推荐作为主要的加密手段。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;h3-u65B9u6848u4E09uFF1Au6253u5305u6210u53EFu6267u884Cu6587u4EF6-146&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;方案三：打包成可执行文件&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;方案三：打包成可执行文件&lt;/h3&gt;&lt;p&gt;这是目前最流行、最有效的免费交付方式。它将你的 Python 代码、依赖库、甚至一个 Python 解释器一起打包成一个独立的可执行文件（如 Windows 的 &lt;code&gt;.exe&lt;/code&gt;，Linux 的可执行文件）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;推荐工具：&lt;code&gt;PyInstaller&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;PyInstaller&lt;/code&gt; 是功能最强大、社区最活跃的打包工具之一。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install pyinstaller
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;使用示例&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 将 my_script.py 打包成一个单文件可执行程序

pyinstaller --onefile --noconsole my_script.py

# --onefile: 生成一个独立的 .exe 文件

# --noconsole (或 -w): 运行时不显示黑色的控制台窗口（适用于GUI程序）

# --add-data: 添加非代码文件（如图片、配置文件）

# --icon: 指定程序图标
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;用户体验极佳&lt;/strong&gt;：用户无需安装 Python 和任何依赖，直接运行即可。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;安全性较高&lt;/strong&gt;：代码被打包在可执行文件中，虽然仍可被逆向，但难度远高于 &lt;code&gt;.pyc&lt;/code&gt; 反编译。攻击者需要使用专业的反汇编工具（如 Ghidra, IDA Pro）来分析，成本大大增加。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;完全免费、开源。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;跨平台支持。&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;文件体积大&lt;/strong&gt;：因为内置了解释器和依赖，单文件模式可能会产生几十MB甚至上百MB的文件。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;杀毒软件误报&lt;/strong&gt;：某些打包方式可能会被杀毒软件误判为病毒，需要进行代码签名或提交白名单。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;启动速度可能比直接运行 &lt;code&gt;.py&lt;/code&gt; 慢，因为需要解压资源到临时目录。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;并非坚不可摧&lt;/strong&gt;：专业的逆向工程师仍然可以从中提取出 &lt;code&gt;.pyc&lt;/code&gt; 文件并进行反编译。&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：&lt;strong&gt;绝大多数商业软件交付和内部工具分发的首选方案。&lt;/strong&gt; 在安全性和易用性之间取得了最好的平衡。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;h3-u65B9u6848u56DBuFF1Au7F16u8BD1u6210u539Fu751Fu4EE3u7801-202&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;方案四：编译成原生代码&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;方案四：编译成原生代码&lt;/h3&gt;&lt;p&gt;这是最高级别的保护方式，它将 Python 代码真正地编译成特定平台的机器码。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;推荐工具：&lt;code&gt;Nuitka&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Nuitka&lt;/code&gt; 是一个 Python 编译器，它将 Python 代码和模块转换成 C 代码，然后使用标准的 C/C++ 编译器将其编译成可执行文件或动态链接库。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install nuitka
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;使用示例&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 编译成可执行文件

python -m nuitka --standalone --onefile --follow-imports my_script.py

# --standalone: 创建独立的可执行文件

# --onefile: 打包成单个文件

# --follow-imports: 递归编译所有导入的模块
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;目前免费方案中最高的安全性&lt;/strong&gt;。生成的是原生机器码，反编译难度极大，接近于破解一个 C++ 程序。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;性能提升&lt;/strong&gt;：由于是编译成机器码，通常比标准的 CPython 解释执行有显著的性能提升。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;兼容性好，生成的程序与 PyInstaller 类似，可以独立运行。&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;编译过程复杂且耗时&lt;/strong&gt;：需要系统上安装 C++ 编译器（如 Windows 上的 MSVC，Linux 上的 GCC）。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;对某些库的兼容性可能不如 PyInstaller&lt;/strong&gt;，特别是那些使用了 C 扩展或复杂动态导入机制的库。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;仍然免费，但学习曲线比 PyInstaller 陡峭。&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：对性能有较高要求，且对代码安全性有极致追求的商业软件。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;h3-u603Bu7ED3u4E0Eu5BF9u6BD4-252&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;总结与对比&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;总结与对比&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方案&lt;/th&gt;
&lt;th&gt;免费工具&lt;/th&gt;
&lt;th&gt;安全性&lt;/th&gt;
&lt;th&gt;易用性&lt;/th&gt;
&lt;th&gt;性能影响&lt;/th&gt;
&lt;th&gt;推荐指数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;代码混淆&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pyminifier&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;几乎无&lt;/td&gt;
&lt;td&gt;★★☆☆☆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;字节码编译&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;py_compile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;极低&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;略微提升&lt;/td&gt;
&lt;td&gt;★☆☆☆☆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;打包可执行文件&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PyInstaller&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;中高&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;高&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;启动稍慢&lt;/td&gt;
&lt;td&gt;★★★★★&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;编译原生代码&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Nuitka&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;高&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;性能提升&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;h3-u6700u7EC8u5EFAu8BAE-261&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;最终建议&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;最终建议&lt;/h3&gt;&lt;p&gt;对于绝大多数 Python 项目交付场景：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;**首选 &lt;code&gt;PyInstaller&lt;/code&gt;**。它在安全性、易用性和用户体验之间取得了最佳平衡。对于 99% 的用户和客户来说，这已经足够安全了。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;如果你的项目对性能有极致要求，或者你面对的是技术能力很强的对手，希望进一步提高破解门槛，那么**投入时间学习并使用 &lt;code&gt;Nuitka&lt;/code&gt;**。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;pyminifier&lt;/code&gt; 可以作为 &lt;code&gt;PyInstaller&lt;/code&gt; 或 &lt;code&gt;Nuitka&lt;/code&gt; 打包前的&lt;strong&gt;预处理步骤&lt;/strong&gt;，实现“混淆+编译”的双重保护，让代码更难被分析。&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;重要提醒&lt;/strong&gt;：无论你选择哪种方式，都无法做到 100% 防破解。软件保护的核心是&lt;strong&gt;提高破解成本，使其超过破解者能获得的利益&lt;/strong&gt;。同时，配合软件许可验证、在线激活等业务逻辑层面的保护，才能构成更完整的安全体系。&lt;/p&gt;
&lt;/body&gt;</description><pubDate>Mon, 20 Oct 2025 17:15:22 +0800</pubDate></item><item><title>Docker 与 Docker Compose 安装指南：使用代理加速下载</title><link>http://www.bloguan.com/?id=629</link><description>&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;h1 id=&quot;h1-Docker20u4E0E20Docker20Compose20u5B89u88C5u6307u5357uFF1Au4F7Fu7528u4EE3u7406u52A0u901Fu4E0Bu8F7D-1&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;Docker 与 Docker Compose 安装指南：使用代理加速下载&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;Docker 与 Docker Compose 安装指南：使用代理加速下载&lt;/h1&gt;&lt;p&gt;Docker 已经成为现代应用开发和部署的标准工具之一。然而，在国内网络环境下，直接从官方源下载 Docker 及相关镜像可能会遇到速度慢甚至无法连接的问题。本文将详细介绍如何安装 Docker 和 Docker Compose，并特别说明如何配置代理服务来加速下载过程。&lt;/p&gt;
&lt;h2 id=&quot;h2-u7B2Cu4E00u90E8u5206uFF1ADocker20u5B89u88C5-6&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;第一部分：Docker 安装&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;第一部分：Docker 安装&lt;/h2&gt;&lt;h3 id=&quot;h3-u6807u51C6u5B89u88C5u6B65u9AA4-8&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;标准安装步骤&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;标准安装步骤&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;更新系统包索引&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt-get update
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;安装依赖包&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt-get install \
   apt-transport-https \
   ca-certificates \
   curl \
   gnupg \
   lsb-release
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;添加 Docker 官方 GPG 密钥&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;设置稳定版仓库&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo \
  &quot;deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable&quot; | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;安装 Docker 引擎&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;h3 id=&quot;h3-u4F7Fu7528u4EE3u7406u52A0u901Fu4E0Bu8F7D-43&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;使用代理加速下载&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;使用代理加速下载&lt;/h3&gt;&lt;p&gt;如果在上述步骤中遇到下载缓慢的问题，可以通过以下方法配置代理：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方法一：临时使用代理下载&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在执行 &lt;code&gt;apt-get&lt;/code&gt; 命令前设置环境变量：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo http_proxy=http://your-proxy-address:port https_proxy=http://your-proxy-address:port apt-get update
sudo http_proxy=http://your-proxy-address:port https_proxy=http://your-proxy-address:port apt-get install docker-ce docker-ce-cli containerd.io
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;方法二：配置系统级代理&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;编辑 &lt;code&gt;/etc/apt/apt.conf.d/proxy.conf&lt;/code&gt; 文件（如果不存在则创建）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo nano /etc/apt/apt.conf.d/proxy.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Acquire {
  HTTP::proxy &quot;http://your-proxy-address:port&quot;;
  HTTPS::proxy &quot;http://your-proxy-address:port&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;方法三：使用国内镜像源&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果不想使用代理，可以替换 Docker 下载源为国内镜像：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;编辑 Docker 源列表文件：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo nano /etc/apt/sources.list.d/docker.list
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;将网址替换为国内镜像，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu/ $(lsb_release -cs) stable
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;h3 id=&quot;h3-u9A8Cu8BC1u5B89u88C5-84&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;验证安装&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;验证安装&lt;/h3&gt;&lt;p&gt;安装完成后，运行以下命令验证 Docker 是否安装成功：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo docker run hello-world
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果看到欢迎信息，说明 Docker 已正确安装。&lt;/p&gt;
&lt;h2 id=&quot;h2-u7B2Cu4E8Cu90E8u5206uFF1ADocker20Compose20u5B89u88C5-93&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;第二部分：Docker Compose 安装&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;第二部分：Docker Compose 安装&lt;/h2&gt;&lt;h3 id=&quot;h3-u6807u51C6u5B89u88C5u6B65u9AA4-95&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;标准安装步骤&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;标准安装步骤&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;下载 Docker Compose 二进制文件&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo curl -L &quot;https://github.com/docker/compose/releases/download/v2.27.1/docker-compose-$(uname -s)-$(uname -m)&quot; -o /usr/local/bin/docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;应用可执行权限&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo chmod +x /usr/local/bin/docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;验证安装&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker-compose --version
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;h3 id=&quot;h3-u4F7Fu7528u4EE3u7406u52A0u901Fu4E0Bu8F7D-112&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;使用代理加速下载&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;使用代理加速下载&lt;/h3&gt;&lt;p&gt;对于 Docker Compose 的下载，可以通过以下方式使用代理：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方法一：使用 curl 代理参数&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo curl -x http://your-proxy-address:port -L &quot;https://github.com/docker/compose/releases/download/v2.27.1/docker-compose-$(uname -s)-$(uname -m)&quot; -o /usr/local/bin/docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;方法二：先下载到本地再上传&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果代理方法仍然缓慢，可以：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在浏览器中手动下载 Docker Compose 二进制文件&lt;/li&gt;&lt;li&gt;通过 SCP 或 SFTP 上传到服务器&lt;/li&gt;&lt;li&gt;移动到指定位置并设置权限：&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo mv docker-compose /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;h2 id=&quot;h2-u7B2Cu4E09u90E8u5206uFF1Au914Du7F6E20Docker20u4F7Fu7528u4EE3u7406u62C9u53D6u955Cu50CF-133&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;第三部分：配置 Docker 使用代理拉取镜像&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;第三部分：配置 Docker 使用代理拉取镜像&lt;/h2&gt;&lt;p&gt;即使安装了 Docker，拉取镜像时可能仍然需要代理。可以通过以下方式配置：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;创建 Docker 服务代理配置目录&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo mkdir -p /etc/systemd/system/docker.service.d
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;创建代理配置文件&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;添加代理配置&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Service]
Environment=&quot;HTTP_PROXY=http://your-proxy-address:port&quot;
Environment=&quot;HTTPS_PROXY=http://your-proxy-address:port&quot;
Environment=&quot;NO_PROXY=localhost,127.0.0.1,.example.com&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;重新加载配置并重启 Docker&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl daemon-reload
sudo systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;验证代理是否生效&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl show --property=Environment docker
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;h2 id=&quot;h2-u7B2Cu56DBu90E8u5206uFF1Au5E38u89C1u95EEu9898u89E3u51B3-166&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;第四部分：常见问题解决&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;第四部分：常见问题解决&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;代理认证问题&lt;/strong&gt;&lt;br&gt;如果代理需要认证，在配置中使用以下格式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://username:password&lt;a class=&quot;at-link&quot; title=&quot;@proxy&quot; href=&quot;https://github.com/proxy&quot;&gt;@proxy&lt;/a&gt;-host:proxy-port
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;权限问题&lt;/strong&gt;&lt;br&gt;如果遇到权限错误，将当前用户添加到 docker 组：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo usermod -aG docker $USER
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后退出重新登录使更改生效。或者&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;su - $USER
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;/body&gt;</description><pubDate>Thu, 18 Sep 2025 11:35:28 +0800</pubDate></item><item><title>Python asyncio 用法深度解析</title><link>http://www.bloguan.com/?id=628</link><description>&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;h2 id=&quot;h2-u5F15u8A00-1&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;引言&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;引言&lt;/h2&gt;&lt;p&gt;在现代软件开发中，处理高并发I/O操作是一个常见挑战。传统的同步编程模型在面对大量网络请求、文件操作或数据库查询时往往效率低下。Python的&lt;code&gt;asyncio&lt;/code&gt;库应运而生，它提供了基于&lt;code&gt;async/await&lt;/code&gt;语法的异步编程能力，让开发者能够编写高效、可扩展的并发代码。&lt;/p&gt;
&lt;p&gt;本文将深入探讨&lt;code&gt;asyncio&lt;/code&gt;的核心概念、用法、最佳实践以及常见陷阱，帮助你全面掌握这一强大的并发编程工具。&lt;/p&gt;
&lt;h2 id=&quot;h2-u4E00u3001u6838u5FC3u6982u5FF5u89E3u6790-7&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;一、核心概念解析&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;一、核心概念解析&lt;/h2&gt;&lt;h3 id=&quot;h3-1.120u4E8Bu4EF6u5FAAu73AF2028Event20Loop29-9&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;1.1 事件循环 (Event Loop)&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.1 事件循环 (Event Loop)&lt;/h3&gt;&lt;p&gt;事件循环是&lt;code&gt;asyncio&lt;/code&gt;的心脏，它负责调度和执行异步任务。想象事件循环就像一个高效的交通指挥员，它不断检查哪些协程可以运行，并在它们之间智能切换。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import asyncio

async def main():
    print(&quot;Hello&quot;)
    await asyncio.sleep(1)
    print(&quot;World&quot;)

# 现代Python推荐方式（3.7+）
asyncio.run(main())

# 传统方式（了解即可）
loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(main())
finally:
    loop.close()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1.220u534Fu7A0B2028Coroutine29-32&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;1.2 协程 (Coroutine)&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2 协程 (Coroutine)&lt;/h3&gt;&lt;p&gt;协程是&lt;code&gt;asyncio&lt;/code&gt;的基本执行单元，使用&lt;code&gt;async def&lt;/code&gt;定义。它们与普通函数的区别在于能够被”暂停”和”恢复”。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;async def fetch_data():
    print(&quot;开始获取数据&quot;)
    await asyncio.sleep(2)  # 模拟I/O操作
    print(&quot;数据获取完成&quot;)
    return {&quot;data&quot;: &quot;sample&quot;}

# 调用协程必须使用await
async def main():
    result = await fetch_data()
    print(f&quot;结果: {result}&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1.320Future20u548C20Task-49&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;1.3 Future 和 Task&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.3 Future 和 Task&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Future&lt;/strong&gt;: 表示异步操作的最终结果，类似于JavaScript中的Promise&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Task&lt;/strong&gt;: Future的子类，专门用于包装和管理协程&lt;/li&gt;&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;async def my_task():
    await asyncio.sleep(1)
    return &quot;任务完成&quot;

async def main():
    # 创建任务
    task = asyncio.create_task(my_task())
    
    # 可以继续执行其他操作
    print(&quot;任务已创建，继续其他工作...&quot;)
    
    # 等待任务完成
    result = await task
    print(f&quot;任务结果: {result}&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-u4E8Cu3001u57FAu672Cu7528u6CD5u8BE6u89E3-71&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;二、基本用法详解&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;二、基本用法详解&lt;/h2&gt;&lt;h3 id=&quot;h3-2.120u5E76u53D1u6267u884Cu591Au4E2Au4EFBu52A1-73&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;2.1 并发执行多个任务&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.1 并发执行多个任务&lt;/h3&gt;&lt;p&gt;&lt;code&gt;asyncio&lt;/code&gt;的真正威力在于能够轻松实现并发操作：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import asyncio
import time

async def download_file(filename, duration):
    print(f&quot;开始下载 {filename}&quot;)
    await asyncio.sleep(duration)
    print(f&quot;{filename} 下载完成&quot;)
    return f&quot;{filename}_content&quot;

async def main():
    start_time = time.time()
    
    # 方法1: 使用gather（推荐）
    results = await asyncio.gather(
        download_file(&quot;file1.txt&quot;, 2),
        download_file(&quot;file2.txt&quot;, 3),
        download_file(&quot;file3.txt&quot;, 1)
    )
    print(f&quot;所有文件下载完成: {results}&quot;)
    
    # 方法2: 分别创建任务
    task1 = asyncio.create_task(download_file(&quot;file4.txt&quot;, 2))
    task2 = asyncio.create_task(download_file(&quot;file5.txt&quot;, 1))
    
    await task1
    await task2
    
    end_time = time.time()
    print(f&quot;总耗时: {end_time - start_time:.2f}秒&quot;)

asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-2.220u8D85u65F6u5904u7406-111&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;2.2 超时处理&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.2 超时处理&lt;/h3&gt;&lt;p&gt;在实际应用中，超时控制至关重要：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;async def slow_operation():
    await asyncio.sleep(10)
    return &quot;操作完成&quot;

async def main():
    try:
        # 设置5秒超时
        result = await asyncio.wait_for(slow_operation(), timeout=5.0)
        print(result)
    except asyncio.TimeoutError:
        print(&quot;操作超时，已取消&quot;)
    
    # Python 3.11+ 的新语法
    try:
        async with asyncio.timeout(5.0):
            result = await slow_operation()
            print(result)
    except TimeoutError:
        print(&quot;操作超时&quot;)

asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-2.320u540Cu6B65u539Fu8BED-139&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;2.3 同步原语&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.3 同步原语&lt;/h3&gt;&lt;p&gt;&lt;code&gt;asyncio&lt;/code&gt;提供了线程类似的同步机制：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;async def worker(lock, name, work_time):
    async with lock:  # 获取锁
        print(f&quot;{name} 开始工作&quot;)
        await asyncio.sleep(work_time)
        print(f&quot;{name} 工作完成&quot;)

async def main():
    lock = asyncio.Lock()
    
    # 三个 worker 竞争同一个锁
    await asyncio.gather(
        worker(lock, &quot;Worker1&quot;, 2),
        worker(lock, &quot;Worker2&quot;, 1),
        worker(lock, &quot;Worker3&quot;, 3)
    )

asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-u4E09u3001u9AD8u7EA7u7528u6CD5-163&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;三、高级用法&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;三、高级用法&lt;/h2&gt;&lt;h3 id=&quot;h3-3.120u961Fu52172028Queue29-165&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;3.1 队列 (Queue)&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.1 队列 (Queue)&lt;/h3&gt;&lt;p&gt;生产者-消费者模式是并发编程的常见模式：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;async def producer(queue, items):
    for item in items:
        await queue.put(item)
        print(f&quot;生产了: {item}&quot;)
        await asyncio.sleep(0.1)  # 模拟生产时间
    await queue.put(None)  # 结束信号

async def consumer(queue, name):
    while True:
        item = await queue.get()
        if item is None:
            queue.put(None)  # 传递给其他消费者
            print(f&quot;{name} 结束工作&quot;)
            break
        
        print(f&quot;{name} 消费了: {item}&quot;)
        await asyncio.sleep(0.2)  # 模拟处理时间
        queue.task_done()  # 标记任务完成

async def main():
    queue = asyncio.Queue(maxsize=3)  # 限制队列大小
    
    # 启动生产者和消费者
    producer_task = asyncio.create_task(producer(queue, range(5)))
    consumer_tasks = [
        asyncio.create_task(consumer(queue, &quot;消费者1&quot;)),
        asyncio.create_task(consumer(queue, &quot;消费者2&quot;))
    ]
    
    await producer_task
    await queue.join()  # 等待所有任务处理完成
    
    for task in consumer_tasks:
        task.cancel()
    
    # 等待消费者任务正常结束
    await asyncio.gather(*consumer_tasks, return_exceptions=True)

asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-3.220u4E8Bu4EF62028Event2920u548Cu6761u4EF62028Condition29-211&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;3.2 事件 (Event) 和条件 (Condition)&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.2 事件 (Event) 和条件 (Condition)&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;async def waiter(event, name):
    print(f&quot;{name} 等待事件触发&quot;)
    await event.wait()
    print(f&quot;{name} 检测到事件，继续执行&quot;)

async def setter(event):
    await asyncio.sleep(2)
    print(&quot;设置事件&quot;)
    event.set()  # 触发所有等待的协程

async def main():
    event = asyncio.Event()
    
    await asyncio.gather(
        waiter(event, &quot;任务1&quot;),
        waiter(event, &quot;任务2&quot;),
        setter(event)
    )

asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-3.320u5B50u8FDBu7A0Bu7BA1u7406-236&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;3.3 子进程管理&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.3 子进程管理&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;async def run_command():
    # 创建子进程
    process = await asyncio.create_subprocess_exec(
        'python', '--version',
        stdout=asyncio.subprocess.PIPE,
        stderr=asyncio.subprocess.PIPE
    )
    
    # 等待进程完成并获取输出
    stdout, stderr = await process.communicate()
    
    print(f&quot;退出码: {process.returncode}&quot;)
    if stdout:
        print(f&quot;标准输出: {stdout.decode()}&quot;)
    if stderr:
        print(f&quot;错误输出: {stderr.decode()}&quot;)

asyncio.run(run_command())
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-u56DBu3001u5B9Eu9645u5E94u7528u793Au4F8B-259&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;四、实际应用示例&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;四、实际应用示例&lt;/h2&gt;&lt;h3 id=&quot;h3-4.120u5E76u53D1HTTPu8BF7u6C42-261&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;4.1 并发HTTP请求&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;4.1 并发HTTP请求&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import aiohttp
import asyncio

async def fetch_url(session, url):
    try:
        async with session.get(url, timeout=10) as response:
            return await response.text()
    except Exception as e:
        return f&quot;错误: {e}&quot;

async def main():
    urls = [
        &quot;http://httpbin.org/get&quot;,
        &quot;http://httpbin.org/delay/2&quot;,
        &quot;http://httpbin.org/status/404&quot;
    ]
    
    async with aiohttp.ClientSession() as session:
        tasks = [fetch_url(session, url) for url in urls]
        results = await asyncio.gather(*tasks)
        
        for url, result in zip(urls, results):
            print(f&quot;{url}: {result[:100]}...&quot;)

asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-4.220WebSocketu5BA2u6237u7AEF-291&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;4.2 WebSocket客户端&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;4.2 WebSocket客户端&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import aiohttp
import asyncio

async def websocket_client():
    try:
        async with aiohttp.ClientSession() as session:
            async with session.ws_connect(&quot;ws://echo.websocket.org&quot;) as ws:
                print(&quot;连接已建立&quot;)
                
                # 发送消息
                await ws.send_str(&quot;Hello, WebSocket!&quot;)
                
                # 接收消息
                async for msg in ws:
                    if msg.type == aiohttp.WSMsgType.TEXT:
                        print(f&quot;收到消息: {msg.data}&quot;)
                        if msg.data == &quot;close&quot;:
                            await ws.close()
                            break
                    elif msg.type == aiohttp.WSMsgType.CLOSED:
                        print(&quot;连接关闭&quot;)
                        break
                    elif msg.type == aiohttp.WSMsgType.ERROR:
                        print(&quot;连接错误&quot;)
                        break
    except Exception as e:
        print(f&quot;连接失败: {e}&quot;)

asyncio.run(websocket_client())
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-u4E94u3001u6CE8u610Fu4E8Bu9879u4E0Eu6700u4F73u5B9Eu8DF5-325&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;五、注意事项与最佳实践&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;五、注意事项与最佳实践&lt;/h2&gt;&lt;h3 id=&quot;h3-5.120u907Fu514Du963Bu585Eu4E8Bu4EF6u5FAAu73AF-327&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;5.1 避免阻塞事件循环&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;5.1 避免阻塞事件循环&lt;/h3&gt;&lt;p&gt;这是&lt;code&gt;asyncio&lt;/code&gt;开发中最常见的错误：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# ❌ 错误示例 - 阻塞调用
async def bad_example():
    import time
    time.sleep(5)  # 这会阻塞整个事件循环！

# ✅ 正确做法 - 使用异步版本
async def good_example():
    await asyncio.sleep(5)  # 非阻塞

# ✅ 对于无法异步的阻塞操作
async def run_blocking():
    loop = asyncio.get_running_loop()
    # 在线程池中运行阻塞函数
    result = await loop.run_in_executor(None, time.sleep, 5)
    return result
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-5.220u6B63u786Eu7684u9519u8BEFu5904u7406-349&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;5.2 正确的错误处理&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;5.2 正确的错误处理&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;async def risky_operation():
    try:
        await asyncio.sleep(1)
        raise ValueError(&quot;模拟错误&quot;)
    except ValueError as e:
        print(f&quot;操作失败: {e}&quot;)
        raise  # 重新抛出

async def main():
    # 单个任务的错误处理
    try:
        await risky_operation()
    except ValueError as e:
        print(f&quot;捕获错误: {e}&quot;)
    
    # 多个任务的错误处理
    tasks = [
        asyncio.create_task(risky_operation()),
        asyncio.create_task(asyncio.sleep(2))
    ]
    
    done, pending = await asyncio.wait(tasks, return_exceptions=True)
    
    for task in done:
        if isinstance(task, Exception):
            print(f&quot;任务失败: {task}&quot;)
        else:
            print(f&quot;任务成功: {task.result()}&quot;)

asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-5.320u8D44u6E90u6E05u7406-384&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;5.3 资源清理&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;5.3 资源清理&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;async def fetch_with_resource():
    # 模拟资源获取
    resource = &quot;connection&quot;
    print(f&quot;获取资源: {resource}&quot;)
    
    try:
        # 模拟业务操作
        await asyncio.sleep(1)
        return &quot;success&quot;
    finally:
        # 确保资源释放
        print(f&quot;释放资源: {resource}&quot;)

async def main():
    result = await fetch_with_resource()
    print(f&quot;操作结果: {result}&quot;)

asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-5.420u8C03u8BD5u6280u5DE7-407&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;5.4 调试技巧&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;5.4 调试技巧&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;async def debug_example():
    # 获取当前任务信息
    task = asyncio.current_task()
    print(f&quot;任务名称: {task.get_name()}&quot;)
    print(f&quot;协程: {task.get_coro()}&quot;)
    
    await asyncio.sleep(1)

async def main():
    # 启用调试模式
    asyncio.run(debug_example(), debug=True)
    
    # 或者设置事件循环的调试模式
    loop = asyncio.get_event_loop()
    loop.set_debug(True)
    
    try:
        await debug_example()
    finally:
        loop.set_debug(False)

asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-u516Du3001u6027u80FDu4F18u5316u5EFAu8BAE-434&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;六、性能优化建议&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;六、性能优化建议&lt;/h2&gt;&lt;h3 id=&quot;h3-6.120u9650u5236u5E76u53D1u6570-436&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;6.1 限制并发数&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;6.1 限制并发数&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;async def limited_concurrency(urls, max_concurrent=5):
    semaphore = asyncio.Semaphore(max_concurrent)
    
    async def fetch_with_limit(url):
        async with semaphore:
            async with aiohttp.ClientSession() as session:
                async with session.get(url) as response:
                    return await response.text()
    
    tasks = [fetch_with_limit(url) for url in urls]
    return await asyncio.gather(*tasks)

# 使用示例
async def main():
    urls = [&quot;http://example.com&quot;] * 100
    results = await limited_concurrency(urls, max_concurrent=10)
    print(f&quot;完成了 {len(results)} 个请求&quot;)

asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-6.220u4F7Fu7528u8FDEu63A5u6C60-460&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;6.2 使用连接池&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;6.2 使用连接池&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;async def efficient_requests():
    connector = aiohttp.TCPConnector(limit=10)  # 限制连接数
    
    async with aiohttp.ClientSession(connector=connector) as session:
        tasks = [session.get(f&quot;http://example.com/page/{i}&quot;) for i in range(100)]
        responses = await asyncio.gather(*tasks)
        
        # 处理响应
        results = []
        for response in responses:
            results.append(await response.text())
        
        return results
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-6.320u6279u91CFu64CDu4F5C-478&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;6.3 批量操作&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;6.3 批量操作&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;async def batch_operations():
    # 而不是这样：
    # results = []
    # for item in items:
    #     result = await process_item(item)
    #     results.append(result)
    
    # 应该这样：
    tasks = [process_item(item) for item in items]
    results = await asyncio.gather(*tasks)
    return results
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-u4E03u3001u5E38u89C1u95EEu9898u89E3u7B54-494&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;七、常见问题解答&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;七、常见问题解答&lt;/h2&gt;&lt;h3 id=&quot;h3-Q13A20u5982u4F55u4ECEu540Cu6B65u4EE3u7801u8C03u7528u5F02u6B65u51FDu6570uFF1F-496&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;Q1: 如何从同步代码调用异步函数？&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;Q1: 如何从同步代码调用异步函数？&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def sync_wrapper():
    # 方法1: 使用asyncio.run（适用于简单脚本）
    result = asyncio.run(async_function())
    return result

# 方法2: 在已有事件循环中运行
def sync_in_loop():
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    try:
        result = loop.run_until_complete(async_function())
        return result
    finally:
        loop.close()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-Q23A20u5982u4F55u6B63u786Eu53D6u6D88u4EFBu52A1uFF1F-515&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;Q2: 如何正确取消任务？&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;Q2: 如何正确取消任务？&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;async def cancellable_task():
    try:
        await asyncio.sleep(10)
        print(&quot;任务正常完成&quot;)
        return &quot;success&quot;
    except asyncio.CancelledError:
        print(&quot;任务被取消，执行清理操作&quot;)
        raise  # 重新抛出异常

async def main():
    task = asyncio.create_task(cancellable_task())
    
    # 等待一段时间后取消
    await asyncio.sleep(2)
    task.cancel()
    
    try:
        await task
    except asyncio.CancelledError:
        print(&quot;任务已成功取消&quot;)

asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-Q33A20u5982u4F55u5904u7406u4EFBu52A1u4E2Du7684u5F02u5E38uFF1F-542&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;Q3: 如何处理任务中的异常？&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;Q3: 如何处理任务中的异常？&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;async def failing_task():
    await asyncio.sleep(1)
    raise ValueError(&quot;任务失败&quot;)

async def main():
    task = asyncio.create_task(failing_task())
    
    try:
        await task
    except ValueError as e:
        print(f&quot;捕获到异常: {e}&quot;)
        print(f&quot;任务异常: {task.exception()}&quot;)

asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-u5173u952Eu70B9-561&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;关键点&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;关键点&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;理解事件循环机制&lt;/strong&gt; - 这是异步编程的基础&lt;/li&gt;&lt;li&gt;&lt;strong&gt;正确使用async/await&lt;/strong&gt; - 避免阻塞调用&lt;/li&gt;&lt;li&gt;&lt;strong&gt;合理管理并发&lt;/strong&gt; - 使用信号量限制并发数&lt;/li&gt;&lt;li&gt;&lt;strong&gt;妥善处理错误&lt;/strong&gt; - 确保程序的稳定性&lt;/li&gt;&lt;li&gt;&lt;strong&gt;注意资源清理&lt;/strong&gt; - 防止资源泄漏&lt;/li&gt;&lt;/ol&gt;
&lt;/body&gt;</description><pubDate>Tue, 02 Sep 2025 15:12:53 +0800</pubDate></item><item><title>ssh: connect to host github.com port 22: Connection timed out</title><link>http://www.bloguan.com/?id=627</link><description>&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;github仓库可以网页打开，但git&amp;nbsp;无法使用&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;git&amp;nbsp;-c&amp;nbsp;diff.mnemonicprefix=false&amp;nbsp;-c&amp;nbsp;core.quotepath=false&amp;nbsp;--no-optional-locks&amp;nbsp;fetch&amp;nbsp;--tags&amp;nbsp;origin
ssh:&amp;nbsp;connect&amp;nbsp;to&amp;nbsp;host&amp;nbsp;github.com&amp;nbsp;port&amp;nbsp;22:&amp;nbsp;Connection&amp;nbsp;timed&amp;nbsp;out
fatal:&amp;nbsp;Could&amp;nbsp;not&amp;nbsp;read&amp;nbsp;from&amp;nbsp;remote&amp;nbsp;repository.
Please&amp;nbsp;make&amp;nbsp;sure&amp;nbsp;you&amp;nbsp;have&amp;nbsp;the&amp;nbsp;correct&amp;nbsp;access&amp;nbsp;rights
and&amp;nbsp;the&amp;nbsp;repository&amp;nbsp;exists.&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;方法1&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;VPN用户，查看git 全局代理&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;&amp;nbsp;git&amp;nbsp;config&amp;nbsp;--global&amp;nbsp;-l&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;我之前是配置了htts.proxy没用，发现加上http.proxy就好了，或者2者全加&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;git&amp;nbsp;config&amp;nbsp;--global&amp;nbsp;http.proxy&amp;nbsp;http://127.0.0.1:7897&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;方法2：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;修改ssh配置文件，无则新建&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;windows&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;C:\Users\&amp;lt;your name&amp;gt;\.ssh\config&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;linux&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;~/.ssh/config&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;Host&amp;nbsp;github.com
&amp;nbsp;&amp;nbsp;Hostname&amp;nbsp;ssh.github.com
&amp;nbsp;&amp;nbsp;User&amp;nbsp;git
&amp;nbsp;&amp;nbsp;Port&amp;nbsp;443
&amp;nbsp;&amp;nbsp;PreferredAuthentications&amp;nbsp;publickey
&amp;nbsp;&amp;nbsp;IdentityFile&amp;nbsp;~/.ssh/id_rsa&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;此处别忘了密钥要加到github里去，不会另找教程&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;添加完后使用命令测试&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;&amp;nbsp;&amp;nbsp;ssh&amp;nbsp;-T&amp;nbsp;git@ssh.github.com&amp;nbsp;-p&amp;nbsp;443&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;网上讲的方法2，对我无效，使用方法1后好了，但另一个仓库不行，再加上方法2后都可以访问。严重怀疑是github偷摸更新了啥，前些天一直都好好的&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 29 Aug 2025 10:24:50 +0800</pubDate></item><item><title>Linux 逻辑卷动态扩容</title><link>http://www.bloguan.com/?id=626</link><description>&lt;p&gt;起因：盘满了，发现分区只有100G， 但是物理盘有空间2T&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;http://www.bloguan.com/zb_users/upload/2025/06/202506031748944036570774.jpg&quot; style=&quot;&quot; title=&quot;Snipaste_2025-06-03_17-44-41.jpg&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;http://www.bloguan.com/zb_users/upload/2025/06/202506031748944036493511.jpg&quot; title=&quot;Snipaste_2025-06-03_17-45-51.jpg&quot; style=&quot;text-wrap: wrap;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;用卷组中所有可用空间来扩展逻辑卷&lt;/p&gt;&lt;p&gt;lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv&amp;nbsp;&lt;/p&gt;&lt;p&gt;对于ext4文件系统&lt;/p&gt;&lt;p&gt;resize2fs&amp;nbsp; /dev/mapper/ubuntu--vg-ubuntu--lv&amp;nbsp;&lt;/p&gt;&lt;p&gt;对于 xfs 文件系统&lt;/p&gt;&lt;p&gt;xfs_growfs /dev/mapper/ubuntu--vg-ubuntu--lv&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 03 Jun 2025 17:46:42 +0800</pubDate></item><item><title>adb connect 报 10061 解决方法</title><link>http://www.bloguan.com/?id=625</link><description>&lt;p&gt;先用有线连接&lt;/p&gt;&lt;p&gt;adb tcpip 5555&lt;/p&gt;&lt;p&gt;adb connect&amp;nbsp;手机ip:5555&lt;/p&gt;&lt;p&gt;拔线&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;http://www.bloguan.com/zb_users/upload/2025/04/202504241745486424272899.jpg&quot; title=&quot;Snipaste_2025-04-24_17-19-57.jpg&quot; alt=&quot;Snipaste_2025-04-24_17-19-57.jpg&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;另外，别忘在开发者模式里面开启“无线调试”&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 24 Apr 2025 17:16:46 +0800</pubDate></item><item><title>Windows 防火墙怎么开启端口</title><link>http://www.bloguan.com/?id=624</link><description>&lt;p&gt;以Windows11为例&lt;/p&gt;&lt;article data-content=&quot;[{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;3060-1621846615933&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;paragraph&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;style&amp;quot;:{}},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;p5PQ-1621846617594&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;此电脑-右键-属性-&amp;nbsp;隐私和安全性-Windows安全中心&amp;nbsp;(你也可以直接在开始菜单的搜索框里搜\&amp;quot;安全中心\&amp;quot;)&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}],&amp;quot;state&amp;quot;:{}}]&quot;&gt;&lt;div yne-bulb-block=&quot;paragraph&quot; style=&quot;white-space: pre-wrap; line-height: 1.75;&quot;&gt;此电脑-右键-属性- 隐私和安全性-Windows安全中心 (你也可以直接在开始菜单的搜索框里搜&amp;quot;安全中心&amp;quot;)&lt;/div&gt;&lt;/article&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;http://www.bloguan.com/zb_users/upload/2025/02/202502141739526226262308.jpg&quot; style=&quot;&quot; title=&quot;Snipaste_2025-02-14_17-35-29.jpg&quot;/&gt;&lt;/p&gt;&lt;p&gt;右键添加入站规则，类型选端口，后面填入端口后就所有下一步就行了&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;http://www.bloguan.com/zb_users/upload/2025/02/202502141739526226305988.jpg&quot; title=&quot;Snipaste_2025-02-14_17-40-37.jpg&quot; style=&quot;text-wrap: wrap;&quot;/&gt;&lt;/p&gt;</description><pubDate>Fri, 14 Feb 2025 17:43:05 +0800</pubDate></item><item><title>Docker 使用代理拉镜像</title><link>http://www.bloguan.com/?id=623</link><description>&lt;p&gt;DockerHub&amp;nbsp;访问非常慢，国内镜像源封杀干净，拉个镜像很费劲。&lt;/p&gt;&lt;p&gt;我的Windows电脑可以魔幻上网，所以把linux&amp;nbsp;中的docker添加代理，通过windows上网来拉取镜像&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;article data-content=&quot;[{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;3060-1621846615933&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;paragraph&amp;quot;,&amp;quot;data&amp;quot;:{},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;p5PQ-1621846617594&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;在&amp;nbsp;Linux&amp;nbsp;系统上为&amp;nbsp;Docker&amp;nbsp;配置网络代理以便执行&amp;nbsp;&amp;quot;,&amp;quot;marks&amp;quot;:[]},{&amp;quot;text&amp;quot;:&amp;quot;docker&amp;nbsp;pull&amp;quot;,&amp;quot;marks&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;backgroundColor&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;rgba(175,&amp;nbsp;184,&amp;nbsp;193,&amp;nbsp;0.2)&amp;quot;},{&amp;quot;type&amp;quot;:&amp;quot;fontSize&amp;quot;,&amp;quot;value&amp;quot;:13}]},{&amp;quot;text&amp;quot;:&amp;quot;&amp;nbsp;操作，可以通过创建或修改&amp;nbsp;systemd&amp;nbsp;服务文件来完成。以下是具体步骤：&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}],&amp;quot;state&amp;quot;:{}},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;MOCH-1739524377301&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;list-item&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;version&amp;quot;:1,&amp;quot;listId&amp;quot;:&amp;quot;czix-1739524377345&amp;quot;,&amp;quot;listLevel&amp;quot;:1,&amp;quot;listType&amp;quot;:&amp;quot;ordered&amp;quot;},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;kNrQ-1739524377300&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;创建目录（如果不存在）：&amp;nbsp;&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}],&amp;quot;state&amp;quot;:{&amp;quot;index&amp;quot;:1}},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;8Tsq-1739524377303&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;paragraph&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;version&amp;quot;:1},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;Lxcu-1739524377302&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;首先，确保存在用于存放&amp;nbsp;Docker&amp;nbsp;配置的目录。如果没有，请创建它。&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}],&amp;quot;state&amp;quot;:{}},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;9gPs-1739524377306&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;code&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;version&amp;quot;:1,&amp;quot;language&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;theme&amp;quot;:&amp;quot;default&amp;quot;},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;8aGs-1739524377305&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;code-line&amp;quot;,&amp;quot;data&amp;quot;:{},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;DkEz-1739524377304&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;sudo&amp;nbsp;mkdir&amp;nbsp;-p&amp;nbsp;/etc/systemd/system/docker.service.d&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}]}],&amp;quot;state&amp;quot;:{}},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;inXB-1739524377308&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;list-item&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;version&amp;quot;:1,&amp;quot;listId&amp;quot;:&amp;quot;czix-1739524377345&amp;quot;,&amp;quot;listLevel&amp;quot;:1,&amp;quot;listType&amp;quot;:&amp;quot;ordered&amp;quot;},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;kcYG-1739524377307&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;创建或编辑代理配置文件：&amp;nbsp;&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}],&amp;quot;state&amp;quot;:{&amp;quot;index&amp;quot;:2}},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;xMtU-1739524377310&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;paragraph&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;version&amp;quot;:1},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;dOO3-1739524377309&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;接下来，创建或编辑一个名为&amp;nbsp;&amp;quot;,&amp;quot;marks&amp;quot;:[]},{&amp;quot;text&amp;quot;:&amp;quot;http-proxy.conf&amp;quot;,&amp;quot;marks&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;backgroundColor&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;rgba(175,&amp;nbsp;184,&amp;nbsp;193,&amp;nbsp;0.2)&amp;quot;},{&amp;quot;type&amp;quot;:&amp;quot;fontSize&amp;quot;,&amp;quot;value&amp;quot;:13}]},{&amp;quot;text&amp;quot;:&amp;quot;&amp;nbsp;的文件在这个目录下，并添加你的代理服务器信息。&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}],&amp;quot;state&amp;quot;:{}},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;crs1-1739524377313&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;code&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;version&amp;quot;:1,&amp;quot;language&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;theme&amp;quot;:&amp;quot;default&amp;quot;},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;BJDN-1739524377312&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;code-line&amp;quot;,&amp;quot;data&amp;quot;:{},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;Vjh8-1739524377311&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;sudo&amp;nbsp;nano&amp;nbsp;/etc/systemd/system/docker.service.d/http-proxy.conf&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}]}],&amp;quot;state&amp;quot;:{}},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;RiHq-1739524377315&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;paragraph&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;version&amp;quot;:1},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;9CHM-1739524377314&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;在文件中输入如下内容，记得替换为你实际的代理服务器地址和端口：&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}],&amp;quot;state&amp;quot;:{}},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;xcNi-1739524558443&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;code&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;language&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;theme&amp;quot;:&amp;quot;default&amp;quot;,&amp;quot;wrap&amp;quot;:false},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;lqUz-1739524558442&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;code-line&amp;quot;,&amp;quot;data&amp;quot;:{},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;pJLk-1739524558441&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;[Service]&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}]},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;duSU-1739524559022&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;code-line&amp;quot;,&amp;quot;data&amp;quot;:{},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;SFJz-1739524559021&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;Environment=\&amp;quot;HTTP_PROXY=http://proxy.example.com:80/\&amp;quot;&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}]},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;Mgzl-1739524559024&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;code-line&amp;quot;,&amp;quot;data&amp;quot;:{},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;Vuvk-1739524559023&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;Environment=\&amp;quot;HTTPS_PROXY=https://proxy.example.com:443/\&amp;quot;&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}]},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;eVYF-1739524559026&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;code-line&amp;quot;,&amp;quot;data&amp;quot;:{},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;yXXI-1739524559025&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;Environment=\&amp;quot;NO_PROXY=localhost,127.0.0.1\&amp;quot;&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}]}],&amp;quot;state&amp;quot;:{}},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;8L04-1739524555302&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;paragraph&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;version&amp;quot;:1},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;j9nu-1739524555301&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;如果你的代理服务器需要认证，可以将用户名和密码包含在URL中，例如：&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}],&amp;quot;state&amp;quot;:{}},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;3mQV-1739524540440&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;code&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;language&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;theme&amp;quot;:&amp;quot;default&amp;quot;,&amp;quot;wrap&amp;quot;:false},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;yB3h-1739524540439&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;code-line&amp;quot;,&amp;quot;data&amp;quot;:{},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;2y2j-1739524540438&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;Environment=\&amp;quot;HTTP_PROXY=http://username:password@proxy.example.com:80/\&amp;quot;&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}]}],&amp;quot;state&amp;quot;:{}},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;L8QT-1739524377328&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;list-item&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;version&amp;quot;:1,&amp;quot;listId&amp;quot;:&amp;quot;czix-1739524377345&amp;quot;,&amp;quot;listLevel&amp;quot;:1,&amp;quot;listType&amp;quot;:&amp;quot;ordered&amp;quot;},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;kaXi-1739524377327&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;重新加载&amp;nbsp;systemd&amp;nbsp;并重启&amp;nbsp;Docker&amp;nbsp;服务：&amp;nbsp;&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}],&amp;quot;state&amp;quot;:{&amp;quot;index&amp;quot;:3}},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;iqEV-1739524377330&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;paragraph&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;version&amp;quot;:1},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;tUci-1739524377329&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;完成上述步骤后，运行以下命令以使更改生效：&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}],&amp;quot;state&amp;quot;:{}},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;jIC5-1739524377335&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;code&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;version&amp;quot;:1,&amp;quot;language&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;theme&amp;quot;:&amp;quot;default&amp;quot;},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;eRFS-1739524377332&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;code-line&amp;quot;,&amp;quot;data&amp;quot;:{},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;DLOj-1739524377331&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;sudo&amp;nbsp;systemctl&amp;nbsp;daemon-reload&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}]},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;Eth7-1739524377334&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;code-line&amp;quot;,&amp;quot;data&amp;quot;:{},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;MSsI-1739524377333&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;sudo&amp;nbsp;systemctl&amp;nbsp;restart&amp;nbsp;docker&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}]}],&amp;quot;state&amp;quot;:{}},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;fZmv-1739524377337&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;list-item&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;version&amp;quot;:1,&amp;quot;listId&amp;quot;:&amp;quot;czix-1739524377345&amp;quot;,&amp;quot;listLevel&amp;quot;:1,&amp;quot;listType&amp;quot;:&amp;quot;ordered&amp;quot;},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;KWT7-1739524377336&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;验证设置：&amp;nbsp;&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}],&amp;quot;state&amp;quot;:{&amp;quot;index&amp;quot;:4}},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;OnVk-1739524377339&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;paragraph&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;version&amp;quot;:1},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;h8ys-1739524377338&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;最后，你可以通过检查&amp;nbsp;Docker&amp;nbsp;服务的状态来确认代理是否已正确应用：&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}],&amp;quot;state&amp;quot;:{}},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;aL5J-1739524377342&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;code&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;version&amp;quot;:1,&amp;quot;language&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;theme&amp;quot;:&amp;quot;default&amp;quot;},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;cvKH-1739524377341&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;code-line&amp;quot;,&amp;quot;data&amp;quot;:{},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;ZgKO-1739524377340&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;systemctl&amp;nbsp;show&amp;nbsp;--property=Environment&amp;nbsp;docker&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}]}],&amp;quot;state&amp;quot;:{}},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;3Ogl-1739524377344&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;paragraph&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;version&amp;quot;:1},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;x9Hg-1739524377343&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;这应该会输出你之前设置的环境变量。&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}],&amp;quot;state&amp;quot;:{}},{&amp;quot;type&amp;quot;:&amp;quot;block&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;qnmj-1739524405611&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;paragraph&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;version&amp;quot;:1},&amp;quot;nodes&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;e28P-1739524405609&amp;quot;,&amp;quot;leaves&amp;quot;:[{&amp;quot;text&amp;quot;:&amp;quot;然后docker&amp;nbsp;pull&amp;nbsp;就会经过代理去拉取镜像&amp;quot;,&amp;quot;marks&amp;quot;:[]}]}],&amp;quot;state&amp;quot;:{}}]&quot;&gt;&lt;div yne-bulb-block=&quot;paragraph&quot;&gt;操作步骤&lt;/div&gt;&lt;div&gt;&lt;ol yne-block-type=&quot;list&quot; style=&quot;margin-left: 14px;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;创建目录（如果不存在）：&amp;nbsp;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div yne-bulb-block=&quot;paragraph&quot;&gt;首先，确保存在用于存放 Docker 配置的目录。如果没有，请创建它。&lt;/div&gt;&lt;div yne-bulb-block=&quot;code&quot; data-theme=&quot;default&quot; data-language=&quot;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;sudo&amp;nbsp;mkdir&amp;nbsp;-p&amp;nbsp;/etc/systemd/system/docker.service.d&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;ol start=&quot;2&quot; yne-block-type=&quot;list&quot; style=&quot;margin-left: 14px;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;创建或编辑代理配置文件：&amp;nbsp;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div yne-bulb-block=&quot;paragraph&quot;&gt;接下来，创建或编辑一个名为 http-proxy.conf 的文件在这个目录下，并添加你的代理服务器信息。&lt;/div&gt;&lt;div yne-bulb-block=&quot;code&quot; data-theme=&quot;default&quot; data-language=&quot;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;sudo&amp;nbsp;nano&amp;nbsp;/etc/systemd/system/docker.service.d/http-proxy.conf&lt;/pre&gt;&lt;/div&gt;&lt;div yne-bulb-block=&quot;paragraph&quot;&gt;在文件中输入如下内容，记得替换为你实际的代理服务器地址和端口：&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;[Service]&amp;nbsp;
Environment=&amp;quot;HTTP_PROXY=http://proxy.example.com:80/&amp;quot;
Environment=&amp;quot;HTTPS_PROXY=https://proxy.example.com:443/&amp;quot;&amp;nbsp;
Environment=&amp;quot;NO_PROXY=localhost,127.0.0.1&amp;quot;&lt;/pre&gt;&lt;div yne-bulb-block=&quot;paragraph&quot;&gt;如果你的代理服务器需要认证，可以将用户名和密码包含在URL中，例如：&lt;/div&gt;&lt;div yne-bulb-block=&quot;code&quot; data-theme=&quot;default&quot; data-language=&quot;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;Environment=&amp;quot;HTTP_PROXY=http://username:password@proxy.example.com:80/&amp;quot;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;ol start=&quot;3&quot; yne-block-type=&quot;list&quot; style=&quot;margin-left: 14px;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;重新加载 systemd 并重启 Docker 服务：&amp;nbsp;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div yne-bulb-block=&quot;paragraph&quot;&gt;完成上述步骤后，运行以下命令以使更改生效：&lt;/div&gt;&lt;div yne-bulb-block=&quot;code&quot; data-theme=&quot;default&quot; data-language=&quot;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;sudo&amp;nbsp;systemctl&amp;nbsp;daemon-reload
sudo&amp;nbsp;systemctl&amp;nbsp;restart&amp;nbsp;docker&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;ol start=&quot;4&quot; yne-block-type=&quot;list&quot; style=&quot;margin-left: 14px;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;验证设置：&amp;nbsp;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div yne-bulb-block=&quot;paragraph&quot;&gt;最后，你可以通过检查 Docker 服务的状态来确认代理是否已正确应用：&lt;/div&gt;&lt;div yne-bulb-block=&quot;code&quot; data-theme=&quot;default&quot; data-language=&quot;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;systemctl&amp;nbsp;show&amp;nbsp;--property=Environment&amp;nbsp;docke&lt;/pre&gt;&lt;/div&gt;&lt;div yne-bulb-block=&quot;paragraph&quot;&gt;这应该会输出你之前设置的环境变量。&lt;/div&gt;&lt;p&gt;然后docker pull 就会经过代理去拉取镜像&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;然后它就走了我的windows网络了&lt;/p&gt;&lt;/article&gt;&lt;p&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;img class=&quot;ue-image&quot; src=&quot;http://www.bloguan.com/zb_users/upload/2025/02/202502141739525114700267.jpg&quot; title=&quot;Snipaste_2025-02-14_17-24-09.jpg&quot; alt=&quot;Snipaste_2025-02-14_17-24-09.jpg&quot;/&gt;&lt;/p&gt;&lt;p&gt;注意你的魔幻上网工具，记得开启“允许局域网连接”，把代理的端口号允许通过防火墙，参考 &lt;a href=&quot;http://www.bloguan.com/?id=624&quot; target=&quot;_blank&quot;&gt;Windows如何开启端口&lt;/a&gt;&lt;/p&gt;</description><pubDate>Fri, 14 Feb 2025 17:16:27 +0800</pubDate></item><item><title>go 远程调试</title><link>http://www.bloguan.com/?id=622</link><description>&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;服务器上&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;go install github.com/go-delve/delve/cmd/dlv@latest&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;本地，使用GoLand&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;http://www.bloguan.com/zb_users/upload/2025/01/202501091736415556132674.jpg&quot; style=&quot;&quot; title=&quot;1.jpg&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;http://www.bloguan.com/zb_users/upload/2025/01/202501091736415556560266.jpg&quot; style=&quot;&quot; title=&quot;2.jpg&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;服务器上也放一份源码，在源码目录 ，编译&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;go build -gcflags &amp;quot;all=-N -l&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;两种启动方式&lt;/span&gt;&lt;br/&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;一。直接从本地启动&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;1. 服务器运行&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;dlv debug --headless --listen=:2345 --api-version=2 --accept-multiclient&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;2. goland 直接debug，注意提前打好断点&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;http://www.bloguan.com/zb_users/upload/2025/01/202501091736415556882306.jpg&quot; title=&quot;3.jpg&quot; style=&quot;text-wrap: wrap;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;缺点，程序带不了参数&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;二。从服务器启动&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;1.运行程序，等待连接调试器&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec ./demo.exe&amp;nbsp; 参数1 参数2&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;2. 同上，打好断点，直接debug，启动参数也有了&lt;/span&gt;&lt;/p&gt;&lt;p&gt;3.如果自己的参数有 - ，如 demo.exe -f hello&amp;nbsp; -b 200&amp;nbsp;之类的，&amp;nbsp;在demo.exe&amp;nbsp;后加 --&amp;nbsp;再接带-参数，否则会报错&lt;/p&gt;</description><pubDate>Thu, 09 Jan 2025 17:30:23 +0800</pubDate></item></channel></rss>