13-5 Dockerfile讲解及演示
首先需要编写DokcerFile文件
整体的三个步骤
FROM指令,相对比较特殊。docker里面的东西理论上都是运行在操作系统之上的。所以一般我们docker都会有基础镜像,这些基础镜像大部分都是以比如说centOS、linux啊、windows啊类似于这样的东西为主。 涉及到docker里面的分层。
FROM的意思,这次我们的基础镜像是centos的版本是7.1.1503 这个是我们在官方镜像的仓库上找到的。
官方镜像,直接搜索centos
提供了很多的版本。这里选择的是7,因为当前主流的版本是7
ENV是设置环境变量
这里就是设置了语言版本是中文的utf-8。USE root表示使用的是哪一个用户。
创建多级目录。就假设docker就是一个空的centos系统。分别创建了三个目录,分别叫做。jingzh/env、jiangzh/workspace、jiangzh/bin
RUN就表示后面是一个可执行命令,
把当前文件夹下的jdk、jar包、shell脚本,分别拷贝在jiangzh/env/jdk.
前面是真实的地址,后面是docker里面的地址。
这是准备好的文件。这些文件是在本地的仓做系统上,所以说上面的命令是复制本地的文件到docker的centos里
ADD会把压缩包拷贝到jiangzh/env/jdk的目录下,同时给它解压。而COPY命令不负责解压,COPY就是拷贝到对应的目录下。
JDK的安装除了解压,还需要定义我们的环境变量,就是我们的java_home.
所以我们用ENV定义环境变量:JAVA_HOME 后面对应的是值。
上面的压缩包解压出来的名字就是jdk1.8.0_181
同时在最后还做了一个env。在centos里面,我们需要把java_home的配置文件加到Path目录下才能生效。
把我们的工作目录设置为/home/jiangzh .这一步的目录注意是我们docker镜像里面的目录。也就是默认这个docker进来,就在home/jiangzh这个目录下。
暴露的端口号。docker和我们真实的操作系统之间本身是虚拟化隔离出来的。虽然它是轻量级的隔离,但是它也是隔离了。所以它自成一个小世界,里面跑了一个centos系统。这个centos里面,我们会跑各种各样的东西。它们都会有对应的端口号,如果你想要宿主机,我们管我们的物理机叫做宿主机。如果你想要宿主机可以访问到docker镜像里面的某一个端口,这个时候就必须把这个EXPOSE加上,这样docker就可以默认对外输出一个8761的端口,而我们的eurekaServer的端口默认就是8761
把bin目录下所有的shell添加一个执行的权限。
ENTRYPOINT:表示在dokcer启动的时候,我要做什么事情。下面这句话的意思是我要在docker启动的时候运行bin目录下的entrypoint.sh这个shell脚本。注意这个bin目录是一个相对路径。
因为我的WORKDIR是在/home/jiangzh/这个目录下,所以相对目录就是在/home/jiangzh/目录下的bin
而这个脚本呢 是上面复制进来的
entrypoint
标准的是shell脚本开头
定义一个环境变量叫做 SHELL_BASE 就是我的根目录
/home/jiangzh/bin目录,所有待执行的脚本其实都在这个目录下。
在dockerfile里面,我们把eureka的jar包放在了workspace目录下
相当于运行java-jar
运行的是eurekaServer的jar包。最后面的&是结束符。
紧接着,这里有个for循环。没修5秒休息一次 。这是个死循环。因为docker本身是轻量级的一个技术。它里面的主进程如果挂掉了,这个dokcer自然而然就退出了。所以我们不需要这个docker退出,哪怕它有问题也不希望它退出。
所以把下面这个东西定义为了主线程,它会一直跑,从来不退出,所以docker不会轻易的退出。所以在这里定义了一个无线循环的for循环。
以上就是解读。下面再来运行下
结束