Docker架站 === ## 安裝 docker 開啟 Ubuntu 軟體來搜尋並安裝軟體: <kbd>![](https://i.imgur.com/5UAIB2D.png)</kbd> 按放大鏡切換搜尋功能,並在搜尋文字方塊中鍵入 `docker`,下方的清單會即時更新,接著點按軟體清單中的 `Docker` 來查看詳細資訊。 <kbd>![](https://i.imgur.com/aVfpOES.png)</kbd> 在軟體資訊開面中,點按「安裝」按鈕。 <kbd>![](https://i.imgur.com/38AJdDI.png)</kbd> 安裝軟體需要使用系統管理員的權限,系統會要求輸入密碼,暫時提升為系統管理員。請輸入安裝 ubuntu 時設定的密碼。 <kbd>![](https://i.imgur.com/hc1kSIT.png)</kbd> 安裝完成! <kbd>![](https://i.imgur.com/mTi43t7.png)</kbd> ## 下載教學網站容器並執行 安裝完 `docker` 之後,請開啟終端機視窗,接下來的工作皆以指令進行操作較為方便: ![](https://i.imgur.com/z8j8vxN.png) 接著請在終端機中輸入以下指令來下載教學網站容器並執行: ``` bash sudo docker run -d -p 80:80 -p 8022:22 --restart always idreamer/junior ``` - docker 要有系統管理權限才可以執行,所以指令前面加上了 `sudo` 可以在執行這個指令時,暫時提升為系統管理員的權限。 - `docker run` 是用來在容器中執行指定的映像檔,後面接的參數意義如下: - `-d` 卸離模式,執行容器後馬上返回,不需等待容器執行結束。 - `-p 宿主:容器` 用來指定宿主主機與容器通訊埠的對應,如果我們連到宿主主機的指定通訊埠,會自動轉送到容器對應的通訊埠。這裡我們指定了兩組通訊埠的對應: - `-p 80:80` 將宿主主機的 80 埠轉送到容器的 80 埠。我們透過宿主主機的 80 埠來提供教學網站容器的網站服務 - `-p 8022:22` 將宿主主機的 8022 埠轉送到容器的 22 埠。這是用來提供 ssh 直接連進容器的服務,以便後續對容器內的教學網站程式進行更新或維護。不直接將宿主主機的 22 埠對應到容器的 22 埠的原因是要保留宿主主機的 22 埠來提供遠端 ssh 連進宿主主機進行維護,才刻意將對應到容器 ssh 服務的通訊埠調開。 - `--restart always` 宿主主機重新開機時,可以自動重啟容器。如果沒有加上這個選項,就需要下指含來啟動容器。 - `idreamer/junior` 是指定要執行的容器映像檔名稱,教學網站已打包並命名為 `idreamer/junior`,且上傳到 dockerhub 以方便取用。 執行上述命令後,若是第一次執行,docker 會自動連到 dockerhub 網站下載 `idreamer/junior` 這個容器映像檔。 如果一切正常的話,此時打開瀏覽器,在網址列鍵入宿主主機的位址,應該就可以看到教學網站了。 <kbd>![](https://i.imgur.com/ZyFcdp6.png)</kbd> ## 透過 ssh 連進教學網站容器 如果後續有需要連進教學網站容器進行程式更新或維護,可以透過 ssh 工具遠端連接教學網站容器。該容器裡已預先建立一組使用者帳密,並可使用 sudo 指令暫時提升權限。 :::info 預先建立的使用者帳號為 `admin`,密碼為 `nksh2246`。 ::: ### 透過 Windows 10 內建的 ssh 工具連入容器 首先先開啟命令提示字元,並以下列指令連接遠端 ssh 服務: ``` bash ssh 帳號@主機位址 -p 通訊埠 ``` 所以若要連入宿主主機位址為 `10.10.0.222` 的教學網站容器的話,指令如下: ``` bash ssh admin@10.10.0.222 -p 8022 ``` :::info 如果省略了 `-p 通訊埠` 參數的話,ssh 預設會使用的通訊埠為 `22`,依照前面的設定,這樣連接的會是宿主主機提供的 ssh 服務噢! ::: <kbd>![](https://i.imgur.com/pLtzFOZ.png)</kbd> 連上後會要求輸入 `admin` 的密碼,請輸入預設密碼 `nksh2246`。 ![](https://i.imgur.com/bhmQbEI.png) 看到提示符號,表示已經成功透過 ssh 連上容器了。 ### 透過 PieTTY 連接容器 ssh 服務 如果使用的電腦沒有提供 ssh 工具的話,就需要自行下載其他 ssh 工具來進行連線。底下我們以 PieTTY 工具示範。 #### 下載 PieTTY 首先先下載 PieTTY 工具,下載地點可以直接問 Google:  <kbd>![](https://i.imgur.com/bD18bEM.png)</kbd> <kbd>![](https://i.imgur.com/QFRtVyu.png)</kbd> <kbd>![](https://i.imgur.com/dGyMufG.png)</kbd> 點按 `PieTTY 0.4.00b14` 連結會下載一個名為 `pietty0400b14.zip` 的壓縮檔,將其解壓縮後,可以得到 PieTTY 的執行檔 `pietty0400b14.exe`。 #### 使用 PieTTY 進行連線 雙擊 PieTTY 的執行檔,準備連線。 <kbd>![](https://i.imgur.com/lPL8U19.png)</kbd> 在主機名稱或 IP 位址的欄位輸入宿主主機的位址,並將 Port 欄位修改為 `8022`,再按下「連線」按鈕。 <kbd>![](https://i.imgur.com/nh8Lo9A.png)</kbd> 第一次連線的時候可能會看到 PieTTY 的警告視窗,詢問要不要儲存目標主機的連線憑證,請按「是(Y)」。 <kbd>![](https://i.imgur.com/wd9KoEf.png)</kbd> 此時才會詢問連線使用的帳號及密碼,請使用預先建立的 `admin` 帳號來連線,預設密碼為 `nksh2246`。輸入正確的話,就可以看到命令提示訊息,表示已正確登入,正等待使用者鍵入要執行的命令。 ## 修改教學網站容器的 ssh 連線密碼 以前一節的方式連入教學網站容器後,可使用 `passwd` 指令變更密碼,請直接在命令提示訊息後鍵入 `passwd` 再按下 <kbd>Enter</kbd> 鍵。 ![](https://i.imgur.com/ED2RXtL.png) 然後系統會詢問舊密碼與新密碼,請在 (current) UNIX password: 後輸入舊密碼,接著在 Enter new UNIX password: 以及 Retype new UNIX password: 後輸入新密碼。輸入兩次新密碼的目的是為了怕打錯密碼,所以需要多打一次做驗證。 :::info 在輸入密碼時,畫面上不會有任何的視覺回饋。這是為了避免旁人窺伺而猜測密碼所設置的安全措施,不是鍵盤突然壞掉囉! ::: 當看到 `password updated successfully` 訊息是,表示密碼變更成功。之後 ssh 連線,或者要以 sudo 暫時提升權限需要輸入密碼時,就得使用變更後的新密碼囉! ## 更新教學網站的程式碼 教學網站的原始程式碼有公開在 GitHub 上,容器內也已經安裝了 git 工具,透過前面的方式以 ssh 登入容器後,就可以下指令以 git 對教學網站的原始程式更進行更新。 :::info 容器中的教學網站的程式碼是放在 `/var/www/junior` 資料夾下。 ::: 以 ssh 登入容器後,請先以下列指令將工作目錄切換到 `/var/www/junior`: ``` bash cd /var/www/junior ``` - `cd` 是 Change Directory 的縮寫,意思是要變更(切換)工作目錄 - `/var/www/junior` 則是要變更到的目標工作目錄 <kbd>![](https://i.imgur.com/5fqn3Fq.png)</kbd> 切換到 `/var/www/eclassroom` 之後,再以下面的指令更新程式碼: ``` bash sudo git pull ``` - `sudo` 執行命令時,暫時提升使用者權限為系統管理員 - `git pull` 自遠端儲存庫中下載最新的程式碼 ![](https://i.imgur.com/cyCQq2m.png) 使用 `sudo` 時,可能會詢問密碼,此時再鍵入 `admin` 的密碼即可。 如果如上圖一樣,看到 `Already up to date.` 訊息的話,表示目前 GitHub 上的教學網站的原始程式碼沒有後續的更版,所以容器裡的程式碼已經是最新版的了。 <kbd>![](https://i.imgur.com/9faCl8e.png)</kbd> 若執行結果像上面的畫面一樣,有列出檔案的變更的話,表示 GitHub 上教學網站的程式碼有更新,並已將變更同步到容器內了。