<?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 omegaatt</title>
    <link>https://www.omegaatt.com/tags/docker/</link>
    <description>Recent content in Docker on omegaatt</description>
    <generator>Hugo -- 0.147.7</generator>
    <language>zh-TW</language>
    <managingEditor>raiven.kao@gmail.com (Raiven Kao)</managingEditor>
    <webMaster>raiven.kao@gmail.com (Raiven Kao)</webMaster>
    <copyright>Raiven Kao 2020 - 2026</copyright>
    <lastBuildDate>Wed, 14 Jan 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.omegaatt.com/tags/docker/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Container Image Optimization 那些年我們寫錯的 Dockerfile</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/container_image_optimization/</link>
      <pubDate>Wed, 14 Jan 2026 00:00:00 +0000</pubDate><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <guid>https://www.omegaatt.com/blogs/develop/2026/container_image_optimization/</guid>
      <description>&lt;p&gt;最近在檢視公司內部的專案時，針對其中一個 container image 進行了優化。在一個簡單的 commit 後，我們的 image size 從 &lt;strong&gt;1.82GB&lt;/strong&gt; 修正到了 &lt;strong&gt;1.18GB&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;透過 &lt;a href=&#34;https://github.com/wagoodman/dive&#34;&gt;dive&lt;/a&gt; 查看，Image Efficiency 更是從不及格的 &lt;strong&gt;69%&lt;/strong&gt; 飆升到了 &lt;strong&gt;99%&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;這讓我回想起過去寫 Dockerfile 時，常常因為不了解 Docker Layer 的機制，或是為了寫起來「方便」，而踩到了許多效能與安全的地雷。&lt;/p&gt;
&lt;h2 id=&#34;致命的-chown&#34;&gt;致命的 &lt;code&gt;chown&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;這次優化的核心，其實源自於一個非常常見的操作：修改檔案權限。&lt;/p&gt;
&lt;p&gt;在我們的案例中，Dockerfile 原本是這樣寫的：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-dockerfile&#34; data-lang=&#34;dockerfile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Bad Practice: recursive chown after copy&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; ubuntu:22.04&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;WORKDIR&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; /app&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;COPY&lt;/span&gt; . .&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ... install dependencies ...&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RUN&lt;/span&gt; dpkg -i packages/*.deb&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Change ownership for security reasons&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RUN&lt;/span&gt; groupadd -r appuser &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; useradd -r -g appuser appuser&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RUN&lt;/span&gt; chown -R appuser:appuser /app&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;看起來邏輯很正確：把檔案複製進去，安裝套件，最後為了安全性將檔案權限交給非 root 使用者。&lt;/p&gt;</description>
    </item>
    <item>
      <title>告別 Docker Desktop 束縛！macOS 容器實戰：colima &#43; k8s &#43; containerd 踩坑遷移全記錄</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/colima_docker_alternative_on_macos/</link>
      <pubDate>Sat, 19 Apr 2025 00:00:00 +0000</pubDate><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <guid>https://www.omegaatt.com/blogs/develop/2025/colima_docker_alternative_on_macos/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;身為一個開發者，特別是在 macOS 環境下，Docker Desktop 幾乎是容器化開發的標配。然而，自從 Docker Desktop 開始針對大型企業調整其&lt;a href=&#34;https://www.ithome.com.tw/news/146537&#34;&gt;授權模式&lt;/a&gt;後，許多開發者開始尋找替代方案。&lt;/p&gt;
