Dockerfile成长之路

文章目录

  • 前言
  • 一、Dockerfile是什么?
  • 二、基本指令
    • 1.dockerfile指令参数详解
      • [1.1 FROM 指定基础镜像,必须为第一个命令](#1.1 FROM 指定基础镜像,必须为第一个命令)
      • [1.2 MAINTAINER 镜像维护者的信息](#1.2 MAINTAINER 镜像维护者的信息)
      • [1.3 COPY|ADD 添加本地文件到镜像中](#1.3 COPY|ADD 添加本地文件到镜像中)
      • [1.4 WORKDIR 工作目录](#1.4 WORKDIR 工作目录)
      • [1.5 RUN 构建镜像过程中执行命令](#1.5 RUN 构建镜像过程中执行命令)
      • [1.6 CMD 构建容器后调用,也就是在容器启动时才进行调用](#1.6 CMD 构建容器后调用,也就是在容器启动时才进行调用)
      • [1.7 ENTRYPOINT 设置容器初始化命令,使其可执行化](#1.7 ENTRYPOINT 设置容器初始化命令,使其可执行化)
      • [1.8 ENV 设置环境变量](#1.8 ENV 设置环境变量)
      • [1.9 EXPOSE 暴露容器端口](#1.9 EXPOSE 暴露容器端口)
      • [1.10 volume 挂载文件](#1.10 volume 挂载文件)
      • [1.11 user 设置容器运行时的用户](#1.11 user 设置容器运行时的用户)
    • 2.Dockerfile示例及构建指令
    • [3.Dockerfile构建不同 CPU 架构和操作系统的镜像](#3.Dockerfile构建不同 CPU 架构和操作系统的镜像)
    • 4.Dockerfile编写原则

前言

随着业务架构的整改,针对非容器化业务全部进行容器化改造,这就设计到了java写的业务代码构建业务镜像,并通过k8s发版,因此,就得学习如何使用dockerfile构建后端业务镜像,可能不止构建后端代码镜像,例如前端写的代码也有可能构建为镜像。还有可能就是要在原有镜像基础上进行二次封装,例如:在原有的业务镜像中封装skywalking链路追踪监控、jvm监控等等,后续就有示例。


一、Dockerfile是什么?

Dockerfile 是一个用来构建镜像的文本文件, Dockerfile内容中包含了一条条构建镜像所需的指令和说明。最终采用docker build 命令通过dockerfile中指令构建镜像

二、基本指令

1.dockerfile指令参数详解

1.1 FROM 指定基础镜像,必须为第一个命令

shell 复制代码
格式:
	FROM <image>
	FROM <image>:<tag>
示例:
	FROM mysql:5.7
注意:
	tag是可选的,如果不使用tag时,会使用latest版本的基础镜像

1.2 MAINTAINER 镜像维护者的信息

shell 复制代码
一般可以不用这个参数,使得镜像尽量小而轻
格式:
	MAINTAINER <name>
示例:
	MAINTAINER Yongxin Li
    MAINTAINER inspur_lyx@hotmail.com
    MAINTAINER Yongxin Li <inspur_lyx@hotmail.com>

1.3 COPY|ADD 添加本地文件到镜像中

shell 复制代码
格式:
	COPY <src>... <dest>
示例:
    ADD hom* /mydir/          # 添加所有以"hom"开头的文件
    ADD test relativeDir/     # 添加 "test" 到 `WORKDIR`/relativeDir/
    ADD test /absoluteDir/    # 添加 "test" 到 /absoluteDir/

1.4 WORKDIR 工作目录

shell 复制代码
格式:
	WORKDIR /path/to/workdir
示例:
    WORKDIR /a  (这时工作目录为/a)
注意:
	通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行

1.5 RUN 构建镜像过程中执行命令

shell 复制代码
格式:
	RUN <command>
示例:
    RUN yum install nginx
    RUN pip install django
    RUN mkdir test && rm -rf /var/lib/unusedfiles
注意:
	RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache

1.6 CMD 构建容器后调用,也就是在容器启动时才进行调用

shell 复制代码
格式:
    CMD ["executable","param1","param2"] (执行可执行文件,优先)
    CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
    CMD command param1 param2 (执行shell内部命令)
示例:
    CMD ["/usr/bin/wc","--help"]
    CMD ping www.baidu.com
注意:
	CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

1.7 ENTRYPOINT 设置容器初始化命令,使其可执行化

shell 复制代码
格式:
    ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
    ENTRYPOINT command param1 param2 (shell内部命令)
示例:
    ENTRYPOINT ["/usr/bin/wc","--help"]
    ENTRYPOINT ["sh","-c","sh bin/launch.sh start && tail -f start.log"]
注意:
	ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令

ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令

1.8 ENV 设置环境变量

shell 复制代码
格式:
    ENV <key> <value>
    ENV <key>=<value>
示例:
    ENV myName John
    ENV myCat=fluffy

1.9 EXPOSE 暴露容器端口

shell 复制代码
格式:
    EXPOSE <port> [<port>...]
示例:
    EXPOSE 80 443
    EXPOSE 8080
    EXPOSE 11211/tcp 11211/udp
注意:
    EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口

1.10 volume 挂载文件

shell 复制代码
VOLUME <path>
 
示例:
# 在容器内创建一个挂载点 /data,用于存储数据。
VOLUME /data
 
# 在容器内创建两个挂载点 /data1 和 /data2。
VOLUME /data1 /data2
 
# 在容器内创建三个挂载点,其中前两个是匿名卷,最后一个是命名卷。命名卷允许通过名称进行引用,使其可以在多个容器之间共享和重用。
VOLUME ["/data1", "/data2", "named_volume:/data3"]

1.11 user 设置容器运行时的用户

shell 复制代码
USER <user>[:<group>]
 
# 在容器中以 myuser 用户身份运行。
USER myuser
 
# 在容器中以 myuser 用户身份,且属于 mygroup 用户组运行。
USER myuser:mygroup
 

2.Dockerfile示例及构建指令

该dockerfile就是在原有的业务镜像基础上进行的二次封装,封装了skywalking监控、jmx_exporter监控组件

因为后端是java写的,所以用jdk8镜像为底层镜像

shell 复制代码
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就是一个将前端也构建为镜像,进行启动管理.

shell 复制代码
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

构建指令

shell 复制代码
	docker build -t 镜像名称:标签 . (.点代表在Dockerfile目录层级下执行)
	docker build -f /path/to/Dockerfile -t image_name:tag . (未在dockerfile目录层级下执行)

3.Dockerfile构建不同 CPU 架构和操作系统的镜像

shell 复制代码
	方法一、--platform=参数
	docker build  --platform=linux/arm64,linux/amd64 -t 镜像名称:标签 .  构建arm64和amd64操作系统的镜像
shell 复制代码
	方法二、 Docker CLI 插件管理器buildx
		1、安装buildx
			docker buildx install
		2、创建一个新的构建器实例
			docker buildx create --name mybuilder
		3、启用构建器实例
			docker buildx use mybuilder
		4、构建镜像
			docker buildx build --platform <platform> -t image_name:tag .

4.Dockerfile编写原则

shell 复制代码
	- 不必要的内容不要放在镜像中
	- 减少不必要的层文件
	- 减少网络传输操作
	- 可以适当的包含一些调试命令

相关推荐
dessler26 分钟前
云计算&虚拟化-kvm创建网桥(bridge)
linux·运维·云计算
何曾参静谧36 分钟前
「Py」模块篇 之 PyAutoGUI库自动化图形用户界面库
运维·python·自动化
一只哒布刘2 小时前
RHCE-DNS域名解析服务器
运维·服务器
sss-web12262 小时前
4.远程访问及控制
运维·服务器
moneyxjj3 小时前
Linux各种解压命令汇总
linux·运维·服务器
陈yanyu3 小时前
Linux - 弯路系列3:安装和编译libvirt-4.5.0及虚拟网卡virbr0(virbr0-nic)创建
linux·运维·服务器
逃跑的羊4 小时前
jenkins提交gitee后自动部署
运维·gitee·jenkins
学习向前冲4 小时前
安装一键式重置密码插件(Linux)-CloudResetPwdAgent
linux·运维·服务器
RobinDevNotes5 小时前
自动化构建镜像:Packer
运维·packer
fareast_mzh5 小时前
Setting Up a Simple Live Streaming Server on Debian 11
运维·debian·直播