一、Dockerfile基本知识(一定要看懂不然案例不好懂)
-
Dockerfile是用来构建docker镜像的文本文件是有一系列的指令和参数构成的
-
如下docker原理图Dockerfile是通过独立一次性构建镜像的:
-
dockerfile内容之保留字指令及基础知识:
-
---保留字指令必须大写(来源于docker官网)且后面必须至少跟随一个参数
---指令会按照从上到下依次执行
---#表示注释
---每一条指令都会创建一个新的镜像层并且提交
-
docker执行dockerfile流程(了解)
-
*Dockerfile相当于是软件的原材料
*Docker镜像相当于是软件的交付产品
*Docker容器相当于是软件的运行状态即镜像运行为容器
-
Dockerfile需要定义一个dockerfile,dockerfile定义了一个软件运行进程的所有需要的东西,比如执行的代码,环境变量,依赖包,运行时的环境,链接库操作系统的等等
Docker镜像,使用dockerfile定义了一个文件之后,一旦docker build就会产生一个你的docker镜像,运行docker镜像就会开启一个docker容器,镜像反解析就是dockerfile
Docker容器,直接提供服务的。
-
dockerfile常用的保留字指令:
-
官方提供信息来源:https://github.com/docker-library/tomcat
---FROM:基础镜像,当前的新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,dockerfile第一条必须是FROM
---MAINTAINER:镜像的维护者姓名和邮箱
---RUN:容器构建时需要运行的指令,有shell和exec两种格式,再docker build时运行;比如shell 格式:RUN yum -y install vim。Exec格式:RUN ["./test.php","dev","offline"]就类似于:RUN ./test.php dev offline
---EXPOSE:当前容器对外暴露的端口
---WORKDIR:指定再创建容器后,终端默认登录进来的工作目录,一个落脚点;比如:登录到乌班图:
落脚点是"/"
而登录到tomcat落脚点是/usr/local/tomcat:
为什么落脚点不同就是因为配置的WORKDIR不同!
---USER:指定运行该镜像的是什么样的用户,如果不指定就是root,一般不指定
---ENV:用于在构建镜像时指定设置环境变量,这个环境变量可以在限免在任何一个RUN或和其他指令中使用比如:ENV MY_PATH /usr/mytest设置环境变量之后在WORKDIR $MY_PATH
---ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
---COPY:类似于ADD将从构建上下文目录中<源路径>文件/复制到新的镜像的<目标路径>位置比如:COPY src dest或者---->COPY ["src","dest"]:------>src是源路径,dest就是指定路径,可以不事先创建dest
---VOLUME:容器卷用于数据保存和持久化
---CMD:容器启动后要做的事,两种格式:shell格式和exec格式,dockerfile可以有多个CMD指令但是只有最后一个CMD指令生效,并且CMD可以被docker run 后面的参数代替
为什么或被代替呢?举例说明比如:启动tomcat:在指令:docker run -it -p 8080:8080 "id"之后没有加参数正常启动了,可以访问;但是当加了参数:docker run -it -p 8080:8080 "id"/bin/bash这样原来的参数就会被代替,再次访问就不能正常访问了!也就是说:原来的是: 后来成了紫色部分就替代了原来的 :
---ENTRYPOINT:也是用来指定一个容器启动时要运行的命令,类似于CMD但是不会被docker run后面的参数覆盖并且如果和CMD一块使用那么CMD就相当于给ENTRYPOINT传参,也就是说当出现ENTRYPOINT和CMD时CMD的含义就会发生变化,不再是运行时执行它而是传递参数给ENTRYPOINT指令。
有如下案例(CMD就会被docker run后面的参数替换):
## 二、案例实战(Dockerfile)
自定义镜像mycentos-vim-ifconfig-Java8,要求具备vim ,ifconfig,java8功能:
编写Dockerfile(最好是D大写和官网一致):
(1)新建一个myfile目录在/下:mkdir myfile
(2)在里面要放置好以及下载好的jdk: jdk-8u411-linux-x64.tar.gz和新建一个文件 Dockerfile在里面添加代码:
bash
FROM centos:7.6.1810
MAINTAINER alibaixiu<alibaixiubs@126.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig
RUN yum -y install net-tools
#安装java8
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD把jdk添加到容器中安装包必须和Dockerfile文件在同一目录下
ADD jdk-8u411-linux-x64.tar.gz /usr/local/java/
#配置Java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_411
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
这段代码的意思是:
这 Dockerfile 的目的是创建一个基于 CentOS 7.6.1810 镜像的 Docker 镜像,其中包含了一些软件的安装和环境变量的配置。具体来说:
-
指定了镜像基础为 CentOS 7.6.1810 并设置了维护者信息alibaixiu<alibaixiubs@126.com>。
-
设定了环境变量 MYPATH 为 /usr/local,并将工作目录切换至 $MYPATH。
-
安装了 vim 编辑器和 net-tools 包。
-
安装了 glibc 的 32 位版本。
-
在 /usr/local 目录下创建了 java 目录,并将 jdk-8u411-linux-x64.tar.gz 添加到该目录中。
-
配置了 JAVA_HOME、JRE_HOME、CLASSPATH 和 PATH 等 Java 相关环境变量。
-
暴露了容器的 80 端口。
-
最后设置了三个 CMD 指令,分别输出 $MYPATH 的值,打印 "success.......ok",以及启动一个交互式的 bash shell。
请注意,Dockerfile 中的指令将会按照顺序执行,以构建一个包含指定软件和环境配置的 Docker 镜像。
需要强调的是:一定要把Dockerfile和jdk-8u411-linux-x64.tar.gz添加在同一个位置!!!
然后需要执行指令: docker build -t centosjava8:1.5 . 注意最后面是一个点前面有一个空格。
再查看镜像(就发现多出了一个镜像centosjava8):
接下来运行镜像:docker run -it 4986c9629047 /bin/bash看到进入的路径恰好是配置的!
并且创建的镜像带有我们所需的几个工具(vim,ifconfig,java8):
三、虚悬镜像:
测试一下:写一个虚悬镜像:
我们在myfile文件下创建一个测试目录,再创建一个Dockerfile里面就添加一些:
FROM ubuntu
CMD echo 'action is success......'
这样一旦我们构建docker build .就会出现一个虚悬镜像:
查看:
也可以使用:docker image ls -f dangling=true单独查看虚悬镜像并且使用:docker image prune删除虚悬镜像:
查看(发现已经没有虚悬镜像了):
虚悬镜像只会占用空间,一定要删除!!!
马上就会发布分布式dockerfile实战!关注更新!!!有什么问题欢迎在下方评论区留言!!!