Dockerfile文件介绍

Dockerfile

Dockerfile介绍

1、dockerfile是用来构建镜像的文件

​ 1.1编写dockerfile文件

​ 1.2 docker build 创建镜像

​ 1.3 docker run 运行镜像

​ 1.4 docker push 上传镜像

2、执行顺序从上至下

3、#代表注释

4、指令全部是大写

FROM        #设置镜像使用的基本镜像
MAINTAINER  #镜像作者
RUN         #编译镜像时运行的命令
EXPOSE      #镜像暴露的端口
ADD         #复制指定文件到容器中,tar包会自动解压  
COPY        #复制指定文件到容器中,tar包不会自动解压
LABEL       #镜像的标签
VOLUME      #容器的挂载卷
WORKDIR     #镜像的工作目录,即一进入容器时的显示目录,不写默认进入根目录,如果目录不存在,WORKDIR会新建目录
CMD         #容器启动的时候需要运行的命令,当存在多个CMD,只有最后一个CMD会执行,docker run添加参数时替换命令
ENTRYPOINT  #容器启动的时候需要运行的命令,当存在多个ENTRYPOINT,只有最后一个ENTRYPOINT会执行,docker run添加参数时追加命令           
ENV         #设置容器的环境变量,以键值对的形式存在,无法在Dockerfile文件中引用
ARG         #build时存在,可在Dockerfile文件中引用,无法在容器中引用
CMD与ENTRYPOINT的区别
CMD指令(替换)
#编写CMD测试dockerfile文件
$ cat dockerfile-cmd-test 
FROM centos:7.8.2003
CMD echo "aaa"             

#docker build镜像
$ docker build -f dockerfile-cmd-test -t cmd-test .

#运行镜像,会默认执行Dockerfile文件中CMD的命令
$ docker run -it cmd-test
aaa

#docker run后跟命令,ls -al会把echo "aaa"给替换掉
$ docker run -it cmd-test ls -al
total 12
drwxr-xr-x.   1 root root     6 Aug 11 05:54 .
drwxr-xr-x.   1 root root     6 Aug 11 05:54 ..
-rwxr-xr-x.   1 root root     0 Aug 11 05:54 .dockerenv
-rw-r--r--.   1 root root 12114 May  4 17:11 anaconda-post.log
lrwxrwxrwx.   1 root root     7 May  4 17:09 bin -> usr/bin
drwxr-xr-x.   5 root root   360 Aug 11 05:54 dev
drwxr-xr-x.   1 root root    66 Aug 11 05:54 etc
drwxr-xr-x.   2 root root     6 Apr 11  2018 home
lrwxrwxrwx.   1 root root     7 May  4 17:09 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 May  4 17:09 lib64 -> usr/lib64
drwxr-xr-x.   2 root root     6 Apr 11  2018 media
drwxr-xr-x.   2 root root     6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root     6 Apr 11  2018 opt
dr-xr-xr-x. 129 root root     0 Aug 11 05:54 proc
dr-xr-x---.   2 root root   114 May  4 17:11 root
drwxr-xr-x.  11 root root   148 May  4 17:11 run
lrwxrwxrwx.   1 root root     8 May  4 17:09 sbin -> usr/sbin
drwxr-xr-x.   2 root root     6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root     0 Aug  6 08:21 sys
drwxrwxrwt.   7 root root   132 May  4 17:11 tmp
drwxr-xr-x.  13 root root   155 May  4 17:09 usr
drwxr-xr-x.  18 root root   238 May  4 17:10 var

ENTRYPOINT指令(Dockerfile中命令一定会被执行)
$ cat dockerfile-entrypoint-test 
FROM centos:7.8.2003
ENTRYPOINT echo "aaa" 

#docker build镜像
$ docker build -f dockerfile-entrypoint-test -t entrypoint-test .

#运行镜像,会默认执行Dockerfile文件中entrypoint的命令
$ docker run -it entrypoint-test
aaa

#docker run后跟命令,依然会输出aaa。
#原因是shell模式下,任何cmd和run的参数都无法传递到entrypoint中,所以entrypoint推荐使用JSON格式
$ docker run -it entrypoint-test ls -l
aaa
#只有当entrypoint使用JSON格式时,才可传递参数
$ cat Dockerfile
FROM centos:7
ENTRYPOINT ["/bin/echo","aaa"]
$ docker build -t test:v1 .
$ docker run test:v1  ls -l
aaa ls -l
CMD与ENTRYPOINT同时存在
#当CMD与ENTRYPOINT同时存在Dockerfile,并且都是可执行的命令时,只会输出最后的ENTRYPOINT.
#原因之前提过shell模式下,任何cmd和run的参数都无法传递到entrypoint中。
$ cat Dockerfile 
FROM centos:7
ENTRYPOINT echo "aaa"
CMD echo "bbb"
ENTRYPOINT echo "ccc"
CMD echo "ddd"
CMD echo "eee"

$ docker build -t test:v1 .
$ docker run test:v1
ccc

#当CMD与ENTRYPOINT同时存在Dockerfile
#但是CMD不是可执行的命令,如果想将CMD的参数传递给ENTRYPOINY,两个参数的值需要写成JSON格式
$ cat dockerfile-entrypoint-test 
FROM centos:7.8.2003
ENTRYPOINT ["/bin/echo","hello"]
CMD ["world"]
#docker build镜像
$ docker build -f dockerfile-entrypoint-test -t entrypoint-test .

