前言
隨著業(yè)務(wù)架構(gòu)的整改,針對非容器化業(yè)務(wù)全部進(jìn)行容器化改造,這就設(shè)計到了java寫的業(yè)務(wù)代碼構(gòu)建業(yè)務(wù)鏡像,并通過k8s發(fā)版,因此,就得學(xué)習(xí)如何使用dockerfile構(gòu)建后端業(yè)務(wù)鏡像,可能不止構(gòu)建后端代碼鏡像,例如前端寫的代碼也有可能構(gòu)建為鏡像。還有可能就是要在原有鏡像基礎(chǔ)上進(jìn)行二次封裝,例如:在原有的業(yè)務(wù)鏡像中封裝skywalking鏈路追蹤監(jiān)控、jvm監(jiān)控等等,后續(xù)就有示例。
一、Dockerfile是什么?
Dockerfile 是一個用來構(gòu)建鏡像的文本文件, Dockerfile內(nèi)容中包含了一條條構(gòu)建鏡像所需的指令和說明。最終采用docker build 命令通過dockerfile中指令構(gòu)建鏡像
二、基本指令
1.dockerfile指令參數(shù)詳解
1.1 FROM 指定基礎(chǔ)鏡像,必須為第一個命令
格式:
FROM <image>
FROM <image>:<tag>
示例:
FROM mysql:5.7
注意:
tag是可選的,如果不使用tag時,會使用latest版本的基礎(chǔ)鏡像
1.2 MAINTAINER 鏡像維護(hù)者的信息
一般可以不用這個參數(shù),使得鏡像盡量小而輕
格式:
MAINTAINER <name>
示例:
MAINTAINER Yongxin Li
MAINTAINER inspur_lyx@hotmail.com
MAINTAINER Yongxin Li <inspur_lyx@hotmail.com>
1.3 COPY|ADD 添加本地文件到鏡像中
格式:
COPY <src>... <dest>
示例:
ADD hom* /mydir/ # 添加所有以"hom"開頭的文件
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
1.4 WORKDIR 工作目錄
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (這時工作目錄為/a)
注意:
通過WORKDIR設(shè)置工作目錄后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都會在該目錄下執(zhí)行
1.5 RUN 構(gòu)建鏡像過程中執(zhí)行命令
格式:
RUN <command>
示例:
RUN yum install nginx
RUN pip install django
RUN mkdir test && rm -rf /var/lib/unusedfiles
注意:
RUN指令創(chuàng)建的中間鏡像會被緩存,并會在下次構(gòu)建中使用。如果不想使用這些緩存鏡像,可以在構(gòu)建時指定--no-cache參數(shù),如:docker build --no-cache
1.6 CMD 構(gòu)建容器后調(diào)用,也就是在容器啟動時才進(jìn)行調(diào)用
格式:
CMD ["executable","param1","param2"] (執(zhí)行可執(zhí)行文件,優(yōu)先)
CMD ["param1","param2"] (設(shè)置了ENTRYPOINT,則直接調(diào)用ENTRYPOINT添加參數(shù))
CMD command param1 param2 (執(zhí)行shell內(nèi)部命令)
示例:
CMD ["/usr/bin/wc","--help"]
CMD ping www.baidu.com
注意:
CMD不同于RUN,CMD用于指定在容器啟動時所要執(zhí)行的命令,而RUN用于指定鏡像構(gòu)建時所要執(zhí)行的命令。
CMD不同于RUN,CMD用于指定在容器啟動時所要執(zhí)行的命令,而RUN用于指定鏡像構(gòu)建時所要執(zhí)行的命令。
1.7 ENTRYPOINT 設(shè)置容器初始化命令,使其可執(zhí)行化
格式:
ENTRYPOINT ["executable", "param1", "param2"] (可執(zhí)行文件, 優(yōu)先)
ENTRYPOINT command param1 param2 (shell內(nèi)部命令)
示例:
ENTRYPOINT ["/usr/bin/wc","--help"]
ENTRYPOINT ["sh","-c","sh bin/launch.sh start && tail -f start.log"]
注意:
ENTRYPOINT與CMD非常類似,不同的是通過docker run執(zhí)行的命令不會覆蓋ENTRYPOINT,而docker run命令中指定的任何參數(shù),都會被當(dāng)做參數(shù)再次傳遞給ENTRYPOINT。Dockerfile中只允許有一個ENTRYPOINT命令,多指定時會覆蓋前面的設(shè)置,而只執(zhí)行最后的ENTRYPOINT指令
ENTRYPOINT與CMD非常類似,不同的是通過docker run執(zhí)行的命令不會覆蓋ENTRYPOINT,而docker run命令中指定的任何參數(shù),都會被當(dāng)做參數(shù)再次傳遞給ENTRYPOINT。Dockerfile中只允許有一個ENTRYPOINT命令,多指定時會覆蓋前面的設(shè)置,而只執(zhí)行最后的ENTRYPOINT指令
1.8 ENV 設(shè)置環(huán)境變量
格式:
ENV <key> <value>
ENV <key>=<value>
示例:
ENV myName John
ENV myCat=fluffy
1.9 EXPOSE 暴露容器端口
格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp
注意:
EXPOSE并不會讓容器的端口訪問到主機(jī)。要使其可訪問,需要在docker run運行容器時通過-p來發(fā)布這些端口,或通過-P參數(shù)來發(fā)布EXPOSE導(dǎo)出的所有端口
1.10 volume 掛載文件
VOLUME <path>
示例:
# 在容器內(nèi)創(chuàng)建一個掛載點 /data,用于存儲數(shù)據(jù)。
VOLUME /data
# 在容器內(nèi)創(chuàng)建兩個掛載點 /data1 和 /data2。
VOLUME /data1 /data2
# 在容器內(nèi)創(chuàng)建三個掛載點,其中前兩個是匿名卷,最后一個是命名卷。命名卷允許通過名稱進(jìn)行引用,使其可以在多個容器之間共享和重用。
VOLUME ["/data1", "/data2", "named_volume:/data3"]
1.11 user 設(shè)置容器運行時的用戶
USER <user>[:<group>]
# 在容器中以 myuser 用戶身份運行。
USER myuser
# 在容器中以 myuser 用戶身份,且屬于 mygroup 用戶組運行。
USER myuser:mygroup
2.Dockerfile示例及構(gòu)建指令
該dockerfile就是在原有的業(yè)務(wù)鏡像基礎(chǔ)上進(jìn)行的二次封裝,封裝了skywalking監(jiān)控、jmx_exporter監(jiān)控組件
因為后端是java寫的,所以用jdk8鏡像為底層鏡像
FROM xx.xx.xx.xx/xx/openjdk:8
COPY $jarPath/*.jar /usr/local/src/app.jar
COPY ./jmx_prometheus_javaagent-0.16.1.jar /export/server/skywalking/jmx/
COPY ./config.yaml /export/server/skywalking/jmx/
WORKDIR /usr/local/src/
ENTRYPOINT exec java -Xmx1024m -Xms1024m -Duser.timezone=Asia/Shanghai -javaagent:/export/server/skywalking/agent/skywalking-agent.jar -javaagent:/export/server/skywalking/agent/jmx_prometheus_javaagent-0.16.1.jar=19000:/export/server/skywalking/agent/config.yaml -jar app.jar
該dockerfile就是一個將前端也構(gòu)建為鏡像,進(jìn)行啟動管理.
文章來源:http://www.zghlxwxcb.cn/news/detail-820682.html
FROM node:12.19.0
WORKDIR /output
COPY ./output /output
EXPOSE 3001
ENV NODE_ENV=production
CMD nohup npm run start >out.log 2>&1 && tail -f out.log
構(gòu)建指令
文章來源地址http://www.zghlxwxcb.cn/news/detail-820682.html
docker build -t 鏡像名稱:標(biāo)簽 . (.點代表在Dockerfile目錄層級下執(zhí)行)
docker build -f /path/to/Dockerfile -t image_name:tag . (未在dockerfile目錄層級下執(zhí)行)
3.Dockerfile構(gòu)建不同 CPU 架構(gòu)和操作系統(tǒng)的鏡像
方法一、--platform=參數(shù)
docker build --platform=linux/arm64,linux/amd64 -t 鏡像名稱:標(biāo)簽 . 構(gòu)建arm64和amd64操作系統(tǒng)的鏡像
方法二、 Docker CLI 插件管理器buildx
1、安裝buildx
docker buildx install
2、創(chuàng)建一個新的構(gòu)建器實例
docker buildx create --name mybuilder
3、啟用構(gòu)建器實例
docker buildx use mybuilder
4、構(gòu)建鏡像
docker buildx build --platform <platform> -t image_name:tag .
4.Dockerfile編寫原則
- 不必要的內(nèi)容不要放在鏡像中
- 減少不必要的層文件
- 減少網(wǎng)絡(luò)傳輸操作
- 可以適當(dāng)?shù)陌恍┱{(diào)試命令
到了這里,關(guān)于Dockerfile成長之路的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!