&lt;p&gt;市面上確實出現了一些選擇，例如閉源但功能強大的 &lt;a href=&#34;https://orbstack.dev/&#34;&gt;OrbStack&lt;/a&gt;。但對於熱愛開源的我來說，目光自然投向了社群。這時，&lt;a href=&#34;https://github.com/abiosoft/colima&#34;&gt;colima&lt;/a&gt; 這個開源專案進入了我的視野。它不僅提供了一個在 macOS 上運行 Linux 容器的輕量級方式，還內建了 Kubernetes 支援，引起了我極大的興趣。&lt;/p&gt;
&lt;p&gt;這篇文章，想記錄一下我從 Docker Desktop 轉換到 colima，並且在 colima 的 Kubernetes 環境中，從原本依賴 Docker Engine 逐步遷移到使用 containerd 作為容器執行時（Container Runtime）的心路歷程與踩坑經驗。&lt;/p&gt;
&lt;h2 id=&#34;lima-與-colima-簡介&#34;&gt;lima 與 colima 簡介&lt;/h2&gt;
&lt;p&gt;在深入 colima 之前，得先提一下 &lt;a href=&#34;https://github.com/lima-vm/lima&#34;&gt;lima (Linux virtual machines on macOS)&lt;/a&gt;。lima 是一個旨在於 macOS 上輕鬆運行 Linux 虛擬機的開源專案。它底層利用了 macOS 的虛擬化框架（如 QEMU 或更高效的 &lt;code&gt;vz&lt;/code&gt;），提供了一個相對輕量的 Linux VM 環境。&lt;/p&gt;
&lt;p&gt;而 colima 則可以看作是建立在 lima 之上的「使用者友善層」。它簡化了 lima 的配置，並專注於提供容器執行時環境。colima 可以讓你輕鬆地啟動一個配置好 Docker 或 containerd 的 Linux VM，並且可以選擇性地啟用 Kubernetes (K3s) 支援。簡單來說，colima 幫你處理了建立 VM、安裝 Runtime 等繁瑣步驟，讓你專注在容器本身。&lt;/p&gt;</description>
    </item>
    <item>
      <title>建構多平台的 container image</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/building_multiple_platform_container_image/</link>
      <pubDate>Sun, 30 Mar 2025 00:00:00 +0000</pubDate><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <guid>https://www.omegaatt.com/blogs/develop/2025/building_multiple_platform_container_image/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;最近在搞 side project 時，常常需要在不同的 CPU 架構上跑我的應用程式。例如，開發用的 MacBook 是 ARM 架構 (Apple Silicon)，開發用的 Desktop 是 x86 架構（Ryzen 5900X），而部署的伺服器可能是 x86 (AMD64)，有時候甚至想在 Raspberry Pi (ARM) 上跑些小東西。每次都要為不同平台分別建構 image 實在有點麻煩，而且 Registry 上一堆 &lt;code&gt;xxxapp-amd64&lt;/code&gt;, &lt;code&gt;xxxapp-arm64&lt;/code&gt; 的 tag 看了也很礙眼。經過一番研究與嘗試，是時候接觸 Docker Buildx 了。&lt;/p&gt;
&lt;h2 id=&#34;為什麼需要多平台映像檔&#34;&gt;為什麼需要多平台映像檔&lt;/h2&gt;
&lt;p&gt;在 wintel 的商業策略下，以及大家對高性能伺服器的普遍認知，主要用 x86/amd64，但現在 ARM 架構越來越普及，從 Apple Silicon 的 Mac、AWS Graviton 處理器、各種 IoT 設備到你的 Raspberry Pi，ARM 無所不在。如果你的 container image 只支援 amd64，那它就無法在這些 ARM 設備上原生運行 (需要模擬，效能差)。為了&lt;a href=&#34;https://en.wikipedia.org/wiki/Write_once,_run_anywhere&#34;&gt;Build Once, Run Anywhere&lt;/a&gt;，多平台映像檔 (Multi-platform images) 就是 meta。&lt;/p&gt;
&lt;h2 id=&#34;oci-多平台映像檔架構簡述&#34;&gt;OCI 多平台映像檔架構簡述&lt;/h2&gt;
&lt;p&gt;其實不複雜。傳統的單一平台 image，它的 manifest 指向一組設定檔和一堆 layer。而多平台 image 則是透過一個 manifest list (索引) 指向多個特定平台的 manifest。每個特定平台的 manifest 才各自指向該平台的設定檔和 layer。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Never Install Locally？試試 Dev Container</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/dev_container/</link>
      <pubDate>Sat, 01 Mar 2025 00:00:00 +0000</pubDate><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <guid>https://www.omegaatt.com/blogs/develop/2025/dev_container/</guid>
      <description>&lt;p&gt;最近換了新工作，到了一間資訊安全公司，讓我更加重視開發環境的安全。&lt;/p&gt;
