DockerFile简介
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于操作系统(centos或者Ubuntu)基础镜像并最终创建的一个新镜像;
Dockerfile,用脚本方式来构建自动化,可复用的,高效率的创建镜像方式,是企业级开发的首选方式;
在软件系统开发生命周期中,采用Dockerfile来构建镜像;
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作;
3、对于运维人员:在部署时,可以实现应用的无缝移植。
DockerFile常用指令
FROM image_name:tag
定义了使用哪个基础镜像启动构建流程
MAINTAINER user_info
声明镜像维护者信息
LABEL key value
镜像描述元信息(可以写多条)
ENV key value
设置环境变量(可以写多条)
RUN command
构建镜像时需要运行的命令(可以写多条)
WORKDIR path_dir
设置终端默认登录进来的工作目录
EXPOSE port
当前容器对外暴露出的端口
ADD source_dir/file dest_dir/file
将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file
和ADD相似,但是如果有压缩文件是不能解压
VOLUME
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等
CMD
指定容器启动时要运行的命令,假如有多个CMD,最后一个生效
ENTRYPOINT
指定容器启动时要运行的命令
ONBUILD
当构建一个被继承的Dockerfile时运行的命令,父镜像在被子镜像继承后父镜像的onbuild被触发。可以把ONBUID理解为一个触发器。
当构建一个被继承的Dockerfile时运行的命令,父镜像在被子镜像继承后父镜像的onbuild被触发。可以把ONBUID理解为一个触发器。
编写Dockerfile的时候,其他命令都是为了自身镜像服务的,只有ONBUILD是为了子镜像服务;
简单实例:父镜像Dockerfile:
FROM centos
ONBUILD RUN yum -y install vim
CMD /bin/bash子镜像简单点:
FROM parent一句即可;
当构建子镜像的时候,父镜像的ONBUILD会触发,子镜像直接安装vim;
实际应用,一般是ONBUILD里执行的是一些父镜像暂时无法执行的东西,比如一些COPY,ADD,可以启动一些服务,父镜像当做模板一些,仅仅提供基础支持,然后具体实行是子镜像操作。
DockerFile构建自定义centos
编写DockerFile
FROM centos MAINTAINER caofeng构建 docker build -f myCentosDockerFile -t java1234/mycentos:1.1 .(注意必须有.作为结束) 有坑及解决办法:LABEL name="Java1234 CentOS Image" build-date="20191112" ENV WORKPATH /home/ WORKDIR $WORKPATH RUN yum -y install net-tools RUN yum -y install vim EXPOSE 80 CMD /bin/bash
完美解决:
#参考:https://www.jianshu.com/p/6f101fb53a4f
#在宿主机执行
$ nmcli dev show | grep 'IP4.DNS'
#出现
IP4.DNS[1]: x.x.x.x
IP4.DNS[2]: x.x.x.x
#在/etc/docker目录下创建文件daemon.json
## 此处的dns是填写你前面查询出来的
## 有几个写几个
{
"dns": ["x.x.x.x", "x.x.x.x"]
}
#示例文件如下
{
"registry-mirrors": ["https://nrbewqda.mirror.aliyuncs.com"],
"dns": ["208.116.3.201"]
}
#重启docker
sudo service docker restart
运行 docker run -it 镜像ID查看镜像历史 docker history 镜像ID
DockerFile构建自定义Tomcat
编写DockerFile
DockerFile构建自定义Tomcat的需要的JDK和TOMCAT归档-系统集成文档类资源-CSDN下载
FROM centos MAINTAINER caofeng构建 docker build -f myTomcatDockerFile -t java1234/myTomcat:1.1 .LABEL name="Java1234 Tomcat Image" build-date="20191115" COPY copyright.txt /home/copyright.txt ADD server-jre-8u151-linux-x64.tar.gz /home/ ADD apache-tomcat-8.5.37.tar.gz /home/ ENV WORKPATH /home/apache-tomcat-8.5.37/ WORKDIR $WORKPATH ENV JAVA_HOME /home/jdk1.8.0_151 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /home/apache-tomcat-8.5.37/ ENV CATALINA_BASE /home/apache-tomcat-8.5.37/ ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD ["/home/apache-tomcat-8.5.37/bin/catalina.sh","run"]
运行 docker run -it -p 80:8080 镜像ID
DockerFile通过VOLUME实现容器卷
介绍
编写DockerFileVOLUME['/home/v1','/home/v2']
说明:前面用启动命令 -v 宿主机目录:容器卷目录 来实现容器卷目录挂载
但是由于定义Dockerfile的时候,并不能保证在所有的宿主机上都有这样的特定目录,
所以在Dockerfile定义中,只能指定容器卷目录;
FROM centos VOLUME ["/home/v1","/home/v2"] CMD /bin/bash构建 docker build -f myVolumeDockerFile -t java1234/mytest:1.1 .
运行 docker run -it 镜像ID
测试
运行后,我们进入home目录,找到v1,v2两个容器卷目录;
然后我们通过 docker inspect 容器ID 来查看下默认生成的容器卷对应的宿主机目录
通过新建文件和 修改,我们发现,能实现同步,没毛病;
个人认为,要实现容器卷,还是通过前面讲得-v启动命令,用dockerfile方式,比较操蛋,宿主机目录不能自定义;
CMD, ENTRYPOINT 的区别和联系
CMD语法;
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
第一种用法:运行一个可执行的文件并提供参数。
第二种用法:为ENTRYPOINT指定参数。
第三种用法(shell form):是以”/bin/sh -c”的方法执行的命令。ENTRYPOINT 语法;
ENTRYPOINT [“executable”, “param1”, “param2”] (exec 格式, 推荐)
ENTRYPOINT command param1 param2 (shell 格式)我们一般开发 官方都建议用 exec格式;好使;
下面我们通过一些简单实例,来具体看下CMD, ENTRYPOINT 的实际用法;
第一个dockerfile
FROM centos
CMD echo "abc"
#CMD ["/bin/echo", "defg"]我们可以运行测试,看看结果,以及把第二个CMD去掉 看看结果;
以及 运行命令后面跟运行参数 看看结果;能明白CMD多个的话 只有最后一个生效;第二个dockerfile
FROM centos
ENTRYPOINT ["ls"]
CMD ["-l"]这个dockerfile 我们用 ENTRYPOINT 执行一个ls命令 然后CMD 追加参数
相当于这个CMD是默认的一个参数 假如需要更换参数 启动的时候 ,我们直接替换即可;



