Dockerfile 详解

Dockerfile 详解

在这里插入图片描述

一、Dockerfile概述

Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义的镜像。

Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。一般而言,Dockerfile 分为四部分:基础镜像信息维护者信息镜像操作指令容器启动时执行指令

二、构建镜像命令

1、命令:docker build

2、作用:将 Dockerfile 文件构建成镜像

3、语法:docker build -f 文件名 -t 镜像名称:版本 .

. 代表 Dockerfile 文件在当前路径

-f 可以指定 Dockerfile 文件名,一般文件名为 Dockerfile

-t 可以定义镜像名称以及版本

注意:构建镜像一般是在 Dockerfile 文件所在的目录去构建的

[root@localhost opt]# vim Dockerfile 
    FROM openjdk:8
    MAINTAINER huhai
    CMD echo "Hello Doker!"
[root@localhost opt]# docker build -t test:1.0 .
Sending build context to Docker daemon 618.2 MB
Step 1/3 : FROM openjdk:8
 ---> b273004037cc
Step 2/3 : MAINTAINER c
 ---> Running in 515cebaac130
 ---> 12c10f87abc6
Removing intermediate container 515cebaac130
Step 3/3 : CMD echo "Hello Doker!"
 ---> Running in 12e0b57f87e5
 ---> 837916b31a37
Removing intermediate container 12e0b57f87e5
Successfully built 837916b31a37
[root@localhost opt]# docker run -it test:1.0
Hello Doker
#-f可以使用指定的Dockerfile文件名
[root@localhost opt]# docker build -f Dockerfile02 -t test:2.0 .
......
#在其他目录构建报错
[root@localhost home]# docker build -f /opt/Dockerfile02 -t test:3.0 .
unable to prepare context: The Dockerfile (/opt/Dockerfile02) must be within the build context (.) #Dockerfile必须在构建上下文中

三、常见的13种指令

1、FROM

1)指令作用:指定基础镜像,必须为第一个命令

2)指令格式:FROM 镜像名称:版本(若不指定版本则默认使用 latest 版本)

FROM openjdk:8
2、MAINTAINER

1)指令作用:指定维护者信息

2)指令格式:MAINTAINER 维护者信息

维护者信息可为名字,也可为邮箱,也可为名字加邮箱

MAINTAINER huhai
MAINTAINER huhai<huhai@qq.com>
3、RUN

1)指令作用:构建镜像时执行的命令

2)指令格式:

​ shell 格式:RUN 命令

​ exec 格式:RUN [“可执行文件”,“参数1”,“参数2”]

RUN 指令创建的中间镜像会被缓存,并在下次构建汇中使用。在构建时使用 --no-cache 参数可以不使用缓存镜像,如:docker build --no-cache

RUN mkdir docker
RUN echo "test" > test.info
4、CMD

1)指令作用:构建容器后调用,即在容器启动时才进行调用

2)指令格式:

​ shell 格式:CMD 命令

​ exec 格式:CMD [“可执行文件”,“参数1”,“参数2”]

CMD 与 RUN 的不同点:

CMD 用于指定在容器启动时所要执行的命令,而 RUN 用于指定镜像构建时所要执行的命令

CMD echo "Hello Dockerfile!"
CMD ["/usr/bin/wc",“--help”]
5、WORKDIR

1)指令作用:指定工作目录,类似于 cd 命令

2)指令格式:WORKDIR 目录名

通过 WORKDIR 命令设置工作目录后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。

在使用 docker run 运行容器时,可以通过 -w 参数覆盖构建时所设置的工作目录。

WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)

WORKDIR /opt
RUN mkdir docker
6、ADD

1)指令作用:将本地文件添加到容器中,tar 类型的文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似于 wget

2)指令格式:ADD 宿主机文件位置 容器中文件位置

可以使用模糊查询添加多个符合条件的文件,例如:ADD hello* /opt,添加所有 hello 开头的文件

