###### tags: `Docker` # Docker (三) Dockerfile & docker-compose 每一個 docker run 的指令,都可以編輯成 docker-compose.yml + Dockerfile 。 另外,試想一下,每一個 docker run 的指令代表我們起了一個服務,但是當我們有幾百個或幾千個服務都要啟動,難道我們要下幾百或幾千的 docker run 嗎? 所以這時,就可以透過 docker-compose 跟 Dockerfile 來幫我們解決了。 ## 翻譯第一個 docker-compose + Dockerfile 吧 目標,把上一篇所寫好的指令翻譯成docker-compose + Dockerfile 再把網頁跑起來一次。 ``` docker run --name nginx -d -p 8080:80 --restart=always -v /home/andy/vueapp/hello:/usr/share/nginx/html nginx ``` 首先,我們先在跟 index.html 同一層底下分別建立docker-compose.yml 跟Dockerfile  ### (1) 粗略認識一下 docker-compose ```yaml= version: "3.7" services: app: image: nginx ports: - 8080:80 volumes: - /home/andy/vueapp/hello:/usr/share/nginx/html container_name: nginx restart: always ``` :::danger 注意,docker-compose.yml 裡是以階層的方式來區分,所以要注意之間的層級有沒有對應到。 <br> 另外,層級的區分是以空格鍵來分,不要使用 TAB鍵 ; 沒規定空格需要幾格,只要層級對就好。 ::: 其實單以 docker-compose 就可以把先前的 docker run 起起來了 先將終端機的所在目錄移動到有 docker-compose 那層,可透過 ls 來看當前資料夾有那些東西  接著執行 docker-compose,就可以看到畫面了~ ``` docker-compose up -d ```  接下來認識一下 docker-compose 裡面下了哪些東西吧 !! * version : 為 docker-compose API 的版本。 * services : 提供了哪些服務。 * app : service-name 為一個 container , 裡面為此 container 的配置資訊。 * image : 要使用的 image 名稱。 * ports : 為 -p 的配置。 * volumes : 為 -v 的配置。 * container_name: 為 --name的配置。 * restart : --restart= 的配置。  :::info 這邊可以看一下~ <br> 如果我們不配置 container_name 的話 <br> 系統是會以 資料夾名稱_service-name_第幾個 service 來幫我們命名NAMES <br> 所以得到 hello_app_1 ::: ### 粗略認識一下 Dockerfile 這邊我們將 docker-compose.yml 裡的一些訊息,抓到 Dockerfile 定義 所以內容並不是很多 ```dockerfile= FROM nginx WORKDIR /usr/share/nginx/html COPY . /usr/share/nginx/html ``` 來看一下寫了哪些東西吧~ * FROM : 使用的 image 名稱。 * WORKDIR : container 運行的資料夾位置。 * COPY : 要複製的位置 container運行的資料夾位置。 :::warning 其中 COPY . /usr/share/nginx/html,意思是將當前位置所有的東西複製到 /usr/share/nginx/html 位置 ::: ### 最後總結整理一下 docker-compose.yml 跟 Dockerfile 經過上述的拆分,兩個檔案分別為: 1. docker-compose.yml ```yaml= version: "3.7" services: app: build: . container_name: nginx ports: - 8080:80 restart: always ``` 這邊可以看到原本的 image 不見了,變成 build <br> build : 取得 DockerFile 的位置,是建立 services container 的設定檔,所以變成 build: . 讓 docker-compose 去讀取 Dockerfile 的設定 2. Dockerfile ```dockerfile= FROM nginx WORKDIR /usr/share/nginx/html COPY . /usr/share/nginx/html ``` 兩個檔案都整理好後,就可以執行囉~ ``` docker-compose up -d ``` :::danger 注意,如果有重新編輯過檔案後,因為之前的 image 已經存在過了,因此在執行 docker-compose up -d 時,會自動抓取舊的。 <br> 所以必須依據提示改使用 : ``` docker-compose up -d --build ``` 讓執行的同時,build 最新的 image 來使用。 ::: ## 額外補充 * 當我們要停掉 docker-compose up -d 起起來的服務時,同樣的終端機必須在 docker-compose.yml 檔案的資料夾層,可執行以下指令 : ``` docker-compose down ``` 就可以停止 container 啦~ * 當我們練習了很多次,或是失敗很多次時 docker image 就會累積的越來越多 <br> 我們可以透過下面指令來查看 ``` docker images ```  <br> 可以執行下面指令來進行刪除 ``` docker images rm -f image_name:TAG ``` 也就是 ``` docker image rm -f hello_app:latest ```  <br> 可以看到 hello_app 已經被刪除了 <br> 又或者直接刪除所有的 image ``` docker rmi -f $(docker images) ```  <br>
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up