docker 从入门到实战 -- Dockerfile 篇

本文详细介绍了Dockerfile的各个指令,包括FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、COPY、ADD等,以及如何使用它们来构建一个基于alpine-glibc的基础镜像上的JDK8环境。通过示例展示了如何编写Dockerfile,然后构建并运行镜像,验证JDK环境的有效性。最后提到了如何将镜像推送到Dockerhub。
摘要由CSDN通过智能技术生成

前言:

        之前写过一 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,留待以后使用

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值