ADD /opt/apache-tomcat-8.5.27.tar.gz /opt
7、COPY

1)指令作用:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。

2)指令格式:COPY 宿主机路径 容器内路径

COPY ./start.sh /start.sh
8、ENTRYPOINT

1)指令作用:配置容器,使其可执行化。指定容器启动时要运行的命令,可以追加命令,与 CMD 一样,但有不同之处

2)指令格式:

​ ENTRYPOINT [“可执行文件”,“参数1”,“参数2”]

​ ENTRYPOINT 命令 参数1 参数2(shell内部命令)

通过 docker run 执行的命令不会覆盖 ENTRYPOINT,而 docker run 命令中指定的任何参数,都会被当做参数再次传递给 ENTRYPOINT 。

Dockerfile 中只允许有一个 ENTRYPOINT 命令,多指定时会覆盖前面的设置,而只执行最后的 ENTRYPOINT 指令。

二者区别:

  • CMD #指定这个容器启动的时候要运行的命令,可被替换
  • ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ENTRYPOINT ["top","-b"]
9、ENV

1)指令作用:用于设置环境变量,下面指令和容器中的程序都可以使用此处定义的环境变量

2)指令格式:ENV key=value

一次只能设置一个变量,但可以设置多个变量,每个变量为一个 key=value 的键值对

如果 key 中包含空格,可以使用 \ 来进行转义,也可以通过 “” 来进行标示

反斜线也可以用于续行

ENV JAVA_HOME=/usr/local/jdk1.8.0_333
ENV PATH=$JAVA_HOME/bin:$PATH
10、EXPOSE

1)指令作用:指定与外界交互的端口

2)指令格式:EXPOSE 端口号

EXPOSE 并不会让容器的端口访问到主机。要使其可访问,需要在 docker run 运行容器时通过 -p 参数来发布这些端口。

EXPOSE 8080
11、VOLUME

1)指令作用:用于指定持久化目录

2)指令格式:VOLUME [“挂载卷地址”,…]

一个卷可以存在于一个或多个容器的指定目录,改目录可以绕过联合文件系统,并具有一下功能:

  • 卷可以容器间共享和重用
  • 容器并不一定要和其它容器共享卷
  • 修改卷后会立即生效
  • 对卷的修改不会对镜像产生影响
  • 卷会一直存在,直到没有任何容器在使用它
VOLUME ["/opt/my_data"]
VOLUME ["/opt/my_data","/opt/test"]
12、USER

1)指令作用:以什么用户去运行

2)指令格式:USER 用户

使用 USER 指定用户后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT 都将使用该用户

镜像构建完成后,通过 docker run 运行容器时,可以通过 -u 参数来覆盖所指定的用户

13、ONBUILD

1)指令作用:帮助其他容器生成,即指令后的命令不在此次镜像构建中运行,会在其他继承此镜像的镜像中运行

2)指令格式:ONBUILD 其他指令

FROM centos
WORKDIR /data
ONBUILD RUN mkdir test

#test:1.0为上面Dockerfile文件构建
FROM test:1.0

四、Dockerfile构建Tomcat镜像实战

#基础镜像
FROM java:8
#维护者信息
MAINTAINER huhai
#拷贝tomcat包
ADD /opt/apache-tomcat-8.5.27.tar.gz /usr/local
#设置工作目录
WORKDIR /usr/local
#设置环境变量
ENV TOMCAT_HOME=/usr/local/apache-tomcat-8.5.27
ENV PATH=$PATH:$TOMCAT_HOME/bin
#保留端口
EXPOSE 8080
#启动容器命令
CMD startup.sh && tail -F /usr/local/apache-tomcat-8.5.27/bin/catalina.bat
[root@localhost opt]# docker build -t tomcat:1.0 .
[root@localhost opt]# docker run -d --name my_tomcat -p 8080:8080 tomcat:1.0
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我真真的是小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值