---
# System prepended metadata

title: Server deploy

---

# 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. 更動完後可以在**概觀**重新啟動應用程式，確保程式套用最新設定
