1.dockerfile语法了解
FROM:指定基础镜像,用于构建新镜像
COPY和ADD:复制文件或目录到镜像中
RUN :在镜像中执行命令,用于安装软件和配置环境等操作
CMD和ENTRYPOINT:指定容器启动时要运行的命令或程序,只能指定一个 CMD 命令,如果在 Dockerfile 中指定了多个 CMD 命令,那么只有最后一个 CMD 命令会生效,其他的 CMD 命令会被忽略,ENTRYPOINT也是一样的
ENV:设置环境变量即设置变量参数
EXPOSE:声明容器要监听的网络端口
WORKDIR:设置容器中的工作目录,在容器启动时,会自动进入该工作目录,类似于在命令行中使用 cd 命令切换到指定目录
USER:设置容器中运行命令的用户
VOLUME:声明容器中的目录为持久化存储卷
ARG:定义构建时的参数
LABEL:为镜像添加元数据
copy与add区别
copy:用于复制本地文件或目录到Docker镜像中
add:除了复制本地文件或目录外,还支持从远程URL复制文件到Docker镜像中,并且如果源文件是压缩格式(如tar),则会尝试自动解压缩该文件到目标路径
cmd与entrypoint区别
cmd:CMD用于定义默认的容器启动命令,可以被覆盖
entrypoint:ENTRYPOINT用于定义容器启动的主要命令,不会被覆盖
2.编写dockerfile示例
jdk8环境的dockerfile
vi /etc/docker/dockerfile_alpine_jdk8
FROM alpine:latest #使用alpine系统作为基础镜像,Alpine非常轻量级,因此它非常适合在容器中运行,
ENV TZ="Asia/Shanghai" #这个环境变量用于下面配置时区
ENV JVM_OPTS="-Xms512m -Xmx512m" #这个环境变量用于设置Java虚拟机(JVM)的启动参数。其中,-Xms用于设置JVM的初始堆大小,-Xmx用于设置JVM的最大堆大小。这两个参数可以控制JVM的内存使用情况,避免出现内存不足的情况
ENV HEAP_DUMP_OPTS="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/java_jar/log" #这个环境变量用于设置JVM在发生内存溢出时生成堆转储文件的选项。其中,-XX:+HeapDumpOnOutOfMemoryError表示在发生内存溢出时生成堆转储文件,-XX:HeapDumpPath=/opt/java_jar/log表示将堆转储文件保存在/opt/java_jar/log目录下。这个选项可以帮助开发人员分析内存溢出的原因
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk add --upgrade --no-cache openjdk8 tzdata ttf-dejavu fontconfig \
&& cp /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone \
&& mkdir -p /opt/java_jar/log #这里使用了一个run命令执行了多个操作,因为在dockerfile中能尽量少些run命令就尽量少些,这里先是修改了系统的镜像源,改为了阿里云的源,再下载了jkd8、时间、字体软件,再就是更改了时区,最后就是创建了jar包的存放目录
WORKDIR /opt/java_jar/ #将jar包存放目录设置为工作目录
COPY /target/sc.jar /opt/java_jar/ #将jar包从宿主机拷贝到容器目录中,要将宿主机中的jar包跟dockerfile文件放到同一目录中
EXPOSE 8080 #暴露容器8080端口,即jar包所使用的端口
ENTRYPOINT java ${JVM_POTS} ${HEAP_DUMP_OPTS} -jar sc.jar #启动容器后自动执行的命令
apk add是alpine系统下载安装软件的命令
--upgrade 是更新
--no-cache 是不使用缓存
一般在生产环境中是先把基础的alpine镜像制作好,在用dockerfile调用带jdk的alpine镜像在配置把jar把传入镜像 自动启动即可,我这里是都写在了一起,一般生产中不这样用
有时候使用阿里云的源可能会出现问题,遇到更新源报错的时候可以使用一下其它的源,例如华为的源
华为源:repo.huaweicloud.com
3.用dockerfile创建镜像
-t 指定镜像名称和标签
. 指宿主机需要上传文件的路径,即要上传的jar包放在跟dockerfile同一目录或该目录下,执行命令时在dockerfile目录执行即可
这里直接将镜像名称 指定了为上传harbor仓库的路径,使用docker push直接上传即可
docker build -t harbor.apex.com/jdk_app/alpine_jdk8:latest .