Dockerfile
1.什麼是Dockerfile
Dockerfile
是一個文本文件,裏面包含了打包Docker鏡像所需要用到的命令。Docker 可以通過讀取 Dockerfile
裏面的命令來自動化地構建Docker鏡像。通過執行 docker build
就可以啓動這樣的一個自動化流程。
docker build -t runoob/ubuntu:v1 .
2.容器鏡像層的理解
Docker鏡像由只讀層組成,每個層都代表一個Dockerfile指令,這些層是堆疊的,每一層都是前一層變化的增量。運行鏡像並生成容器時,可以在基礎鏡像的頂部添加新的可寫層(“容器層”)。對正在運行的容器所做的所有更改(例如寫入新文件,修改現有文件和刪除文件)都將寫入此可寫容器層
3.構建上下文
當你觸發docker build
命令時,當前目錄就被稱爲構建上下文(build context
)。默認情況下 Dockerfile
文件就在這個目錄下, 但是可以通過 -f 參數來指定Dockerfile
的位置。不管Dockerfile
在哪裏,當前目錄中的所有文件和目錄都會作爲構建上下文發送到 docker daemon
進程。
4.如何編寫Dockerfile
-
1 目標
更快的構建速度 更小的Docker鏡像大小 更少的Docker鏡像層 #只有 ONLY, COPY,ADD這三個命令增加層數,其他的命令只會創建一些臨時的鏡像,並不會增加構建的鏡像的層數 充分利用鏡像緩存 # 構建映像時,Docker會逐步按指定的順序執行Dockerfile中的每個指令。在檢查每條指令時,Docker會在其緩存中查找可以重用的現有鏡像,而不是重複創建新的鏡像 增加Dockerfile可讀性 讓Docker容器使用起來更簡單
-
2 總結
編寫.dockerignore文件 容器只運行單個應用 將多個RUN指令合併爲一個 基礎鏡像的標籤不要用latest 每個RUN指令後刪除多餘文件 選擇合適的基礎鏡像(alpine版本最好) 設置WORKDIR和CMD #WORKDIR指令可以設置默認目錄,也就是運行RUN / CMD / ENTRYPOINT指 令的地方。 使用ENTRYPOINT (可選) 在entrypoint腳本中使用exec COPY與ADD優先使用前者 合理調整COPY與RUN的順序 # 把變化最少的部分放在Dockerfile的前面,這樣可以充分利用鏡像緩 存。build時不會反覆加載 設置默認的環境變量,映射端口和數據卷 使用LABEL設置鏡像元數據 添加HEALTHCHECK
示例:
dockerfile
FROM node:7-alpine
ENV PROJECT_DIR=/app
WORKDIR $PROJECT_DIR
COPY package.json $PROJECT_DIR
RUN npm install
COPY . $PROJECT_DIR
ENV MEDIA_DIR=/media \
NODE_ENV=production \
APP_PORT=3000
VOLUME $MEDIA_DIR
EXPOSE $APP_PORT
ENTRYPOINT ["./entrypoint.sh"]
CMD ["start"]
dockerfile
FROM node:7-alpine
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
ENTRYPOINT ["./entrypoint.sh"]
CMD ["start"]
# 1.指定基本鏡像爲Linux(alipine Docker鏡像是隻有5M的輕量級Linux系統)
FROM alpine:3.5
# 在alipine下安裝python和pip,這個app是用Python寫的,所以需要安裝Python環境,通常是複製文件和安裝依賴
RUN apk add --update py2-pip
# 安裝app所需的Python所必須的
COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt
# 複製應用必須的文件到鏡像中
COPY app.py /usr/src/app/
COPY templates/index.html /usr/src/app/templates/
# 設置需要暴露的端口號
EXPOSE 5000
# 設置應用通過cmd啓動Python應用程序
CMD ["python", "/usr/src/app/app.py"]