Dockerfile的编写

本文详细介绍了Dockerfile的使用,包括基本概念、常用指令及其实例,如FROM、MAINTAINER、RUN、ADD、COPY、WORKDIR、VOLUME、EXPOSE、CMD和ENTRYPOINT等。通过一个SpringBoot应用的例子,展示了如何编写Dockerfile来构建和运行镜像。此外,还解释了Docker构建镜像、运行容器和发布镜像的流程。

Dockerfile是用来构建docker镜像的文件,是一个命令参数脚本。DockerFile是面向开发的,发布项目的时候需要做镜像,就要编写dockerfile文件。如果对docker还不太了解的小伙伴,请先移步浅谈Docker

构建步骤:

  1. 编写一个dockerfile文件
  2. docker build 构建一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub、阿里云从仓库等)

Dockerfile

基础知识

1、每个指令都必须是大写字母;

2、执行顺序从上到下;

3、#表示注释;

4、每一个指令都会提交一个新的镜像层,并提交。

# DockerFile常用指令 
FROM # 基础镜像,一切从这里开始构建 
MAINTAINER # 镜像是谁写的, 姓名+邮箱 
RUN # 镜像构建的时候需要运行的命令 
ADD # 拷贝文件(支持正则表达式)到镜像,并自动解压(如果是压缩包) 
WORKDIR # 镜像的工作目录 
VOLUME # 挂载的目录 
EXPOSE # 保留端口配置 
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。 
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令 
COPY # 类似ADD,将我们文件拷贝到镜像中 
ENV # 构建的时候设置环境变量!

一个SpringBoot的小例子

FROM java:8

#此处的*为正则表达式,表示以.jar结尾的同步录下的文件(这里的jar是maven打包好的)
COPY *.jar /app.jar

CMD ["--server.port=8080"]

EXPOSE 8080

ENTRYPOINT ["java","-jar","/app.jar"]

常用命令的用法

FROM - - -指定基础镜像

如果本地不存在基础镜像,则首先从DockerHub拉去下来。

FROM java:8  # java可替换成任意镜像名,":"是可选项,后接版本,如果不指定版本则默认使用latest

MAINTAINER - - - 指定Dockerfile制作人的信息

MAINTANIER "yxzhang <5xxxxxxxxxx@qq.com>"

COPY - - - 把宿主机的文件复制到镜像中

COPY src desc

其中src表示宿主机上的路径(支持通配符,如*和?;通常使用相对路径);

desc表示目标镜像中的路径(通常使用绝对路径,如果不存在会被自动创建,包括父目录)。

Note:如果src是目录,则其内部文件或子目录会被递归复制,但src目录自身不会被复制。

ADD - - - 与COPY命令类似

ADD src desc

与COPY不同的是,ADD可以访问url路径,会访问网络进行下载,档到本地后打包到镜像。

此外,如果src是压缩包的话,会自动进行解压;但通过url获取的tar文件不会被展开。

WORKDIR - - - 指定工作目录

WORKDIR /usr/local/

默认的镜像工作目录是在根目录下,如果使用WORKDIR命令指定了工作目录在 /usr/local/ 下,则如果使用命令 ADD nginx-1.14.2.tar.gz ./ ,此时nginx压缩包就被拷贝到 /usr/local/ 下面,而非默认的根路径下。

VOLUME - - - 卷挂载

VOLUME /data/mysql

运行时会在会随机在宿主机的目录下生成一个卷目录,该命令只能定义docker管理的卷。如果要实现指定路径形式的挂载,需要在创建好镜像以后用 docker run -v aaa:bbb 的方式指定。

EXPOSE - - - 为容器打开指定的要监听的端口以实现与外部通信

EXPOSE port

port 为 0-65535 中的一个整数,暴露容器将要提供服务所开放的端口。例如 nginx 暴露的端口为80。但通过这种方式,宿主机每次与容器映射的端口是随机的,也可以在 docker run -p 8888:80 进行端口的映射绑定。

ENV

用于为镜像定义所需要的环境变量,并可以被Dockerfile中位于其后面的其他命令调用,例如:

ENV JAVAPATH /usr/local	# 指定JAVAPATH变量的值为/usr/local/
ENV PATH $JAVAPATH/bin  # 利用 $ 引用上面的JAVAPATH

RUN

构建镜像时需要执行的命令。例如在一个拉去下来的centos中安装vim工具:

FROM centos
RUN yum -y install vim

CMD

指定容器在运行时(执行docker run)的时候要执行的命令,只有最后一条命令生效,可被替代。

CMD ["ls","-a"]

ENTRYPOINT

用法和 CMD 相似,但是我们可以在 docker run 后面追加参数,会作为 ENTRYPOINT 的参数,即不会被覆盖。如果 docker run 后面没有额外的东西,但是 CMD 有,那么cmd的全部内容会作为 entrypoint 的参数。

更详细的关于CMD和ENTRYPOINT区别的内容可以参考这篇文章

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值