#运行镜像,会执行ENTRYPOINT的hello 在再执行CMD中的world
$ docker run -it entrypoint-test
hello world

#test会将CMD中的参数替换掉
$ docker run -it entrypoint-test test
hello test
总结
1、如果各自单独存在,只会执行最后一个CMD或者ENTRYPOINT。
2、如果同时存在Dockerfile,且都是可执行的命令(即shell模式下),只会执行Dockerfile中最后的ENTRYPOINT,docker run时传递的参数也无效.
  原因是shell模式下,任何cmd和run的参数都无法传递到entrypoint中。
3、如果同时存在Dockerfile,但是CMD与ENTRYPOINT为JSON形式,CMD会作为参数传递给ENTRYPOINT。
编写centos镜像
$ cat mydockerfile 
FROM centos:7.8.2003
MAINTAINER jss<1255109811@qq.com>

RUN yum -y install net-tools
RUN yum -y install vim

ARG SET_MYPATH=/usr/local 
ENV MYPATH $SET_MYPATH       #容器中会存在MYPATH的变量,可直接引用.也可以直接写成ENV MYPATH /usr/local
WORKDIR $MYPATH

EXPOSE 80

CMD echo $MYPATH
CMD echo "----end-----"
CMD /bin/bash  #docker run的时候只会执行/bin/bash,所以docker run命令中可不写/bin/bash也会执行的原因就在这

#-f参数 dockerfile文件名(如果文件名为Dockerfile,可以不加-f参数,会默认读取该文件) 
#-t 镜像名称版本
#最后有.代表当前目录,也可以写远程路径。

有时候我们会发现Dockerfile文件中的引用的文件很少,但是docker build时向Docker daemon中提交的大小有几个G。
原因:docker build . 命令会将Dockerfile所在层级目录下的所有文件打包提交给Docker daemon。
例如:Dockerfile文件在/opt目录下,同时opt目录下还存在其他无用的2G文件,docker build时它会将这无用的文件同样提交给Docker daemon,
所以Dockerfile文件所在的层级下最好不要放无用文件。

$ docker build -f  mydockerfile  -t mycentos:2.0 .
Sending build context to Docker daemon  2.048G
Step 1/3 : FROM centos:7.8.2003
..........
Successfully built 6d50b9d08626
Successfully tagged mycentos:2.0
#表示镜像构建成功
$ docker images    
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
mycentos              2.0                 6d50b9d08626        5 minutes ago       433MB
$ docker run -it mycentos:2.0
$ pwd                 #WORKDIR 定义的工作目录
/usr/local
$ echo $MYPATH        #ENV定义的变量
/usr/local
$ ifconfig            #RUN执行的命令,所以ifconfig与vim命令都可以使用了
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 656 (656.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
编写Tomcat镜像
编写Dockerfile文件
$ ll
总用量 200688
-rw-r--r--. 1 root root  10398269 811 16:15 apache-tomcat-8.5.57.tar.gz
-rw-r--r--. 1 root root       562 811 16:56 Dockerfile
-rw-r--r--. 1 root root 195094741 719 2019 jdk-8u221-linux-x64.tar.gz
-rw-r--r--. 1 root root        22 811 15:24 README.txt

$ cat Dockerfile #已Dockerfile命名文件,build镜像时,不需要-f参数
FROM centos:7.8.2003
MAINTAINER JSS<1255109811@qq.com>

COPY README.txt /opt/sudytech/       #README.txt需要与Dockerfile文件同级目录

ADD  apache-tomcat-8.5.57.tar.gz /opt/sudytech/   #压缩包需要与Dockerfile文件同级目录
ADD  jdk-8u221-linux-x64.tar.gz /opt/sudytech/       


RUN  yum -y install vim
RUN  yum -y install net-tools


EXPOSE 8080

WORKDIR /opt/sudytech/

ENV  JAVA_HOME /opt/sudytech/jdk1.8.0_221
ENV  CLASSPATH $CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
ENV  PATH $JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

CMD  /opt/sudytech/apache-tomcat-8.5.57/bin/startup.sh && tail -f /opt/sudytech/apache-tomcat-8.5.57/logs/catalina.out
构建镜像
$ docker build -t mytomcat .
$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
mytomcat              latest              a727ea78aa9f        6 seconds ago       855MB
运行镜像并外挂文件
$ docker run -d -p 8080:8080 --name tomcat -v /home/tomcattest/webapps/test:/opt/sudytech/apache-tomcat-8.5.57/webapps/test -v /home/tomcattest/logs:/opt/sudytech/apache-tomcat-8.5.57/logs mytomcat
$ pwd
/home/tomcattest/webapps/test
$ ll
总用量 4
-rw-r--r--. 1 root root 319 811 16:44 index.jsp
drwxr-xr-x. 2 root root  21 811 16:50 WEB-INF
$ cd WEB-INF/
$ ll
总用量 4
-rw-r--r--. 1 root root 279 811 16:48 web.xml

$ cat web.xml 
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
 xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
</web-app>

$ cat index.jsp 
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
    <head>
           <title>第一个 JSP 程序</title>
    </head>
    <body>
        Hello World<br>
           <%
                  System.out.println("Hello World!");
           %>
    </body>
</html>
浏览器访问测试

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值