DockFile:DockFile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
官网:https://docs.docker.com/engine/reference/builder/
构建三部曲:
- 编写dockFile文件
- docker build命令构建镜像
- docker run 根据镜像运行容器实例
dockFile内容基础知识:
docker执行dockerFile的大致流程:
DockerFile常用保留字指令:
- FROM:基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是FROM
- MAINTAINER:镜像维护者的姓名和邮箱地址
- RUN:容器构建时需要运行的命令,有两种格式:
- shell格式:RUN <命令行命令> 例如:RUN yum -y install vim
- exec格式:RUN ["可执行文件","参数1","参数2"] 例如:RUN["./test.php","dev","offline"]
- EXPOSE:当前容器对外暴漏出的端口
- WORKDIR:指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
- USER:指定该镜像以什么样的用户去执行,如果不指定那默认就是root
- ENV:用来在构建镜像过程中设置环境变量
- ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
- COPY:
- VOLUME:容器数据卷,用于数据保存和持久化工作
- CMD:指定容器启动后要干的事情,注意DockFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换;CMD和RUN命令的区别:CMD是在docker run时运行,RUN是在docker build时运行。
- ENTRYPOINT:也是用来指定一个容器启动时要运行的命令,类似于CMD指令,但是ENTRYPOINT不会被docker run 后面的命令覆盖,而且这些命令行参数会被当做参数送给ENTRYPOINT指令指定的程序。
ENTRYPOINT命令格式:ENTRYPOINT ["<executeable>" , "<param1>" , "<param2>" , ......]
优点:在执行docker run的时候可以指定ENTRYPOINT运行所需的参数
注意:如果dockerFile中存在多个ENTRYPOINT指令,仅最后一个生效
最后总结:
案例实战:自定义镜像mycentosjava8
首先下载好centos镜像
需求:centos7镜像具备vim + config + jdk8
jdk下载地址:Java Downloads | Oracle
编写DockFile文件:
首先在根目录下创建一个myfile的文件夹:
将jdk的压缩包传送到该文件夹下:
然后在该文件夹下新建一个DockerFile文件:
注意名字要是Dockerfile)文件内容如下:
FROM centos:7
MAINTAINER hanansheng<1847347046@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u351-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u351-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_351
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
构建新镜像:在myfile下执行命令
docker build -t 新镜像名字:TAG .
// docker build -t centosjava8:1.5 .
注意:TAG后面有个空格,空格后还有个.
不出意外的话执行完命令就可以了,如下图所示:
可以看到由于新加了很多东西,镜像内容大小也变大了很多
运行新镜像:docker run -it 新镜像名字:TAG
测试:vim ifconfig java-version命令都已生效!!!
虚悬镜像:仓库名、标签名都为<none>的镜像,俗称dangling image
查看虚悬镜像:docker image ls -f dangling=true
删除虚悬镜像:docker image prune