<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Host on Bill.Lin&#39;s Notes</title>
		<link>https://xinqilin.github.io/tags/host/</link>
		<description>Recent content in Host on Bill.Lin&#39;s Notes</description>
		<generator>Hugo</generator>
		<language>zh-tw</language>
		
		
		
		
			<lastBuildDate>Mon, 26 Jul 2021 02:21:13 +0800</lastBuildDate>
		
			<atom:link href="https://xinqilin.github.io/tags/host/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Docker 網路模式詳解：容器間通訊與外部連接</title>
				<link>https://xinqilin.github.io/post/container/docker-network/</link>
				<pubDate>Mon, 26 Jul 2021 02:21:13 +0800</pubDate>
				<guid>https://xinqilin.github.io/post/container/docker-network/</guid>
				<description>&lt;h2 id=&#34;概述&#34;&gt;概述&lt;/h2&gt;&#xA;&lt;p&gt;Docker 網路是容器化應用程式的基石，它決定了容器如何與外部世界通訊，以及容器之間如何互相連接。理解 Docker 的網路模式對於建構穩健、可擴展的容器化應用程式至關重要。本文將詳細介紹 Docker 提供的幾種主要網路模式及其應用場景。&lt;/p&gt;&#xA;&lt;h2 id=&#34;docker-網路模式&#34;&gt;Docker 網路模式&lt;/h2&gt;&#xA;&lt;p&gt;Docker 提供了多種網路驅動程式，每種驅動程式都提供不同的網路功能。最常用的包括 &lt;code&gt;bridge&lt;/code&gt;、&lt;code&gt;host&lt;/code&gt;、&lt;code&gt;none&lt;/code&gt; 和 &lt;code&gt;container&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-bridge-橋接模式&#34;&gt;1. Bridge (橋接模式)&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;說明&lt;/strong&gt;：這是 Docker 的預設網路模式。當您不指定網路模式時，Docker 會自動為容器分配一個 IP 位址，並將其連接到一個名為 &lt;code&gt;docker0&lt;/code&gt; 的虛擬橋接器上。每個容器都會獲得一個獨立的網路堆疊。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;工作原理&lt;/strong&gt;：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Docker 會在主機上建立一個名為 &lt;code&gt;docker0&lt;/code&gt; 的虛擬橋接器。&lt;/li&gt;&#xA;&lt;li&gt;每個容器都會建立一對虛擬乙太網卡 (veth pair)，其中一端連接到容器內的 &lt;code&gt;eth0&lt;/code&gt;，另一端連接到 &lt;code&gt;docker0&lt;/code&gt; 橋接器。&lt;/li&gt;&#xA;&lt;li&gt;容器可以透過 &lt;code&gt;docker0&lt;/code&gt; 橋接器與同一橋接器上的其他容器通訊，也可以透過主機的網路介面與外部網路通訊。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;優點&lt;/strong&gt;：提供良好的隔離性，容器間預設不直接暴露埠。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;缺點&lt;/strong&gt;：容器需要透過埠映射才能從外部訪問。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;2-host-主機模式&#34;&gt;2. Host (主機模式)&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;說明&lt;/strong&gt;：在主機模式下，容器不會有自己的獨立網路堆疊，而是直接使用主機的網路堆疊。這意味著容器會直接使用主機的 IP 位址和埠。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;工作原理&lt;/strong&gt;：容器內的應用程式會直接綁定到主機的網路介面和埠上。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;優點&lt;/strong&gt;：網路效能最佳，因為沒有額外的網路層。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;缺點&lt;/strong&gt;：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;容器不再與主機隔離，容器內應用程式使用的埠不能與主機上已佔用的埠衝突。&lt;/li&gt;&#xA;&lt;li&gt;安全性較低，因為容器直接暴露在主機網路中。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;使用方式&lt;/strong&gt;：&lt;code&gt;--network host&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;3-none-無網路模式&#34;&gt;3. None (無網路模式)&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;說明&lt;/strong&gt;：在無網路模式下，容器會建立一個獨立的網路堆疊，但不會對其進行任何網路配置。容器將沒有網路介面，無法與外部通訊。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;工作原理&lt;/strong&gt;：容器只包含一個 &lt;code&gt;lo&lt;/code&gt; (loopback) 介面。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;優點&lt;/strong&gt;：適用於只需要計算資源而不需要網路連接的特殊場景，或者需要手動配置網路的進階情況。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;缺點&lt;/strong&gt;：容器無法進行任何網路通訊，除非手動配置。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;使用方式&lt;/strong&gt;：&lt;code&gt;--network none&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;4-container-容器模式&#34;&gt;4. Container (容器模式)&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;說明&lt;/strong&gt;：在容器模式下，新建立的容器不會有自己的網路堆疊，而是與另一個已存在的容器共享其網路堆疊。這意味著兩個容器會共享同一個 IP 位址和埠空間。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;工作原理&lt;/strong&gt;：兩個容器共享同一個網路命名空間。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;優點&lt;/strong&gt;：適用於需要緊密協同工作的應用程式，例如主應用程式容器和一個代理或日誌收集容器。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;缺點&lt;/strong&gt;：兩個容器會共享埠，可能導致埠衝突。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;使用方式&lt;/strong&gt;：&lt;code&gt;--network container:&amp;lt;name_or_id&amp;gt;&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;常用-docker-網路指令&#34;&gt;常用 Docker 網路指令&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: left&#34;&gt;指令&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: left&#34;&gt;說明&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: left&#34;&gt;範例&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;docker network ls&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;列出所有 Docker 網路。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;docker network ls&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;docker network prune&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;刪除所有未使用的網路。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;docker network prune&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;docker network inspect &amp;lt;network_name_or_id&amp;gt;&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;顯示指定網路的詳細資訊，包括連接到該網路的容器。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;docker network inspect bridge&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;docker inspect &amp;lt;container_id&amp;gt;&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;顯示指定容器的詳細資訊，包括其網路配置。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;docker inspect &amp;lt;container_id&amp;gt;&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;自訂網路-user-defined-bridge-networks&#34;&gt;自訂網路 (User-defined Bridge Networks)&lt;/h2&gt;&#xA;&lt;p&gt;雖然 Docker 預設的 &lt;code&gt;bridge&lt;/code&gt; 網路 (&lt;code&gt;docker0&lt;/code&gt;) 已經足夠應付許多情況，但強烈建議您建立&lt;strong&gt;自訂橋接網路 (User-defined Bridge Networks)&lt;/strong&gt;。自訂網路提供了更好的隔離性、內建的 DNS 解析和更靈活的配置。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