&lt;p&gt;還記得之前分享過&lt;a href=&#34;https://www.omegaatt.com/blogs/develop/2024/two_distrobox_use_case&#34;&gt;透過 Distrobox 解決 Linux 環境依賴問題&lt;/a&gt;，用他來解決不同 Linux distribution 的依賴關係，背後即是讓程式跑在 container 內。&lt;/p&gt;
&lt;p&gt;既然能夠將應用程式一來透過 container，與 Host OS 本身做出區隔，那麼我們也能透過 container 來對開發的依賴做出隔離。於是，開始擁抱 Dev Container，一個能讓我更安心、更有效率（？）的開發環境。&lt;/p&gt;
&lt;h2 id=&#34;什麼是-dev-container&#34;&gt;什麼是 Dev Container？&lt;/h2&gt;
&lt;p&gt;簡單來說，Dev Container 就是把開發環境「容器化」。我們可以把所有需要的工具、函式庫、設定檔都放在一個 Docker Image 裡，然後用這個 Image 啟動一個 Container 作為你的開發環境。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Consistency (一致性)： 不管是在哪台機器上開發，只要有 Docker，就能保證開發環境完全一致。再也不用擔心「在我這台電腦上可以跑啊！」這種崩潰的狀況發生。&lt;/li&gt;
&lt;li&gt;Isolation (隔離性)： Dev Container 與本機系統完全隔離，可以避免各種依賴衝突，也能保護系統安全。&lt;/li&gt;
&lt;li&gt;Reproducibility (可重現性)： 透過 Dockerfile，你可以完整記錄你的開發環境設定，方便團隊協作和版本控制。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;為什麼需要-dev-container&#34;&gt;為什麼需要 Dev Container？&lt;/h2&gt;
&lt;p&gt;身為一個&lt;strong&gt;資安從業人員&lt;/strong&gt;，Dev Container 解決了以下痛點：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;不同版本的 Node 環境，告別 &lt;code&gt;nvm&lt;/code&gt;！需要 node14, node16, node18 或是 stable 版本，隨時產生開發環境。&lt;/li&gt;
&lt;li&gt;需要下載 malware 到本地進行 e2e 測試，透過 container 進行蛤蜊（🦪意象），盡可能避免破壞系統安全性。&lt;/li&gt;
&lt;li&gt;在 macOS 上解決一些只支援 linux 的 binary，或是在 arm64 host 上透過 rosetta2 模擬 x86_64 環境，進而執行 amd64 執行檔。&lt;/li&gt;
&lt;li&gt;使用 rootless 模式，在危機四伏的 npm 環境中，確保開發環境的安全性。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;我的-dev-container-工作流&#34;&gt;我的 Dev Container 工作流&lt;/h2&gt;
&lt;p&gt;我將 dev-container 放在 github &lt;a href=&#34;https://github.com/omegaatt36/lab/tree/main/dev-container&#34;&gt;omegaatt36/lab/dev-container&lt;/a&gt; 中，以下 demo 僅「目前版本」，會依據使用情境進行迭代。&lt;/p&gt;</description>
    </item>
    <item>
      <title>如何不啟動 container 從 image 中提取可執行檔</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/extract_executable_from_docker_image/</link>
      <pubDate>Sun, 14 Apr 2024 00:00:00 +0000</pubDate><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <guid>https://www.omegaatt.com/blogs/develop/2024/extract_executable_from_docker_image/</guid>
      <description>&lt;p&gt;::: info
