一、简介
从应用软件的角度看,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
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