<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Docker on Vertsineu's Blog</title><link>https://blog.vertsineu.top/tags/docker/</link><description>Recent content in Docker on Vertsineu's Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 17 Apr 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://blog.vertsineu.top/tags/docker/index.xml" rel="self" type="application/rss+xml"/><item><title>如何给 Docker 配置透明代理</title><link>https://blog.vertsineu.top/posts/docker-proxy/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0800</pubDate><guid>https://blog.vertsineu.top/posts/docker-proxy/</guid><description>&lt;h2 id="loc-1"&gt;前言&lt;/h2&gt;
&lt;p&gt;通常，代理通常有两种方式，一种是开放端口，让需要代理的应用&lt;strong&gt;主动&lt;/strong&gt;通过暴露的端口被代理访问远程服务；一种是使用 tun mode，即虚拟网卡模式，所有流量都会被虚拟网卡设备拦截从而&lt;strong&gt;被动&lt;/strong&gt;代理访问远程服务。&lt;/p&gt;
&lt;p&gt;对我来说，我并不希望在我的服务器上采取被动方式，因为它会对服务器上的所有应用产生影响，而且一旦代理软件崩溃退出，我将无法访问互联网，而且会影响比如 ping 等工具的执行（拦截 ICMP 数据包），这是极其不好的，因此平时在我的服务器上，我更倾向于使用主动方式，只有应用需要被代理才会主动去访问代理端口。&lt;/p&gt;
&lt;p&gt;说是主动，也并不完全主动，无非就是设置环境变量：&lt;/p&gt;
&lt;div class="typst-raw-block"&gt;
&lt;pre&gt;&lt;code data-lang="bash"&gt;&lt;span style="color: #d73948"&gt;export&lt;/span&gt; http_proxy&lt;span style="color: #d73948"&gt;=&lt;/span&gt;&lt;span style="color: #198810"&gt;http://127.0.0.1:7890&lt;/span&gt;&lt;br&gt;&lt;span style="color: #d73948"&gt;export&lt;/span&gt; https_proxy&lt;span style="color: #d73948"&gt;=&lt;/span&gt;&lt;span style="color: #198810"&gt;http://127.0.0.1:7890&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;但是，对于 Docker 来说，通过设置环境变量的方式来配置代理会非常麻烦，如果不使用 docker compose，每次运行 docker run 的时候都需要输入长长的一串环境变量；如果使用 docker compose，要修改的部分也非常多，如下所示：&lt;/p&gt;
&lt;div class="typst-raw-block"&gt;
&lt;pre&gt;&lt;code data-lang="yaml"&gt;&lt;span style="color: #4b69c6"&gt;services&lt;/span&gt;:&lt;br&gt; &lt;span style="color: #4b69c6"&gt;app&lt;/span&gt;:&lt;br&gt; &lt;span style="color: #4b69c6"&gt;image&lt;/span&gt;: &lt;span style="color: #198810"&gt;my-app&lt;/span&gt;&lt;br&gt; &lt;span style="color: #4b69c6"&gt;environment&lt;/span&gt;:&lt;br&gt; - &lt;span style="color: #198810"&gt;HTTP_PROXY=http://host.docker.internal:7890&lt;/span&gt;&lt;br&gt; - &lt;span style="color: #198810"&gt;HTTPS_PROXY=http://host.docker.internal:7890&lt;/span&gt;&lt;br&gt; - &lt;span style="color: #198810"&gt;NO_PROXY=localhost,127.0.0.1&lt;/span&gt;&lt;br&gt; &lt;span style="color: #4b69c6"&gt;extra_hosts&lt;/span&gt;:&lt;br&gt; - &lt;span style="color: #198810"&gt;"&lt;/span&gt;&lt;span style="color: #198810"&gt;host.docker.internal:host-gateway&lt;/span&gt;&lt;span style="color: #198810"&gt;"&lt;/span&gt; &lt;span style="color: #74747c"&gt;#&lt;/span&gt;&lt;span style="color: #74747c"&gt; only for linux&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;除此之外，使用主动代理还有其他弊端：&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果 docker compose 中有多个 service，你可能需要花费功夫判断哪些 service 需要代理，哪些不需要代理。&lt;/li&gt;
&lt;li&gt;如果镜像中的应用不支持通过环境变量配置代理，那么以上配置就完全无效了。&lt;/li&gt;
&lt;li&gt;最重要的，在 docker build 的过程中，Docker 会起一个临时容器来运行 dockerfile 中的命令，而在这个过程中，如果没有配置代理或镜像，那么一些基本的命令，比如 &lt;span class="typst-raw-inline"&gt;&lt;code&gt;apt update&lt;/code&gt;&lt;/span&gt;、&lt;span class="typst-raw-inline"&gt;&lt;code&gt;apt install&lt;/code&gt;&lt;/span&gt; 以及 &lt;span class="typst-raw-inline"&gt;&lt;code&gt;pip install&lt;/code&gt;&lt;/span&gt; 等等，就会导致镜像构建缓慢，非常折磨人，而在 dockerfile 中配置代理也是一个非常麻烦的事情，很多时候都是发现 docker build 执行缓慢或者失败的时候才想到要配置代理，浪费大把时间。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;</description></item></channel></rss>