雖然文章內大多指令都是使用 docker，但由於是標準的 OCI image，使用 Podman 也是一樣的效果。
:::&lt;/p&gt;
&lt;p&gt;某段時間內，我會將所有需要執行的 binary 使用 containerize 給打包起來執行，例如：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;需要將前端環境給跑起來，我會啟動一個 node 環境的 container:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run --rm -it --name f2e --net&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;host -v &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;pwd&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;:/app &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    docker.io/library/node:20-bookworm &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;需要安裝某個基於 golang 的 cli 工具，會使用&lt;a href=&#34;https://gist.github.com/omegaatt36/487d643aca6443f9524eed2975cbd746&#34;&gt;自己寫的腳本&lt;/a&gt;，在 container 內進行建構。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;需要透過 Liquibase 來進行 db migration，並不會選擇在本地安裝 maven 環境，一樣是啟動一個 container 來執行。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這麼做的好處是，「目前」大多數的 server/cli tools 至少會編譯 x86 架構下的可執行檔，我只需要確保 container 環境內可以工作，就可以在不同硬體的開發環境下游走。極度偏激的來說，無法確保安裝的 binary 有沒有受過污染，無論開源或閉源與否，也可以透過 Podman 來啟動 rootless 的 container 確保本機的安全。&lt;/p&gt;
&lt;p&gt;但有時候會遇到別人打包的 image 十分肥大，即便程式可執行檔只需要幾 MB，編譯後的 image 確有幾百 MB（大多數是腳本語言），蒙生了從 image 中提取 executable 的想法，藉此也學習 docker layer 間的關係。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Logitech Media Server 遷移紀錄：從 Bare Metal 到 Docker 再到 Podman</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/logitech_media_server_migration/</link>
      <pubDate>Fri, 24 Feb 2023 00:00:00 +0000</pubDate><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <guid>https://www.omegaatt.com/blogs/develop/2023/logitech_media_server_migration/</guid>
      <description>&lt;p&gt;2021 年公司開始實施 322 WFH，少了通勤的時間，在家的時間也多了，就想在上班時也能好好對待自己，雖然是木耳但始終會想知道，網路上說的獨立訊源減少雜訊是有多重要，亦或只是玄學?於是誕生了&lt;a href=&#34;https://www.omegaatt.com/blogs/develop/2021/piCorePlayer&#34;&gt;Raspberry pi 4 + piCorePlayer 7.0.0 折騰筆記&lt;/a&gt;這篇筆記，到現在這個部落格的累積曝光最高的也是因為這篇吧。
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2023/logitech_media_server_migration/images/bb4cgPLT2m.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;雖然說現在已經出到 &lt;a href=&#34;https://docs.picoreplayer.org/downloads/&#34;&gt;8.2.0&lt;/a&gt;，但也已經是 2022 年六月的版本了，起初因為 raspberry pi 4b 便宜而使用 piCorePlayer，後來也因 raspberry pi 4b 漲價(漲幅超過 100%)進而不使用 piCorePlayer，不知道官方後來沒更新了是因為樹莓派太穩定，還是真的太貴了&amp;hellip;。&lt;/p&gt;
&lt;h2 id=&#34;從-bare-metal-到-docker&#34;&gt;從 Bare Metal 到 Docker&lt;/h2&gt;
&lt;p&gt;當時在學習 HomeLab，首先是從 &lt;a href=&#34;https://www.portainer.io/&#34;&gt;portainer&lt;/a&gt; 開始玩，也因此誕生了 &lt;a href=&#34;https://www.omegaatt.com/blogs/develop/2021/logitech_media_server_with_docker&#34;&gt;logitech media server 搭配 docker 實現雙機分離&lt;/a&gt;。後來也用著同樣的 &lt;a href=&#34;https://hub.docker.com/r/lmscommunity/logitechmediaserver&#34;&gt;image&lt;/a&gt; 將 lms 建在 k8s cluster 內，遇到的比較髒的問題是 nginx 的 port &lt;a href=&#34;https://github.com/omegaatt36/lab/blob/main/k8s/ingress-nginx/tcp-services-config-map.yaml&#34;&gt;用非正式的方式解決&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;這時候其實已經不在乎 logitech media server 是否帶來更好的音質了，也沒有連動 NAS 的音樂，主要是使用 &lt;a href=&#34;https://github.com/philippe44/LMS-YouTube&#34;&gt;Youtube Plugin&lt;/a&gt; 播放 Youtube 上的內容(即便有訂閱 Youtube Premium)。以及使用 &lt;a href=&#34;https://mysqueezebox.com/appgallery/Podcasts&#34;&gt;Podcast Plugin&lt;/a&gt; 收聽 podcast。&lt;/p&gt;
&lt;p&gt;使用 docker 的好處不外乎一個字，省，於是我把 raspberry pi 4b 也給賣了。&lt;/p&gt;
&lt;h2 id=&#34;從-docker-到-podman-與-lxc&#34;&gt;從 Docker 到 Podman 與 LXC&lt;/h2&gt;
&lt;p&gt;2022 年台灣疫情大爆發，公司也從 322 變成全遠端，但也在 2022 下半年恢復 322，於 2023 年正式恢復正常進辦公室。在這期間發現 logitech media server 使用 docker 做為執行環境，除了省物理機的錢(相較 bare metal)，更省顯示卡資源。&lt;/p&gt;</description>
    </item>
    <item>
      <title>logitech media server 搭配 docker 實現雙機分離</title>
      <link>https://www.omegaatt.com/blogs/develop/2021/logitech_media_server_with_docker/</link>
      <pubDate>Sat, 04 Dec 2021 00:00:00 +0000</pubDate><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <guid>https://www.omegaatt.com/blogs/develop/2021/logitech_media_server_with_docker/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;雖然&lt;a href=&#34;https://docs.picoreplayer.org/releases/&#34;&gt;官方 releases 頁面&lt;/a&gt;似乎還沒發布，不過前一陣子把 piCorePlayer 升級到 8.1.0，看起來似乎還是 &lt;a href=&#34;https://forums.slimdevices.com/showthread.php?113353-Players-don-t-play-!-After-upgrading-8-0-1-to-8-1-0&#34;&gt;unstable&lt;/a&gt;，懶得倒版回去 8.0.0，趁這個機會把一直想玩的雙機留兜起來。&lt;/p&gt;
