前言:
之前写过一 docker 入门篇 docker 从入门到实战 -- 简介和命令篇_清泉影月-CSDN博客,下面研究一下 Dockerfile 的编写。
一、Dockerfile 基本结构
Dockerfile 是用来描述 docker 镜像的文件,保证一次编辑可多地运行并得到相同镜像。Dockerfile 严格遵守一系列编辑指令,有严谨的格式要求。一般情况下不建议修改文件名,除非有多个 Dockerfile 文件(build 时使用 -f 参数指定文件)。
二、Dockerfile 编辑指令
1. 指定基础镜像
FROM <imagesName:tag>
2. 设置维护者信息
MAINTAINER Name <email>
3. 构建指令
两种格式:
RUN <shell-cmd>
RUN ["程序名","参数1","参数2","..."]
RUN 主要是为了镜像构建过程中能够执行一些操作,例如创建配置文件。
4. 设置镜像环境
两种格式:
ENV <key> <value>
ENV <key>=<value>
有点类似 linux 使用 export 设置环境变量。
5. 文件复制
COPY <local-file> <image-path-file>
COPY 指令只能用来复制,类似 linux 下的 cp 命令。
6. 文件添加
ADD <file> <image-path-file>
ADD 指令类似 COPY ,但是 ADD 可以添加 url 下载的文件到镜像,也可以把压缩文件解压到镜像指定目录;单纯的文件复制建议使用 COPY。
7. 暴露端口
EXPOSE <端口> [<端口>...]
eg:
EXPOSE 80
EXPOSE 8080 9000
EXPOSE 指令是暴漏容器端口的,可以理解为只是一个声明,真正的端口映射还是需要 使用:
docker run -p [宿主机port]:[容器port]
8. 设置镜像启动命令
CMD ["程序名","参数1","参数2","..."]
eg:
CMD ["java","-version"]
Dockerfile 只允许使用一次 CMD 命令,多个 CMD 会以最后一个为准;一般放在 Dockerfile 最后,用于容器启动时执行,可以被 docker run 后的命令覆盖。
9. 设置接入点
ENTRYPOINT <shell-cmd>
ENTRYPOINT ["程序名","参数1","参数2","..."]
跟 CMD 类似,一般不会跟 CMD 一起出现,在构建镜像时 CMD 和 ENTRYPOINT 必须得有一个。
10. 设置数据卷
VOLUME ["目录1","目录2","..."]
eg:
VOLUME /home
VOLUME ["/home","/usr"]
VOLUME 主要解决的是容器跟宿主机的目录共享,设置数据卷以后容器的该目录在宿主机下有对应目录(docker inspect 可查看)。另外,容器运行产生的文件在容器删除后就没了,如果设置了数据卷,其对应的目录仍然存在宿主机上。这个功能跟 docker run -v 用法类似,唯一的区别是,v 参数可以指定共享目录,而 VOLUME 是随机生成共享目录。
11. 设置工作目录
WORKDIR <宿主机目录>
指明 CMD、RUN、ENTRYPOINT 指令的工作目录,可被 docker run -w 覆盖。
12. 设置构建变量
ARG <key>[=<value>]
可以指定变量的值;也可以只声明变量,在 docker build --build-arg <key>=<value> 传入变量值。
13. 容器健康检查
HEALTHCHECK [选项] CMD <命令>
参数:
–interval=<间隔>:两次健康检查的间隔,默认为 30 秒;
–timeout=<时长>:健康检查命令运行超时时间,如果超时,本次健康检查就被视为失败,默认 30 秒;
–retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。
三、从 apline 基础镜像搭建一个 jdk8 的镜像
1. 安装 docker 环境
2. 找基础镜像
apline 基础镜像只有几兆大小,但是搭建环境需要安装 glibc,为了简单所以找了一个alpine-glibc 镜像,大概十几兆。
3. 下载 jdk 到服务器
4. 编写 Dockerfile
FROM frolvlad/alpine-glibc:latest
MAINTAINER qingquangyingyue suquanc@foxmail.com
ADD jdk-8u301-linux-x64.tar.gz /usr/java/
ENV JAVA_HOME=/usr/java/jdk1.8.0_301
ENV PATH=$PATH:${JAVA_HOME}/bin
CMD ["java","-version"]
5. jdk 文件和 Dockerfile 放在同一个目录
6. 运行构建命令
docker build -f Dockerfile-jdk8u301 -t alpine_jdk8u301 .
构建过程和结果如下:
7. 从镜像构建容器
可以看到jdk环境有效的,并且 CMD 指令也执行了。
备注:docker run 需要加 -itd 参数才可以保证容器正常使用。
8. 镜像推到 docker hub,留待以后使用