---
# System prepended metadata

title: Dockerfile
tags: [docker]

---

# Dockerfile
## 先用一個例子講解，再帶入觀念!
在文件夾內寫入功能

example:
```
#volumn test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "fuck you"
CMD /bin/bash
```
建立新鏡像(在家目錄輸入下面指令，不要在根目錄，但我不知道為什麼)

example:
```
docker build -f /dockerfile/dockerfile1 -t mycentos .
(-f:指名位置在哪；-t:命名空間)
```

Docker file 容器數據卷
Docker 可以通過鏡像生成容器，然後在容器之間建立與宿主機的連結，亦可在已經建立的容器上建立承襲該容器的新容器。
舉例而言，依照上述生成的容器A中，已有兩資料夾dataVolumeContainer1和dataVolumeContainer2可和宿主機實現掛載，此時可以再從容器A以承襲的方式生成容器B，此時容器B中的配置與容器A完全相同，其亦有兩個資料夾dataVolumeContainer1和dataVolumeContainer2可和宿主機實現掛載
* 注意此時該資料夾連接容器A、容器B與宿主機。
* 此時刪除容器A，容器B仍然持續運作，因為容器之間配置信息的傳遞，數據卷生命週期一直持續到沒有容器使用它為止。

寫法
```
docker run -it --name [容器二名稱] --volumn-from [容器一名稱] [鏡像名稱]
```
容器二是承襲容器一而產生的容器。



## 所以到底什麼是Dockerfile??????
從前面，我們發現一開始要手動編寫一個dockerfile文件(有點類似打code)(要記得符合file的規範)，然後以docker build執行，會獲得一個自定義的鏡像。

---
#### Dockerfile是用來構建Docker鏡像構建文件，由一系列的命令與參數構成的腳本。
1. 每條保留字指令都必須為大寫字母且後面要跟隨至少一個參數。
2. 指令需從上到下，順序執行。
3. #表示註釋。
4. 每條指令都會創建一的新的鏡像層，並對鏡像進行提交。

---

#### Dockerfile執行大致流程
1. docker從基礎鏡像運行一個容器
2. 執行一條指令並對容器做出修改
3. 執行類似docker connit的操作庭交一個新的鏡像層
4. docker再基於剛提交的鏡像運行一個新容器
5. 執行dockerfile中的下一條指令直到所有指令都執行完成

---

#### Dockerfile、鏡像與容器關係
1. Dockerfile是軟件的原材料
2. Docker鏡像是軟件的交付品
3. Docker容器則可以認為是軟件的運型態
* Dockerfile面向開發，Docker鏡像成為交付標準，Docker容器則涉及部署與運維，三者為Docker體系的基石，缺一不可。

---

#### Dockerfile指令
1. RUN:執行一個具體命令。
2. EXPOSE:容器對外暴露的窗口
3. WORKDIR:指定創建容器後，終端默認進入的工作目錄，沒有的話則會默認再根目錄(如centos的鏡像沒有設WORKDIR，所以執行容器會先到其根目錄)
4. ENV:設置建構鏡像過程中的環境變量
5. ADD:複製+解壓縮
6. COPY:複製
>語法:COPY/ADD [要複製的檔案名稱] [要複製的容器位置]
>  example: COPY a.txt /usr/local/b.txt)
> b.txt可以不打，如果只有路徑，指令會自動複製原名稱，即a.txt
7. VOLUME:容器數據卷，用於數據保存與持久化工作
8. CMD:指定一個容器要運行的命令
9. ENTERPOINT:指定一個容器要運行的命令
10. ONBUILD:當建構一個被繼承的Dockerfle時運行命令，父鏡像在被子鏡像繼承後，父鏡像在被子繼承後父鏡像的onbuild被觸發。

* CMD和ENTERPOINT區別:ENTERPOINT的目的和CMD一樣，都是在指定容器啟動程序及參數，但多個CMD指令僅有最後一個生效，且CMD命令會被docker run之後的參數替換。


---

### Dockerfile實作
#### 製作一個有vim指令及config指令的centos
```
FROM centos
MAINTAINER af<xt21109142@gmail.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "success----------ok"
CMD /bin/bash
```
1. 承襲自原centos
2. 自訂鏡像的作者名稱
3. 環境配置 MYPATH = /usr/local

###### tags: `docker`
