# Server deploy ## ngRok 方便簡易測試部署在本地的專案 1. 從官網下載 ngrok 。 [網址](https://ngrok.com/download) 2. 到此處[註冊](https://dashboard.ngrok.com/get-started/your-authtoken)取得 **你的TOKEN** 3. 解壓後執行ngrok.exe 4. 下指令,把你的TOKEN設定到ngrok組態檔: ``` ngrok config add-authtoken 你的TOKEN ``` 5. 下指令,將某個埠號暴露對外服務 ``` ngrok http port號 ``` 6. 跳出視窗裡的forwarding即是臨時部署的server網址 ![](https://i.imgur.com/hsQnT7q.png) ## Docker ### concept Docker的底層是使用**Linux Kernel**的**Namespace**和**Cgroup**組成的,因此在安裝前要先確認Linux Kernel的版本是否支援,NameSpace用來做環境隔離,讓不同的Namespace卻可以有一樣的portId等,Cgroup則是用來做系統資源的管理,如CPU/Memory ![](https://i.imgur.com/15egCsS.png) **虛擬機VM / 容器Container** * VM以作業系統為中心,是硬體抽象層等級的虛擬化,所以需要一個完整的作業系統分配CPU/Memory/磁碟空間...等,運行此VM的為稱**Host OS**,VM本身則是**Guest OS**,優點是無論Host OS是甚麼,都能完整的搬移一套OS及程式,如VMware ESXi、Hyper-V * Container則是以應用程式為中心,是在作業系統層虛擬化,直接打包各容器,獨立隔離並分配Host OS資源,不需要再裝Guest OS,所以優點是所需的容量大幅降低,啟動的速度也更快,不需等待Host OS開機 **倉庫 Repository** 集中存放映像檔的場所,類似Maven Repository,最大的公開倉庫註冊伺服器便是Docker官方的[Docker Hub](https://hub.docker.com/) **映像檔 Image** 用來產生容器實體的模板,可以用來重複產生容器,映像檔可以從公開倉庫下載,也可以自行撰寫打包,需注意的是映像檔是唯讀(read-only)的 **容器 Container** 用映像檔建立出來的執行實例。它可以被啟動、開始、停止、刪除 **映像檔堆疊** ... ### Container相關指令 拉docker hub映像檔 ```docker docker pull 映像檔名 ``` 建立映像檔 ```docker docker build 路徑 -t 自定義名 ``` 查看現在有哪些映像檔 ```docker docker images ``` 利用映像檔建立一個container並啟動,-p 實體port:容器port imageID或image的代稱 ```docker docker run -p 8000:8080 imageID ``` 列出啟動中的docker容器 ```docker docker ps ``` 啟動container ```docker docker start ``` 停止容器 ```docker docker stop containerID ``` 刪除容器 ```docker docker rm containerID ``` 複製本地端檔案到 Container ```docker docker cp ``` ### DockerFile相關指令 **FROM** 使用到的Docker Image名稱,會依照這個名稱直接到docker hub尋找對應的image拉下來 **ADD** 把Local的**檔案**複製到Image裡,如果是 tar.gz 檔複製進去 Image 時會順便自動解壓縮 **COPY** 把Local的**資料夾**複製到Images裡 **ENV** 用來設定環境變數,直到從docker build到docker run都還會存活 **ARG** 設定變數,類似ENV,但只存活在docker build的過程中 **WORKDIR** 指定 container 裡面的路徑 **RUN** 後面放 Linux 指令,用來在包image時**執行安裝和設定這個Image需要的東西**,且執行完後會建立新的image **CMD** 可被複寫的預設命令,用來寫當**容器啟動後要執行的指令**,等同在docker run後加上參數 **ENTRYPOINT** 與CMD接近,但Docker官方表示,如果要將整個容器當作可執行檔(executable)時,就應該使用ENTRYPOINT為佳,可參考[CMD與ENTRYPOINT比較](https://myapollo.com.tw/zh-tw/docker-cmd-vs-entrypoint/) CMD和ENTRYPOINT皆可以寫成兩種格式 -Shell form command param1 param2 -Exec form ["executable","param1","param2"] ### 小結:快速建立DOCKER映像檔步驟 1. 建立一個資料夾 2. 將需要的安裝檔...等放在裡面,或是用FROM抓需要的 3. 在裡面寫好一個Dockerfile 4. 對著路徑下建立映像檔指令docker build 範例dockerfile: 先抓openjdk-8u42-b03-linux-x64.tar.gz及apache-tomcat-7.0.82.tar.gz放進同一資料夾 ```dockerfile FROM centos:7 MAINTAINER test RUN yum install -y wget RUN cd / ADD openjdk-8u42-b03-linux-x64.tar.gz / ADD apache-tomcat-7.0.82.tar.gz / ENV JAVA_HOME=/java-se-8u42-ri ENV PATH=$PATH:/java-se-8u42-ri CMD ["/apache-tomcat-7.0.82/bin/catalina.sh", "run"] ``` ## 部署Azure web程式 1. 先創一個Azure帳號 2. 在Azure裡新建**訂用帳戶**,並設定訂用帳戶裡的**付款方式** ![](https://hackmd.io/_uploads/ryB3AZJF3.png) 3. 建立應用程式,同時將剛才設定好的訂用帳戶加入,並建立一個新的**資源群組** 4. 設定Java版本/地區/定價方案等 ![](https://hackmd.io/_uploads/r1ZjWz1Fh.png) 5. 在**部署中心**設定GitHub 6. 當問到是否要**加入yml檔部署**時選擇複寫現有,此主要是用於聯動azure與github組態,以讓jar可以部署至azure 7. 設定完成後可以在**組態**中加入啟動參數(如有需要) 8. 部署中心的**同步**可以用來更新新版commit 9. 更動完後可以在**概觀**重新啟動應用程式,確保程式套用最新設定