Dockerfile編寫規範

  1. 什麼是Dockerfile
    1. Dockerfile簡介

簡而言之,dockerfile是鏡像生產說明書,其作用是用來構建鏡像的。

使用者通過Dockerfile就能知曉鏡像每一層是如何構建的;

    1. 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

 

  1.  編寫規範Dockerfile
    1. 編寫規範的目的

Dockerfile編寫規範的目的:旨在構建最小、最快,最少層的鏡像

    1. 基礎鏡像挑選

微服務推薦選用openjdk:8u151-jre-alpine3.7基礎鏡像,具有基礎的java環境,大小僅57M。

更小的鏡像意味着更少依賴,更少變化,更少問題,更快拉取,更快加載,更省資源。

Dockerfile編排第一行使用:FROM openjdk:8u151-jre-alpine3.7

    1. 謹記容器都是暫態的

無論容器中產生了什麼數據,都會在關停和重啓時刪除,容器一定是無狀態的。因此一定不要在容器中存儲持久化數據,容器的狀態需要外置

    1. 不能出現軟件包安裝和更新操作

不要在Dockerfile出現軟件的安裝,比如RUN yum install mysql 或 RUN yum update mysql。如果需要依賴其他軟件,可以選擇直接使用dockerhub相關鏡像或者重新構建一個合適的基礎鏡像。

    1. 不發生變化的layer放在前面

爲了保證layer緩存可以複用從而增加構建速度,儘量把穩定的、不變的layer放在前面。

    1. 把聯繫緊密並且相對獨立的幾個RUN指令合併成一條

如果有幾個鏡像RUN指令聯繫緊密,需要把幾個RUN指令通過 && 符號連接到一塊,減少layer層數。

例如: RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime&& echo $TZ > /etc/timezone

這條指令即是把聯繫緊密的兩條命令用&& 連成一條,只會構建一個layer;

    1. 避免安裝不必要的包

一定要在Dockerfile 裏編寫與自己容器啓動相關的環境,所有編寫指令信息都是圍繞容器指令啓動和穩定運行而執行的。比如啓動jar包的Dockerfile編寫不要添加C++的依賴環境。這樣做是爲了減少容器的複雜度、依賴關係、尺寸以及構建時間;

    1. 一個容器只有一個微服務

儘量保證一個容器只有一個運行程序,保證容器鏡像的清潔,獨立和可規模化(多實例部署、橫向擴展)。

    1. 容器中啓動的Java程序需要使用命令行參數

增加JVM啓動參數:

-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap

Java8 以前,JVM無法識別出自己在容器中,也不能識別cgroups所設置的內存限制。在申請的內存超過cgroups限制時,程序就會崩潰。Java8 通過開啓這兩個參數,使JVM識別出cgroups限制。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章