- 什麼是Dockerfile
- Dockerfile簡介
簡而言之,dockerfile是鏡像生產說明書,其作用是用來構建鏡像的。
使用者通過Dockerfile就能知曉鏡像每一層是如何構建的;
-
- Dockerfile的組成結構
Dockerfile編排包含基礎鏡像信息、維護者信息、鏡像操作指令和容器啓動指令四個結構,簡單舉例:
FROMopenjdk:8u151-jdk-alpine3.7 ENV JAVA_OPTS="-server -XX:MinHeapFreeRatio=0 -XX:MaxHeapFreeRatio=20 -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Duser.timezone=Asia/ShangHai -Djava.security.egd=file:/dev/urandom" WORKDIR /mnt/morpheus/ms COPY morpheus-common-gateway*.jar ./morpheus-common-gateway.jar COPY config/ ./config EXPOSE 8200 ENTRYPOINT java ${JAVA_OPTS} -jar morpheus-common-gateway.jar |
- 編寫規範Dockerfile
- 編寫規範的目的
Dockerfile編寫規範的目的:旨在構建最小、最快,最少層的鏡像。
-
- 基礎鏡像挑選
微服務推薦選用openjdk:8u151-jre-alpine3.7基礎鏡像,具有基礎的java環境,大小僅57M。
更小的鏡像意味着更少依賴,更少變化,更少問題,更快拉取,更快加載,更省資源。
Dockerfile編排第一行使用:FROM openjdk:8u151-jre-alpine3.7
-
- 謹記容器都是暫態的
無論容器中產生了什麼數據,都會在關停和重啓時刪除,容器一定是無狀態的。因此一定不要在容器中存儲持久化數據,容器的狀態需要外置。
-
- 不能出現軟件包安裝和更新操作
不要在Dockerfile出現軟件的安裝,比如RUN yum install mysql 或 RUN yum update mysql。如果需要依賴其他軟件,可以選擇直接使用dockerhub相關鏡像或者重新構建一個合適的基礎鏡像。
-
- 不發生變化的layer放在前面
爲了保證layer緩存可以複用從而增加構建速度,儘量把穩定的、不變的layer放在前面。
-
- 把聯繫緊密並且相對獨立的幾個RUN指令合併成一條
如果有幾個鏡像RUN指令聯繫緊密,需要把幾個RUN指令通過 && 符號連接到一塊,減少layer層數。
例如: RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime&& echo $TZ > /etc/timezone
這條指令即是把聯繫緊密的兩條命令用&& 連成一條,只會構建一個layer;
-
- 避免安裝不必要的包
一定要在Dockerfile 裏編寫與自己容器啓動相關的環境,所有編寫指令信息都是圍繞容器指令啓動和穩定運行而執行的。比如啓動jar包的Dockerfile編寫不要添加C++的依賴環境。這樣做是爲了減少容器的複雜度、依賴關係、尺寸以及構建時間;
-
- 一個容器只有一個微服務
儘量保證一個容器只有一個運行程序,保證容器鏡像的清潔,獨立和可規模化(多實例部署、橫向擴展)。
-
- 容器中啓動的Java程序需要使用命令行參數
增加JVM啓動參數:
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
Java8 以前,JVM無法識別出自己在容器中,也不能識別cgroups所設置的內存限制。在申請的內存超過cgroups限制時,程序就會崩潰。Java8 通過開啓這兩個參數,使JVM識別出cgroups限制。