<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>FW Blog</title>
  <subtitle>A personal blog about web development and technology</subtitle>
  <link href="https://imfw.io/feed.xml" rel="self"/>
  <link href="https://imfw.io/"/>
  <updated>2020-03-15T00:00:00Z</updated>
  <id>https://imfw.io/</id>
  <author>
    <name>FW</name>
  </author>
  
  
  <entry>
    <title>Dockerfile - 基本概念</title>
    <link href="https://imfw.io/posts/2020/2020-03-15-docker-basic-dockerfile/"/>
    <updated>2020-03-15T00:00:00Z</updated>
    <id>https://imfw.io/posts/2020/2020-03-15-docker-basic-dockerfile/</id>
    <content type="html">&lt;h1&gt;Dockerfile - 基本概念&lt;/h1&gt;
&lt;p&gt;簡述 Dockerfile 的基本語法與常用指令&lt;/p&gt;
&lt;h2&gt;概念&lt;/h2&gt;
&lt;p&gt;Dockerfile 是 image 的藍圖，描述如何建立一個 image&lt;/p&gt;
&lt;h2&gt;常用指令&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FROM&lt;/code&gt;：指定基礎 image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RUN&lt;/code&gt;：執行指令&lt;/li&gt;
&lt;li&gt;&lt;code&gt;COPY&lt;/code&gt;：複製檔案到 image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ADD&lt;/code&gt;：複製檔案或目錄到 image，並自動解壓縮壓縮檔&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CMD&lt;/code&gt;：container 啟動時執行的指令&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EXPOSE&lt;/code&gt;：開放的 port&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ENV&lt;/code&gt;：設定環境變數&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WORKDIR&lt;/code&gt;：設定工作目錄&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;範例&lt;/h2&gt;
&lt;pre class=&quot;language-dockerfile&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; node:12&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;WORKDIR&lt;/span&gt; /app&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; . .&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; npm install&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;CMD&lt;/span&gt; [&lt;span class=&quot;token string&quot;&gt;&quot;npm&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;start&quot;&lt;/span&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;參考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.docker.com/engine/reference/builder/&quot;&gt;Dockerfile 文件&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Docker Image - 基本概念</title>
    <link href="https://imfw.io/posts/2020/2020-03-08-docker-basic-image/"/>
    <updated>2020-03-08T00:00:00Z</updated>
    <id>https://imfw.io/posts/2020/2020-03-08-docker-basic-image/</id>
    <content type="html">&lt;h1&gt;Docker Image - 基本概念&lt;/h1&gt;
&lt;p&gt;簡述 Docker Image 的基本概念與常用指令&lt;/p&gt;
&lt;h2&gt;概念&lt;/h2&gt;
&lt;p&gt;image 是 container 的樣板，container 是根據 image 產生的&lt;/p&gt;
&lt;p&gt;image 是根據 dockerfile 產生的，dockerfile 是 image 的藍圖&lt;/p&gt;
&lt;h2&gt;常用指令&lt;/h2&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;docker image ls&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;列出所有 image&lt;/p&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;docker image pull [OPTIONS] NAME[:TAG|@DIGEST]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下載 image&lt;/p&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;docker image rm [OPTIONS] IMAGE [IMAGE...]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;刪除 image&lt;/p&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;docker image build [OPTIONS] PATH | URL | -&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根據 dockerfile 建立 image&lt;/p&gt;
&lt;h2&gt;參考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/image/&quot;&gt;Docker 官方文件&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Docker Container - 基本概念</title>
    <link href="https://imfw.io/posts/2020/2020-02-22-docker-basic-container/"/>
    <updated>2020-02-22T00:00:00Z</updated>
    <id>https://imfw.io/posts/2020/2020-02-22-docker-basic-container/</id>
    <content type="html">&lt;h1&gt;Docker Container - 基本概念&lt;/h1&gt;
&lt;p&gt;簡述 Docker Container 使用方式、基本常用指令&lt;/p&gt;
&lt;h2&gt;概念&lt;/h2&gt;
&lt;p&gt;container 是根據 image 產生的，image 是根據 dockerfile 產生的，所以 container 包含什麼、有什麼功能都是依據 dockerfile 的內容所決定的&lt;/p&gt;
&lt;p&gt;image 可以想像成 container 的規格、標準，每次使用相同的 image 開啟 container 的時候，可以確保執行的功能都會是一模一樣的&lt;/p&gt;
&lt;h2&gt;常用指令&lt;/h2&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;運行一個 &lt;a href=&quot;https://hub.docker.com/_/nginx?tab=description&quot;&gt;nginx&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;docker container run -p 8080:80 nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果電腦上沒有 nginx 的 image 會從 docker 的儲存庫下載，預設通常是官方的 &lt;a href=&quot;https://hub.docker.com/&quot;&gt;Docker Hub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上面這行指令中 &lt;code&gt;-p&lt;/code&gt; 是 &lt;code&gt;--port&lt;/code&gt; 的縮寫，傳入兩個參數，一個是主機的 port (8080) ，一個是 container 的（80），代表的意思是將 container 的 80 埠對應到主機的 8080 埠
所以在主機的電腦上可以開啟瀏覽器輸入 localhost:8080 就會看到 container 開啟的 nginx 伺服器&lt;/p&gt;
&lt;p&gt;如果要知道開啟的 port 是多少，基本上有三種方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;從 Docker Hub 上的&lt;a href=&quot;https://hub.docker.com/_/nginx?tab=description&quot;&gt;說明&lt;/a&gt;中查詢&lt;/li&gt;
&lt;li&gt;從 Docker Hub 上的 &lt;a href=&quot;https://hub.docker.com/layers/nginx/library/nginx/latest/images/sha256-d7ffce801c3c92dac436bc5dc65235384dcc1b6bbb8210ccb65f466f975f8f88?context=explore&quot;&gt;tag&lt;/a&gt; 中查詢&lt;/li&gt;
&lt;li&gt;從 &lt;a href=&quot;https://github.com/nginxinc/docker-nginx/blob/5971de30c487356d5d2a2e1a79e02b2612f9a72f/mainline/buster/Dockerfile&quot;&gt;dockerfile&lt;/a&gt; 裡面查詢&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;EXPOSE 是 dockerfile 中的指令，代表服務對外開啟的 port&lt;/p&gt;
&lt;p&gt;這邊可以開始感受到
dockerfile 是 image 的藍圖
image 是 container 的樣板&lt;/p&gt;
&lt;p&gt;所以在使用 image 的時候最好可以看到 dockerfile 才可以確保開啟的 container 有做什麼事情&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker container run -v ~/Documents/demo:/usr/share/nginx/html -p 8080:80 nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這次加上 &lt;code&gt;-v&lt;/code&gt; 是 &lt;code&gt;--volume&lt;/code&gt; 的縮寫，代表綁定檔案目錄，藉由設置這個參數可以修改 container 中要執行的檔案，這邊綁定了 nginx 的預設目錄，就可以修改預設顯示的頁面了&lt;/p&gt;
&lt;p&gt;其他還有&lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/container_run/&quot;&gt;許多參數&lt;/a&gt;可以設定&lt;/p&gt;
&lt;p&gt;&lt;code&gt;-d&lt;/code&gt; &lt;code&gt;--detach&lt;/code&gt; 代表背景執行，執行後只會回傳 container ID&lt;/p&gt;
&lt;p&gt;&lt;code&gt;-i&lt;/code&gt; &lt;code&gt;--interactive&lt;/code&gt; 開啟互動模式，可以直接操作 container&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Docker - 基本概念</title>
    <link href="https://imfw.io/posts/2020/2020-02-16-docker-basic-concept/"/>
    <updated>2020-02-16T00:00:00Z</updated>
    <id>https://imfw.io/posts/2020/2020-02-16-docker-basic-concept/</id>
    <content type="html">&lt;h1&gt;Docker - 基本概念&lt;/h1&gt;
&lt;p&gt;簡述 Docker 架構、優勢、好處並與 VM 作比較&lt;/p&gt;
&lt;h2&gt;建立環境&lt;/h2&gt;
&lt;p&gt;建立一個 Web Service 的環境
可能需要 Linux + Apache + MySQL + PHP (LAMP)
又或者再加上 Nginx 組成 LNAMP&lt;/p&gt;
&lt;h3&gt;使用 VM&lt;/h3&gt;
&lt;p&gt;一個環境就是一個&lt;strong&gt;完整&lt;/strong&gt;的系統
在獨立開發的時候，也許這個情況並不會造成困擾
但是在團隊開發的時候，如果每個人都需要一個可以開發的環境&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;整個團隊共用一個環境 =&amp;gt; 每個開發者互相影響&lt;/li&gt;
&lt;li&gt;每個人有獨立的開發環境 =&amp;gt; 很難確保每個人都有相同的環境&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使用 Docker&lt;/h3&gt;
&lt;p&gt;Docker 不需要自己的系統，Docker 的架構是建立在原有的系統上，使用原有系統的運算資源，只安裝需要的東西，相比基於硬體上的系統建立，Docker 建立的系統只是一個程式而已&lt;/p&gt;
&lt;p&gt;所以 Docker 具有快速建立、轉移、複製的特性&lt;/p&gt;
&lt;p&gt;不過即便透過 namespace 隔離，但因為與原系統共用 kernel，所以 Docker 也不像 VM 是完全隔離的系統&lt;/p&gt;
&lt;h2&gt;資源分配及建立限制&lt;/h2&gt;
&lt;h3&gt;VM&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;虛擬化硬體資源，執行自己的作業系統&lt;/li&gt;
&lt;li&gt;可以建立任何環境， Linux 、 MAC OS 或是 Windows&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Docker&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Docker 使用原系統的 kernel 作為運算，不需要執行自己的作業系統&lt;/li&gt;
&lt;li&gt;只能建立相同 kernel 的環境使用&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Docker 帶來的優勢&lt;/h2&gt;
&lt;h3&gt;快速建立相同環境&lt;/h3&gt;
&lt;p&gt;當環境建立好之後（ image 、 Dockerfile ）可以在不同的機器直接部署、安裝&lt;/p&gt;
&lt;h3&gt;快速調整環境&lt;/h3&gt;
&lt;p&gt;只需要調整 image 或 Dockerfile 就可完成環境的變更&lt;/p&gt;
&lt;h3&gt;節省資源提升效能&lt;/h3&gt;
&lt;p&gt;不需要運行額外的作業系統，直接使用原本 kernel ，將資源更有效率的運用&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>NVM - Node Version Manager 安裝</title>
    <link href="https://imfw.io/posts/2019/2019-03-19-nvm-install/"/>
    <updated>2019-03-19T00:00:00Z</updated>
    <id>https://imfw.io/posts/2019/2019-03-19-nvm-install/</id>
    <content type="html">&lt;p&gt;由於 node 版本越來越多，新舊版本有時候因為套件支援版本不同無法使用，在開發與維護上都是不少人的困擾，所以就有 NVM 誕生，來解決版本切換的問題&lt;/p&gt;
&lt;h2&gt;MAC&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/creationix/nvm&quot;&gt;NVM&lt;/a&gt; 是由大神 &lt;a href=&quot;https://github.com/creationix&quot;&gt;Tim Caswell&lt;/a&gt; 所開發的一個專案，提供 linus/mac 使用的 Node 版本管理器，是目前最受歡迎的管理器&lt;/p&gt;
&lt;h4&gt;安裝方式&lt;/h4&gt;
&lt;p&gt;1.開啟 terminal 或是 iterm2 ，使用 curl 來下載並安裝 (不建議使用 homebrew )&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安裝完之後，會有安裝資訊&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一個紅框代表安裝的路徑( /Users/XXX/.nvm )&lt;/li&gt;
&lt;li&gt;第二個紅框代表命令引入的資訊在.bashrc之中
&lt;ul&gt;
&lt;li&gt;有可能會在 ~/.zshrc, ~/.profile, or ~/.bashrc 之中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在最後安裝完成時可以輸入&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;NVM_DIR&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;HOME/.nvm&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NVM_DIR&lt;/span&gt;/nvm.sh&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;. &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NVM_DIR&lt;/span&gt;/nvm.sh&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NVM_DIR&lt;/span&gt;/bash_completion&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;. &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NVM_DIR&lt;/span&gt;/bash_completion&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;來直接載入 nvm 的指令，或是重新啟動 terminal 來載入&lt;/p&gt;
&lt;p&gt;成功!!&lt;/p&gt;
&lt;h4&gt;常用指令&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;nvm run node [version] --- 切換不同版本&lt;/li&gt;
&lt;li&gt;nvm install [version]  --- 安裝不同版本&lt;/li&gt;
&lt;li&gt;nvm ls                 --- 查看已安裝的版本&lt;/li&gt;
&lt;li&gt;nvm ls-remote          --- 查看可以安裝的版本&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;解除安裝方式&lt;/h4&gt;
&lt;p&gt;輸入指令&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-rf&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$NVM_DIR&lt;/span&gt; ~/.npm  ~/.bower&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然後將命令資訊也刪掉&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;有可能會在  ~/.zshrc, ~/.profile, or ~/.bashrc 之中&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;就可以將nvm完全刪除囉!&lt;/p&gt;
&lt;h2&gt;Windows&lt;/h2&gt;
&lt;p&gt;雖然 NVM 並沒有提供 Windows 版本，不過還是有大神 &lt;a href=&quot;https://github.com/coreybutler&quot;&gt;Corey Butler&lt;/a&gt; 提供了 &lt;a href=&quot;https://github.com/coreybutler/nvm-windows&quot;&gt;nvm-windows&lt;/a&gt; 為 Windows 提供一樣好用的 Node 版本管理器，而且安裝的方式相當簡單，可以在這個專案的 &lt;a href=&quot;https://github.com/coreybutler/nvm-windows/releases&quot;&gt;release&lt;/a&gt; 中下載安裝檔(.exe)&lt;/p&gt;
&lt;h4&gt;安裝方式&lt;/h4&gt;
&lt;p&gt;下載 nvm-setup.zip 解壓縮就可以 GET 安裝檔(.exe)
點兩下開始安裝!!!&lt;/p&gt;
&lt;p&gt;選擇安裝路徑&lt;/p&gt;
&lt;p&gt;選擇一個存放進入點(捷徑)的路徑並且會自動加入環境變數&lt;/p&gt;
&lt;p&gt;就可順利安裝啦!!!&lt;/p&gt;
&lt;p&gt;打開 cmder 測試一下( 命令提示字元 cmd 、 powershell 都可以使用)&lt;/p&gt;
&lt;p&gt;輸入 : &lt;code&gt;nvm -h&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;有跑出版本資訊與使用說明就是安裝成功啦!&lt;/p&gt;
&lt;p&gt;一樣可以使用&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;nvm use [version]     --- 切換不同版本&lt;/li&gt;
&lt;li&gt;nvm install [version] --- 安裝不同版本&lt;/li&gt;
&lt;li&gt;nvm list              --- 查看已安裝的版本&lt;/li&gt;
&lt;li&gt;nvm list available    --- 查看可以安裝的版本&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;解除安裝方式&lt;/h4&gt;
&lt;p&gt;利用 windows 的新增或移除程式刪除即可!!&lt;/p&gt;
&lt;h4&gt;注意&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;nvm 與 nvm-windows 是不同的套件&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
</feed>
