小鯨魚,大本領(lǐng)
鏡像命名規(guī)范
鏡像地址:鏡像倉庫/項(xiàng)目名/鏡像名:標(biāo)簽名
- 項(xiàng)目名,公共項(xiàng)目使用名稱:base,并設(shè)置為公開;其它項(xiàng)目使用英文小寫項(xiàng)目名,設(shè)置為私有。
- 鏡像名中應(yīng)該包含使用的組件名稱及版本信息,使用
-
連接。- 基礎(chǔ)鏡像命名規(guī)則
基礎(chǔ)鏡像命名應(yīng)按照操作系統(tǒng)大版本:版本號-構(gòu)建版本的格式命名,例如:base/rehl7:7.6-1
- 公共鏡像全名規(guī)則
公共鏡像命名應(yīng)按照服務(wù)名-中間件-上級中間件:服務(wù)版本號-中間件
版本號-上級中間件版本號-構(gòu)建版本的格式命名,中間件名稱可以包含大版本號,例如:base/tomcat8-openjdk8:8.5.23-jre8u212-1
- 應(yīng)用命名規(guī)則
使用格式:系統(tǒng)-模塊:系統(tǒng)版本-模塊版本-構(gòu)建版本,例如:sys/sys-rs:1.1-1.1-1
- 基礎(chǔ)鏡像命名規(guī)則
- 同一應(yīng)用鏡像在以上標(biāo)簽的規(guī)則下,還可以根據(jù)發(fā)布流程設(shè)置多個標(biāo)簽,以滿足部署時版本依賴的管理要求。例如
sys/sys-rs:v1
代表v1.x
的最新版本。
鏡像制作規(guī)范
- 關(guān)鍵字使用大寫
- FROM鏡像,指定明確的Tag,不要使用latest
- 發(fā)布向后兼容的鏡像可以使用同一個Tag號,否則使用新的Tag號
- 盡量將命令放在同一個RUN命令下,減少層數(shù)
- 鏡像中避免多進(jìn)程,如果一定要使用,請引入tini命令,用來管理進(jìn)程
RUN yum install tini -y && yum clean all -y
ENTRYPOINT ['tini', '--']
- 盡量使用exec,使真正應(yīng)用的進(jìn)程ID為1
- 清理臨時文件,如yum install后需要執(zhí)行yum clean all -y
- 優(yōu)化Dockerfile命令的順序,盡量把不變的放在前面
- 使用WORKDIR指定工作目錄,避免絕對路徑擴(kuò)散
- 使用 set -o pipefail 避免管道錯誤被忽略
RUN set -o pipefail && wget -O - https://some.site | wc -l > /number
- 優(yōu)先使用COPY,比ADD更簡單明了
- 始終暴露重要端口
- 習(xí)慣使用環(huán)境變量,同時在Dockerfile中為環(huán)境變量設(shè)置默認(rèn)值
ENV APP_PORT=8761
- 避免設(shè)置默認(rèn)密碼
- 鏡像中不要安裝sshd
- 使用volume顯示設(shè)置掛載點(diǎn),以方便鏡像的使用者知道需要如何定義存儲卷
- 支持任一用戶運(yùn)行,對于需要訪問的目錄文件執(zhí)行以下命令更新權(quán)限
RUN chgrp -R 0 /some/directory && \
chmod -R g+rwX /some/directory
Dockerfile的最后使用USER指定數(shù)字用戶
USER 1001
- 容器內(nèi)部應(yīng)用使用Service訪問k8s/OCP平臺的其他服務(wù)。
- 應(yīng)用基礎(chǔ)鏡像應(yīng)該安裝公用的依賴庫
- 為鏡像設(shè)置元數(shù)據(jù),例如說明鏡像的用途等,UI界面可以根據(jù)這些元數(shù)據(jù)進(jìn)行定制功能
LABEL io.openshift.tags="mongodb,mongodb24,nosql" \
io.openshift.min-memory="8Gi" \
io.openshift.min-cpu"=4" \
io.openshift.non-scalable"=true" \
io.k8s.description="The MySQL 5.5 Server with master-slave replication support" \
io.openshift.wants="mongodb,redis"
- 盡量將應(yīng)用的日志以標(biāo)準(zhǔn)輸出的形式輸出,這樣可以被容器平臺統(tǒng)一收集管理。
- 鏡像中為應(yīng)用準(zhǔn)備好健康檢查的探針,方便容器平臺對應(yīng)用進(jìn)行健康檢查。
下圖為使用EXEC
格式與SHELL
格式,執(zhí)行ENTRYPOINT CMD的區(qū)別。
使用`EXEC`格式與`SHELL`格式,執(zhí)行ENTRYPOINT CMD的區(qū)別
OpenShift官方文檔——鏡像構(gòu)建規(guī)范
Dockerfile最佳實(shí)踐
ENTRYPOINT 入口點(diǎn)
dockerfile最佳實(shí)踐
常用的Dockerfile鏡像地址
nginx的Dockerfile實(shí)例:把日志輸出到標(biāo)準(zhǔn)輸出
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log