&lt;p&gt;雙機顧名思義為 client 與 server 分開在兩台機器上，piCorePlayer 的 client 為 Squeezelite，server 則為 Logitech Media Server，事實上在 windows 上也有 client &lt;a href=&#34;https://www.microsoft.com/zh-tw/p/squeezelite-x/9pbhmtnp9037&#34;&gt;Squeezelite-X&lt;/a&gt;可以玩，預期中的最終成品將會是「三機流」吧 XD&lt;/p&gt;
&lt;h1 id=&#34;lms-解決方案&#34;&gt;LMS 解決方案&lt;/h1&gt;
&lt;p&gt;採用 &lt;a href=&#34;https://hub.docker.com/u/lmscommunity&#34;&gt;lms community&lt;/a&gt; 的 docker image &lt;a href=&#34;https://hub.docker.com/r/lmscommunity/logitechmediaserver&#34;&gt;lmscommunity/logitechmediaserver&lt;/a&gt; 作為這次 server 端的 service。&lt;/p&gt;
&lt;h1 id=&#34;安裝流程&#34;&gt;安裝流程&lt;/h1&gt;
&lt;p&gt;此篇文章使用 portainer 作為 GUI 方便演示，若熟悉 docker 與 k8s 的可以自行下指令安裝。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;首先我把我的音樂都存放在 NAS 上，先將 music 資料夾給共享出來
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2021/logitech_media_server_with_docker/images/chrome_eeCPLxdAc7.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;接著到 portainer 中建立三個 volume
a. lms-music
輸入在 NAS 分享出來的目錄與使用者、密碼，建立一個 cifs mounted volume
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2021/logitech_media_server_with_docker/images/chrome_ldBeP6Fxh9.webp&#34;&gt;
b. lms-config
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2021/logitech_media_server_with_docker/images/chrome_OWW2NmHnVl.webp&#34;&gt;
c. lms-playlist
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2021/logitech_media_server_with_docker/images/chrome_yfoLywNeFT.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;接著到 stack 中，複製貼上官方的 &lt;a href=&#34;https://hub.docker.com/r/lmscommunity/logitechmediaserver&#34;&gt;docker-compose&lt;/a&gt;，若 portainer 已經佔用了 port &lt;code&gt;9000&lt;/code&gt;，則需要更改暴露的 port &lt;code&gt;port:port/tcp&lt;/code&gt; 並追加環境變數 &lt;code&gt;HTTP_PORT=port&lt;/code&gt;，我最終的 stack 設定為:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;lms:
    image: lmscommunity/logitechmediaserver
    volumes:
      - lms-config:/config:rw
      - lms-music:/music:ro
      - lms-playlist:/playlist:rw
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    ports:
      - 9002:9002/tcp
      - 9090:9090/tcp
      - 3483:3483/tcp
      - 3483:3483/udp
    environment:
      - HTTP_PORT=9002
    restart: always
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;點下 &lt;code&gt;Deploy the stack 後就完成了&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;可以到 container 下看是否已經啟動完成了，並稍微記一下 container 的 hash，在稍後 windows 的設定中會出現。
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2021/logitech_media_server_with_docker/images/chrome_mGOfrPb43k.webp&#34;&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;picoreplayer-設定&#34;&gt;piCorePlayer 設定&lt;/h1&gt;
&lt;p&gt;進入到 piCorePlayer web 中的 &lt;code&gt;Squeezelite Settings&lt;/code&gt; 設定頁面，並在 &lt;code&gt;LMS IP&lt;/code&gt; 中輸入 portainer 的 ip 位置後點擊 Save，大功告成。
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2021/logitech_media_server_with_docker/images/chrome_YFvgpVIpxs.webp&#34;&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
