<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Containerization on Bill.Lin&#39;s Notes</title>
		<link>https://xinqilin.github.io/tags/containerization/</link>
		<description>Recent content in Containerization on Bill.Lin&#39;s Notes</description>
		<generator>Hugo</generator>
		<language>zh-tw</language>
		
		
		
		
			<lastBuildDate>Tue, 18 Jan 2022 23:56:44 +0800</lastBuildDate>
		
			<atom:link href="https://xinqilin.github.io/tags/containerization/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Docker MySQL：容器化部署與設定</title>
				<link>https://xinqilin.github.io/post/container/docker-mysql/</link>
				<pubDate>Tue, 18 Jan 2022 23:56:44 +0800</pubDate>
				<guid>https://xinqilin.github.io/post/container/docker-mysql/</guid>
				<description>&lt;h2 id=&#34;概述&#34;&gt;概述&lt;/h2&gt;&#xA;&lt;p&gt;在現代開發流程中，使用 Docker 部署資料庫已成為主流。將 MySQL 運行在 Docker 容器中，可以帶來許多好處：環境隔離、快速部署、版本控制、以及方便的遷移。這篇文章將引導您如何在 Docker 中設定和管理 MySQL 容器。&lt;/p&gt;&#xA;&lt;h2 id=&#34;啟動-mysql-容器&#34;&gt;啟動 MySQL 容器&lt;/h2&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;鏡像選擇&lt;/strong&gt;：&lt;code&gt;mysql/mysql-server&lt;/code&gt; 是 Oracle 的私有版本（不同於 Docker Hub 官方鏡像），現已標記為 deprecated。請使用官方 &lt;code&gt;mysql&lt;/code&gt; 鏡像（&lt;code&gt;docker.io/library/mysql&lt;/code&gt;）。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;使用 &lt;code&gt;docker run&lt;/code&gt; 指令可以快速啟動一個 MySQL 容器。以下是一個常用的範例，包含了密碼設定、埠映射和字元集設定。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    --name mysql-server &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    -e &lt;span class=&#34;nv&#34;&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;your_strong_password &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    -p 3306:3306 &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    -d &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    mysql:8.0 &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    --character-set-server&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;utf8mb4 &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    --collation-server&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;utf8mb4_unicode_ci &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    --skip-character-set-client-handshake&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h3 id=&#34;指令參數說明&#34;&gt;指令參數說明&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;--name mysql-server&lt;/code&gt;: 為容器指定一個易於識別的名稱，這裡命名為 &lt;code&gt;mysql-server&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;-e MYSQL_ROOT_PASSWORD=your_strong_password&lt;/code&gt;: 設定 MySQL &lt;code&gt;root&lt;/code&gt; 使用者的密碼。&lt;strong&gt;請務必將 &lt;code&gt;your_strong_password&lt;/code&gt; 替換為您自己的強密碼&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;-p 3306:3306&lt;/code&gt;: 將主機的 3306 埠映射到容器的 3306 埠。這樣您就可以從主機透過 3306 埠連接到容器內的 MySQL 服務。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;-d&lt;/code&gt;: 以背景模式 (detached mode) 運行容器，讓容器在背景執行。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;mysql:8.0&lt;/code&gt;: 指定要使用的 Docker 映像檔。使用 Docker Hub 官方 &lt;code&gt;mysql&lt;/code&gt; 鏡像。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;--character-set-server=utf8mb4&lt;/code&gt;: 設定 MySQL 伺服器的預設字元集為 &lt;code&gt;utf8mb4&lt;/code&gt;，以支援更廣泛的字元，包括表情符號。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;--collation-server=utf8mb4_unicode_ci&lt;/code&gt;: 設定伺服器的預設排序規則為 &lt;code&gt;utf8mb4_unicode_ci&lt;/code&gt;，這是一種不區分大小寫和重音的排序規則。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;--skip-character-set-client-handshake&lt;/code&gt;: 禁用客戶端字元集握手。這有助於確保客戶端和伺服器之間的字元集一致性，避免亂碼問題。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;字元集設定的等效配置&#34;&gt;字元集設定的等效配置&lt;/h3&gt;&#xA;&lt;p&gt;上述字元集相關的 &lt;code&gt;docker run&lt;/code&gt; 參數，在 MySQL 的配置檔 (&lt;code&gt;my.cnf&lt;/code&gt;) 中，等效於以下設定：&lt;/p&gt;</description>
			</item>
			<item>
				<title>Docker Compose 完整指南：多容器應用程式的定義與執行</title>
				<link>https://xinqilin.github.io/post/container/docker-compose/</link>
				<pubDate>Mon, 26 Jul 2021 02:21:13 +0800</pubDate>
				<guid>https://xinqilin.github.io/post/container/docker-compose/</guid>
				<description>&lt;h2 id=&#34;概述&#34;&gt;概述&lt;/h2&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;版本說明&lt;/strong&gt;：&lt;code&gt;docker-compose&lt;/code&gt;（帶連字號，v1 Python 實作）自 2023 年 7 月已停止維護（EOL）。現行版本為 &lt;code&gt;docker compose&lt;/code&gt;（空格，v2 Go 實作，已整合進 Docker Desktop 與 Docker Engine）。本文使用 &lt;code&gt;docker compose&lt;/code&gt; 指令。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;在現代應用程式開發中，一個專案往往由多個服務組成，例如前端、後端 API、資料庫、快取等。這些服務各自運行在不同的容器中，而 Docker Compose 正是為了解決這種多容器應用程式的定義與管理而生。&lt;/p&gt;&#xA;&lt;p&gt;Docker Compose 允許您使用一個 YAML 檔案 (&lt;code&gt;docker-compose.yml&lt;/code&gt;) 來定義應用程式的所有服務、網路和儲存卷，然後透過單一指令啟動、停止或管理整個應用程式堆疊。這極大地簡化了開發、測試和部署的流程。&lt;/p&gt;&#xA;&lt;h2 id=&#34;常用-docker-compose-指令&#34;&gt;常用 Docker Compose 指令&lt;/h2&gt;&#xA;&lt;p&gt;以下是 Docker Compose 的一些常用指令，用於管理您的多容器應用程式：&lt;/p&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 compose version&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;顯示 Docker Compose 的版本資訊。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;docker compose version&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 compose --help&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;顯示 Docker Compose 的幫助訊息。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;docker compose --help&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 compose up&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 compose up&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 compose up -d&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;在背景模式 (detached mode) 啟動並建立所有服務的容器。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;docker compose up -d&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 compose down&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 compose down&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 compose exec &amp;lt;service_name&amp;gt; &amp;lt;command&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 compose exec microService /bin/bash&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 compose ps&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 compose ps&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 compose top&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 compose top&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 compose logs &amp;lt;service_name&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 compose logs microService&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 compose config&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;驗證 &lt;code&gt;docker-compose.yml&lt;/code&gt; 檔案的語法是否正確，並顯示解析後的配置。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;docker compose config&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 compose config -q&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 compose config -q&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 compose restart &amp;lt;service_name&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 compose restart microService&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 compose start &amp;lt;service_name&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 compose start microService&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 compose stop &amp;lt;service_name&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 compose stop microService&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;常用組合指令&#34;&gt;常用組合指令&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 驗證配置後，停止並重新啟動所有服務&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose config -q &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker compose down &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker compose up -d&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h2 id=&#34;docker-composeyml-檔案結構詳解&#34;&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; 檔案結構詳解&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; 是 Docker Compose 的核心配置檔案，它使用 YAML 語法來定義應用程式的服務。&lt;/p&gt;</description>
			</item>
			<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>
			<item>
				<title>Dockerfile 基礎：建構 Docker 映像檔的核心指令</title>
				<link>https://xinqilin.github.io/post/container/dockerfile-basic/</link>
				<pubDate>Sat, 24 Jul 2021 02:21:13 +0800</pubDate>
				<guid>https://xinqilin.github.io/post/container/dockerfile-basic/</guid>
				<description>&lt;h2 id=&#34;概述&#34;&gt;概述&lt;/h2&gt;&#xA;&lt;p&gt;Dockerfile 是一個包含一系列指令的文字檔案，Docker 引擎會讀取這些指令，並自動建構出 Docker 映像檔 (Image)。它定義了映像檔的內容、運行環境以及啟動時執行的指令。理解 Dockerfile 是掌握 Docker 容器化技術的關鍵一步。&lt;/p&gt;&#xA;&lt;h2 id=&#34;dockerfile-核心指令詳解&#34;&gt;Dockerfile 核心指令詳解&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-基礎指令&#34;&gt;1. 基礎指令&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;FROM&lt;/code&gt;：指定基礎映像檔。Dockerfile 的第一條指令必須是 &lt;code&gt;FROM&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;語法&lt;/strong&gt;：&lt;code&gt;FROM &amp;lt;image&amp;gt;[:&amp;lt;tag&amp;gt;]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;範例&lt;/strong&gt;：&lt;code&gt;FROM ubuntu:18.04&lt;/code&gt; (使用 Ubuntu 18.04 作為基礎映像檔)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：如果未指定 &lt;code&gt;tag&lt;/code&gt;，預設為 &lt;code&gt;latest&lt;/code&gt;。建議明確指定版本，以確保建構的可重複性。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;MAINTAINER&lt;/code&gt;：指定映像檔的維護者資訊。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;語法&lt;/strong&gt;：&lt;code&gt;MAINTAINER &amp;lt;name&amp;gt; [email]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;範例&lt;/strong&gt;：&lt;code&gt;MAINTAINER Bill.Lin &amp;lt;zzx123bill@gmail.com&amp;gt;&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：此指令已過時，建議使用 &lt;code&gt;LABEL&lt;/code&gt; 指令來替代，例如 &lt;code&gt;LABEL maintainer=&amp;quot;Bill.Lin &amp;lt;zzx123bill@gmail.com&amp;gt;&amp;quot;&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;2-執行指令&#34;&gt;2. 執行指令&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;RUN&lt;/code&gt;：在建構映像檔時執行命令。每個 &lt;code&gt;RUN&lt;/code&gt; 指令都會在映像檔中建立一個新的層 (layer)。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;語法&lt;/strong&gt;：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;RUN &amp;lt;command&amp;gt;&lt;/code&gt; (shell 模式，預設使用 &lt;code&gt;/bin/sh -c&lt;/code&gt; 執行)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;RUN [&amp;quot;executable&amp;quot;, &amp;quot;param1&amp;quot;, &amp;quot;param2&amp;quot;]&lt;/code&gt; (exec 模式，直接執行可執行檔)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;範例 (shell 模式)&lt;/strong&gt;：&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-dockerfile&#34; data-lang=&#34;dockerfile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;RUN&lt;/span&gt; apt-get update -y &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get install nginx -y&lt;span class=&#34;err&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：使用 &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; 將多個命令串聯起來，可以減少映像檔層數，優化映像檔大小。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;範例 (exec 模式)&lt;/strong&gt;：&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-dockerfile&#34; data-lang=&#34;dockerfile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;RUN&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;./test.php&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;dev&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;offline&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# 等同於在容器內執行 `./test.php dev offline`&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;CMD&lt;/code&gt;：設定容器啟動時預設執行的命令。如果 &lt;code&gt;docker run&lt;/code&gt; 命令後帶有參數，&lt;code&gt;CMD&lt;/code&gt; 的命令會被覆蓋。一個 Dockerfile 中只能有一個 &lt;code&gt;CMD&lt;/code&gt;，多個 &lt;code&gt;CMD&lt;/code&gt; 只有最後一個生效。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
