###### tags: `Docker`
# Docker (二) 用 nginx image 掛載網頁
docker 主要分為三個部分 : 映像檔,容器,倉庫。
* **映像檔** : 依理解,就是我們在 docker中 使用的 image ,也就是編譯的環境,同一個軟體可以有很多個 image ,透過 tag 來區分。舉例 : ubuntu:16.04,如果沒有給 tag 基本都是 latest ,就會長這樣 ubuntu:latest
* **容器** : container,docker 中的最小單位,每個 container 可提供一個服務。
* **倉庫** : 是個用來集中管理 image 的地方,可分為私有跟公開,最大的公開倉庫是 Docker Hub,而他的概念就像是比較熟悉的 Git。
## 使用docker run + nginx 掛載一個頁面吧
首先,再跑 docker run 之前,先來認識一些 OPTIONS 吧 !!
* -d, --detach 在背景執行
* -p, --publish 將 port 匯出, localhost(port):container(port)
* --name 將 container 命名,方便呼叫使用
```
docker run --name container_name -d -p host_port:container_port image_name
```
舉例來看,就會變成
```
docker run --name nginx -d -p 8080:80 nginx
```
我們就可以成功透過 http://127.0.0.1:8080/ or http://localhost:8080/ 看到 nginx 的歡迎頁面了~

## 等等,可是我想放上自己寫的網頁阿~
這時我們就需要再認識一個 OPTIONS
* -v, --volume 可以用來將我們所指定的資料夾綁定到 container 的資料夾 (Bind mount a volume)
使用的方式為
```
本機存放要掛載的網頁資料夾路徑:container 掛載往頁的資料夾路徑
```
而 nginx 預設掛載網頁的資料夾位置為 usr/share/nginx/html
所以我們的指令會改成以下
```
docker run --name nginx -d -p 8080:80 -v /home/andy/vueapp/hello:/usr/share/nginx/html nginx
```
不過直接執行下去會有些問題,因為我們的 container 命名跟 port 都跟第一次執行的相同,所以會有提示錯誤。

所以我們可以透過下面的指令來查看 container 的狀況
```
docker ps -a
```

:::warning
注意,PORTS 這樣的顯示 0.0.0.0:8080 -> 80/tcp 才表示有將port 成功匯出
:::
所以我們必須做以下動作 :
1. 停止 container
```
docker stop container_name 或是 docker stop container_id
```

可以看到 STATUS 欄位, 該 container 已經被我們停掉了。
2. 刪除 contianer
```
docker rm -f container_name 或是 docker rm -f container_id
```
:::danger
注意,這裡的 -f 為強制的作用,所以要小心使用。
:::

可以看到容器已經被我們移除掉了,所以可以再用同樣的命名了。
3. 再一次執行我們的 docker run
```
docker run --name nginx -d -p 8080:80 -v /home/andy/vueapp/hello:/usr/share/nginx/html nginx
```

可以看到網頁已經從 nginx 官方歡迎頁換成我們自己寫的網頁了~
## 每次都要重新 docker run 我的網頁好麻煩
當我們的電腦重新啟動時再來看


可以看到,我們的 container 被自動停掉了
這時,我們再來介紹一個 OPTIONS
* ["- -restart"]
--restart,為了方便看出有兩個 "-",所以上面多打一個空格。
總共有3種狀態可以設定
--restart=always 總是重啟
--restart=no 不重啟
--restart=on-failure 退出狀態,非0時重啟 (不僅會在失敗時重新啟動容器,還會在系統啟動時重新啟動容器)
我們再來改變一下我們的 docker run 指令
```
docker run --name nginx -d -p 8080:80 --restart=always -v /home/andy/vueapp/hello:/usr/share/nginx/html nginx
```
:::info
就算我們把虛擬機重新開機,我們的 container 也會被重新啟動,所以網頁也不會錯誤了~
:::
其他的 docker run OPTIONS 可以參考 :
[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)