<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Docker on Tom 除錯中</title><link>https://tomleesm.github.io/tags/docker/</link><description>Recent content in Docker on Tom 除錯中</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 17 Jul 2025 17:50:21 +0800</lastBuildDate><atom:link href="https://tomleesm.github.io/tags/docker/index.xml" rel="self" type="application/rss+xml"/><item><title>使用 docker 執行 node.js，問 AI 語法</title><link>https://tomleesm.github.io/posts/2025/07/run-node-js-with-docker/</link><pubDate>Thu, 17 Jul 2025 17:50:21 +0800</pubDate><guid>https://tomleesm.github.io/posts/2025/07/run-node-js-with-docker/</guid><description>&lt;p&gt;用 docker 執行 node.js 環境，先從 shell 開始，因為需要執行 &lt;code&gt;node file.js&lt;/code&gt;。一般是用 &lt;code&gt;docker run&lt;/code&gt; 如下所示&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm -it node:22-alpine /bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;怎麼改用 docker compose 實作呢？&lt;/p&gt;
&lt;p&gt;我平常只用 AI 來翻譯英文，和做一些市場調查，例如問它「網站後端程式語言市占率」，想說問問看「請將 docker run &amp;ndash;rm -it node:22-alpine /bin/sh 改用 docker compose」，結果如下：&lt;/p&gt;
&lt;h2 id="chatgpt"&gt;ChatGPT&lt;/h2&gt;
&lt;p&gt;你可以使用 Docker Compose 來達成等效於 &lt;code&gt;docker run --rm -it node:22-alpine /bin/sh&lt;/code&gt; 的效果。這裡的重點是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;node:22-alpine&lt;/code&gt; 映像&lt;/li&gt;
&lt;li&gt;進入一個互動式 shell&lt;/li&gt;
&lt;li&gt;容器在結束後自動移除（&lt;code&gt;--rm&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;雖然 Docker Compose 本身沒有 &lt;code&gt;--rm&lt;/code&gt; 的選項，但你可以透過 &lt;code&gt;docker compose run&lt;/code&gt; 搭配 &lt;code&gt;--rm&lt;/code&gt; 來達成類似效果。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="方法一使用-docker-composeyml-搭配-docker-compose-run"&gt;方法一：使用 &lt;code&gt;docker-compose.yml&lt;/code&gt; 搭配 &lt;code&gt;docker compose run&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;建立一個 &lt;code&gt;docker-compose.yml&lt;/code&gt; 檔案如下：&lt;/p&gt;</description></item><item><title>用 docker compose 安裝與執行 VitePress</title><link>https://tomleesm.github.io/posts/2025/07/install-vitepress-docker/</link><pubDate>Tue, 15 Jul 2025 14:59:27 +0800</pubDate><guid>https://tomleesm.github.io/posts/2025/07/install-vitepress-docker/</guid><description>&lt;h2 id="簡介"&gt;簡介&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://vitepress.dev/"&gt;VitePress&lt;/a&gt; 是一種靜態網站產生器，類似 Git Book 那樣的東西，我用它來寫讀書筆記。官方文件只有用已經裝好 Node.js 的 VitePress 安裝方式，沒有用 docker 安裝的說明，Google 搜尋半天也找不到，好不容易自己試出了可以用的方式，所以記錄在這裡。&lt;/p&gt;
&lt;h2 id="vitepress-image"&gt;VitePress image&lt;/h2&gt;
&lt;p&gt;新增檔案 Dockerfile 內容如下&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;FROM node:22-alpine
RUN yarn add global vitepress
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;docker 一般把程式用 root 全域安裝，一般網路上找到的方法是設定 &lt;code&gt;packages.json&lt;/code&gt;，然後用指令 &lt;code&gt;npm install&lt;/code&gt; 安裝，這樣檔案容易有權限問題(&lt;code&gt;packages.json&lt;/code&gt; 變成 &lt;code&gt;root:root&lt;/code&gt; )。當然可以換成 &lt;code&gt;npm add -g vitepress&lt;/code&gt;，用 yarn 只是因為安裝的比較快。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker build . -t vitepress:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;執行上述指令後，建立 vitepress:latest image。&lt;/p&gt;
&lt;h2 id="載入需要的檔案和設定"&gt;載入需要的檔案和設定&lt;/h2&gt;
&lt;p&gt;新增檔案 &lt;code&gt;docker-compose.yaml&lt;/code&gt; 內容如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;book_notes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;vitepress:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;book_notes&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./:/app&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;working_dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/app&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/node_modules/vitepress/bin/vitepress.js dev --host 0.0.0.0&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;no&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;5173:5173&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用 docker compose 在載入容器後載入需要的檔案和設定，所以不是在 Dockerfile 設定：&lt;/p&gt;</description></item><item><title>使用 Docker Compose 安裝 Laravel 和 Vue.js 環境</title><link>https://tomleesm.github.io/posts/2024/11/install-laravel-vue-with-docker-compose/</link><pubDate>Fri, 15 Nov 2024 17:50:21 +0800</pubDate><guid>https://tomleesm.github.io/posts/2024/11/install-laravel-vue-with-docker-compose/</guid><description>&lt;p&gt;想要用 Docker 建立 Laravel 環境，於是 &lt;a href="https://www.google.com/search?q=Docker&amp;#43;LEMP&amp;amp;oq=Docker&amp;#43;LEMP"&gt;Google &amp;ldquo;Docker LEMP&amp;rdquo;&lt;/a&gt;，發現一篇很棒的文章&lt;a href="https://tech.osteel.me/posts/docker-for-local-web-development-introduction-why-should-you-care"&gt;Docker for local web development, introduction: why should you care?&lt;/a&gt;。因為不想每次忘記指令都回去看這一系列文章（英文沒那麼好），於是寫筆記。&lt;/p&gt;
&lt;h2 id="安裝-docker"&gt;安裝 Docker&lt;/h2&gt;
&lt;h3 id="安裝指令"&gt;安裝指令&lt;/h3&gt;
&lt;p&gt;首先安裝 Docker，依照官方文件安裝即可，預設安裝 Docker 和 Docker Compose&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows：參考 &lt;a href="https://docs.docker.com/desktop/windows/install/"&gt;Install Docker Desktop on Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Linux：參考 &lt;a href="https://docs.docker.com/engine/install/debian/"&gt;Install Docker Engine on Debian&lt;/a&gt; 或選擇對應的發行套件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果是安裝在 Linux Mint，則用 &lt;a href="https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository"&gt;Install Docker Engine on Ubuntu&lt;/a&gt;，在 Add the repository to Apt sources：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add the repository to Apt sources:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;. /etc/os-release &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;UBUNTU_CODENAME&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;$VERSION_CODENAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; stable&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;$(. /etc/os-release &amp;amp;&amp;amp; echo &amp;quot;${UBUNTU_CODENAME:-$VERSION_CODENAME}&amp;quot;)&lt;/code&gt; 在 Linux Mint 是無效的，所以上述的指令改成&lt;/p&gt;</description></item></channel></rss>