Dockerfile的编写

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

构建步骤:

编写一个dockerfile文件
docker build 构建一个镜像
docker run 运行镜像
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区别的内容可以参考这篇文章
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值