dockerfile

一、简介

从应用软件的角度看,DockerFile,Docker镜像与Docker容器分别代表软件的三个不同阶段

    #DockerFile是软件的原材料
    #Docker镜像是软件的交付品
    #Docker容器可以认为是软件的运行态

 DockerFile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石

如图

#是什么
    Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。

#常用命令
    FROM             定义了使用哪个基础镜像启动构建流程
    MAINTAINER   镜像维护者的姓名和邮箱
    RUN                 容器构建时需要的命令
    EXPOSE            容器对外暴漏的端口

    ENV                  设置环境变量 (可以写多条)
    WORKDIR         终端默认登陆进来的落脚点   
    ADD                 将宿主机目录下的文件拷贝进镜像,并且会自动处理URL和解压tar包
    copy                类似ADD,只不过没有解压功能
    VOLUME           容器数据卷,用于数据保存和持久化
    CMD                指定一个容器启动时的命令,
          dockerfile中有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

    ENTRYPOINT           同上


    ONBUILD    当构建一个被继承的dockerfile时运行命令,父镜像在被子镜像继承后父镜像的onbuild会触发

 1、自定义centos

[root@linuxxx ~]# docker pull centos        #新拉下来一个centos镜像

[root@linuxxx ~]# docker run -it centos /bin/bash     #运行镜像

[root@220f2981c7b6 /]# pwd           #落脚点是根
/
[root@220f2981c7b6 /]# vim a.txt        #精简版的centos,不支持vim
bash: vim: command not found
[root@220f2981c7b6 /]# ifconfig               #不支持ifconfig
bash: ifconfig: command not found

---------------------------------------
#此时想给centos定制自己需要的功能

[root@linuxxx /]# mkdir mydocker      #创建文件夹

[root@linuxxx /]# cd /mydocker/         #进入文件夹
 
[root@linuxxx mydocker]# vi dockerfile        #编写dockerfile文件
------------------------------------------------
#编写内容如下
FROM centos
MAINTAINER moker<moker@1231.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

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

EXPOSE 80

CMD echo $MYPATH
CMD echo "success------ok"
CMD /bin/bash


--------------------------------------------
#然后绑定,注意最后有一个点
[root@linuxxx mydocker]# docker build -f /mydocker/dockerfile -t  mycentos:1.6 .

  #发现自定义的centos比较大,dockers只把最需要的内核留下来,其他的舍弃
[root@linuxxx mydocker]# docker images   
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mycentos            1.6                 23dad1e39517        2 minutes ago       481MB
centos              latest              9f38484d220f        4 months ago        202MB


[root@linuxxx mydocker]# docker run -it mycentos:1.6    #运行自定义的
[root@9c69ba4ba1de local]#  
[root@9c69ba4ba1de local]# 
[root@9c69ba4ba1de local]# pwd        #落脚点是自己定义的
/usr/local
[root@9c69ba4ba1de local]# 
[root@9c69ba4ba1de local]# 
[root@9c69ba4ba1de local]# vim a.txt       #有vim了
[root@9c69ba4ba1de local]# cat a.txt
Moker
[root@9c69ba4ba1de local]# ifconfig        #支持ifconfig了
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
自定义centos

2、CMD与ENTRYPOINT

#共同点
  都是指定一个容器启动时要运行的命令

#不同点
     Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换
    ENTRYPOINT  docker run 之后的参数会当作参数传递给ENTRYPOINT,之后形成新的命令组合

------------------------------------------------------------------
例:
#1、会正常执行dockerfile中的最后一行
  [root@linuxxx ~]# docker run -it -p 8888:8080 tomcat 
    CMD["catalina.sh","run"]
#2、会在最后一行追加一行CMD,并且只执行最后一行添加的
  [root@linuxxx ~]# docker run -it -p 8888:8080 tomcat  ls -l 
    CMD["catalina.sh","run"]
    CMD ls -l
#CMD
[root@linuxxx /]# cd mydocker/
[root@linuxxx mydocker]# vi dockerfile1

----------------------------------
FROM centos
RUN yum install -y curl     #下载curl
CMD ["curl","-s","http://ip.cn"]
#执行docker run -it myip -i
#相当于
    CMD ["curl","-s","http://ip.cn"]
    CMD ["-i"]

----------------------------
[root@linuxxx mydocker]# docker build -f /mydocker/dockerfile1 -t myip .
[root@linuxxx mydocker]# docker run -it myip

[root@linuxxx mydocker]# docker run -it myip -i

#报错
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: "-i": executable file not found in $PATH": unknown.


--------------------------------------------------------
[root@linuxxx mydocker]# cp dockerfile1 dockerfile2
[root@linuxxx mydocker]# vi dockerfile2
-----------------------------
FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","http://ip.cn"]

# 执行这一句,docker run -it myip1 -i
    相当于ENTRYPOINT ["curl","-s","i"  ,"http://ip.cn"]


---------------------------------
[root@linuxxx mydocker]# docker build -f /mydocker/dockerfile2 -t myip1 .
[root@linuxxx mydocker]# docker run -it myip1 -i 

#可以正常输出结果
HTTP/1.1 301 Moved Permanently
Date: Wed, 07 Aug 2019 09:12:27 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: max-age=3600
Expires: Wed, 07 Aug 2019 10:12:27 GMT
Location: https://ip.cn/
Server: cloudflare
CF-RAY: 502821016efc92b6-SJC
CMD与ENTRYPOINT练习
原文地址:https://www.cnblogs.com/pdun/p/11315089.html