###### 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 的歡迎頁面了~ ![](https://i.imgur.com/YOIy6Sm.jpg) ## 等等,可是我想放上自己寫的網頁阿~ 這時我們就需要再認識一個 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 都跟第一次執行的相同,所以會有提示錯誤。 ![](https://i.imgur.com/3tEbeao.jpg) 所以我們可以透過下面的指令來查看 container 的狀況 ``` docker ps -a ``` ![](https://i.imgur.com/gzFPRNC.jpg) :::warning 注意,PORTS 這樣的顯示 0.0.0.0:8080 -> 80/tcp 才表示有將port 成功匯出 ::: 所以我們必須做以下動作 : 1. 停止 container ``` docker stop container_name 或是 docker stop container_id ``` ![](https://i.imgur.com/cTSVGVb.jpg) 可以看到 STATUS 欄位, 該 container 已經被我們停掉了。 2. 刪除 contianer ``` docker rm -f container_name 或是 docker rm -f container_id ``` :::danger 注意,這裡的 -f 為強制的作用,所以要小心使用。 ::: ![](https://i.imgur.com/wq30edU.jpg) 可以看到容器已經被我們移除掉了,所以可以再用同樣的命名了。 3. 再一次執行我們的 docker run ``` docker run --name nginx -d -p 8080:80 -v /home/andy/vueapp/hello:/usr/share/nginx/html nginx ``` ![](https://i.imgur.com/aAnYQq7.jpg) 可以看到網頁已經從 nginx 官方歡迎頁換成我們自己寫的網頁了~ ## 每次都要重新 docker run 我的網頁好麻煩 當我們的電腦重新啟動時再來看 ![](https://i.imgur.com/keygc0J.jpg) ![](https://i.imgur.com/tdRFuhT.jpg) 可以看到,我們的 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/)