DockerFile是一个脚本程序。DockerFile这个脚本程序就是用来创建Docker镜像的。
☐ 编写DockerFile文件:手动编写一个DockerFile文件,语法必须符合DockerFile的语法规则
☐ docker build:使用“docker build DockerFile文件名”来创建出一个Docker镜像
☐ docker run:使用“docker run 镜像名”命令来根据镜像创建并运行一个容器
docker从基础镜像运行一个容器;每执行一条指令,都对容器作出修改;执行类似docker commit的操作把当前层的容器提交为一个新的镜像层;docker再基于刚提交的镜像运行一个新容器;执行dockerfile中的下一条指令,直到所有指令都执行完成!
指定一个容器启动时要运行的命令,DockerFile中可以有多个CMD指令,但只有最后一个生效,所以CMD也会被docker run之后的命令参数替换掉! | |
我们从hub.docker.com网站上下载下来的centos镜像,是一个精简版的centos,从以下方面可以体会到它有多精简:
3. 还有,进入centos容器的默认目录为 “/”,如下:
我们下面要做的就是:自定义一个mycentos镜像文件,让该镜像文件具有以下特点:
然后使用docker build命令来构建一个新的镜像:“mycentos:1.0”
此时,在使用使用docker images命令查看镜像,会发现多一个了叫做mycentos的镜像
然后,根据这个mycentos:1.0镜像来生成容器并运行:
我们还可以通过“docker history 镜像名”命令来查看镜像的构建过程:
我们之前说过,DockerFile文件中可以有多个CMD指令,但只有最后一个会生效,且如果在“docker run 镜像”命令后加了命令,则会替换掉DockerFile中的最后一个CMD。
下面以hub.docker.com上的tomcat镜像为例来证明这一点。使用docker images检测本地是否有tomcat镜像,若没有,则使用docker pull,下载一个。
重点是,我们要知道这个tomcat镜像的DockerFile文件的最后,CMD后面跟的命令是什么,可用通过docker history命令来查看:
可以发现,tomcat的DockerFile的最后一行的CMD是启动tomcat的,所以当我们根据tomcat镜像生成容器后,一旦启动容器,这个容器一定会默认把其中的tomcat启动了!
如下,一旦根据tomcat镜像生成容器并运行,则会自动启动tomcat,这完全是因为tomcat镜像的DockerFile的最后一个CMD后面的命令! (注意没有后台运行)
我们再次启动tomcat的容器,并在后面添加一个命令来替换tomcat的DockerFile最后的CMD命令:
以上的ls -l代替了tomcat的镜像中最后的CMD命令,所以tomcat没有被启动,而是展示出了tomcat家目录下的文件列表!
相比CMD会被docker run的最后的命令替换而言,ENTRYPOINT是绝对不会被docker run最后的命令所替换的!下面我们以curl命令为例,来演示CMD和ENTRYPOINT的区别。
我们首先要知道,curl命令本身是做什么的:curl命令可以发起一个http请求,并且打印出web服务器的http响应信息
CURL http://www.baidu.com默认只会打印到响应体的内容,如果还想让该命令也能打印出响应头和响应体的信息,则只需要加上参数 “-i”,如下:
此时,我们编写一个DockerFile文件,名叫DockerFile_2,如下:
然后,我们利用docker build来根据这个DockerFile_2来构建一个镜像
最后的CMD命令执行了。然后因为没有任何可以让系统挂起的命令,容器就直接退出运行了。
重点是,如果此时,我们还希望myfoo容器运行应用时,也能打印出头信息,怎么办呢?
此时我们把DockerFile_2文件中的最后一行的CMD关键字,改为ENTRYPOINT关键字
然后在根据现在的DockerFile_2来生成一个新的镜像文件:
现在,使用docker run来创建并启动bar镜像的容器:
重点是:ENTRYPOINT后面的命令不会被docker run后面的命令所替换,而是追加效果。这就是ENTRYPOINT和CMD这两个关键字的区别了。
ONBUILD关键字的使用,父镜像在被子镜像继承后,父镜像的ONBUILD指定的命令就会被触发!
再创建一个DockerFile,名叫DockerFile_3_1,内容如下:
创建一个文件夹mytomcat9,进入该目录,并创建一个文本文件
通过wget命令,把tomcat9的压缩包也下载到该目录下。建议从清华大学镜像下载,速度快!
https://mirrors.tuna.tsinghua.edu.cn/
https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.65/bin/
wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.65/bin/apache-tomcat-9.0.65.tar.gz --no-check-certificate
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
下载jdk安装包:https://www.oracle.com/java/technologies/downloads/#java8
在mytomcat9目录中,已经能看到tomcat和jdk的包了:
继续在mytomcat9文件夹下创建一个DockerFile文件,名叫DockerFile_4,内容如下:
COPY haha.txt /usr/local/haha.txt
ADD jdk-8u341-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.65.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_341
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.65
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.65
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
CMD $CATALINA_HOME/bin/startup.sh && tail -F $CATALINA_HOME/logs/catalina.out
此时的mytomcat9目录中的内容看起来是这个样子,其中Dockerfile_4就是刚刚编写的文件
docker run -d -p 8083:8080 --name aaa \
-v /root/test:/usr/local/apache-tomcat-9.0.78/webapps/test \
-v /root/logs:/usr/local/apache-tomcat-9.0.78/logs \
再在windows的浏览器中,输入url来访问tomcat!
能看到这个画面,就证明我们的gaotomcat镜像构建成功了!注意之前通过docker pull拉取下来的tomcat镜像是没有欢迎界面的!
查看logs目录中的文件,这些恰恰就是容器中的tomcat的日志文件,说明挂载成功!
我们在该容器上部署一个web应用,宿主机的test目录已经挂载到了容器中tomcat的webapps下的test目录上,所以我们直接在宿主机的test目录中创建jsp文件:
现在,通过windows的浏览器来访问这个被部署到容器中的应用
使用DockerFile创建数据卷。首先创建一个DockerFile文件,名字叫DockerFile_5,在其中写出DockerFile的语法
使用docker build命令来根据DockerFile_5生成镜像
发现有两个卷,它们是DockerFile_5文件中用命令创建好的。问题是这两个卷对应的宿主机的目录是哪里呢?退出容器但不关闭容器:ctrl+p+q
然后,使用docker inspect命令,该命令可以查看容器中的两个卷对应的主机目录
证实一下:在宿主机的对应目录下创建一个文件,名字叫yu_nian
数据卷容器:数据卷容器要解决的问题是,容器和容器之间的数据同步共享。
第三步:在宿主机的/v1中创建文件,在容器volume-server和web01中都可以看到这个文件
我们可以让多个容器挂载到同一个容器的卷上,从而实现多个容器共享数据的需求。
补充:docker仓库中的那些镜像,都是由dockerfile文件创建出来的。
标签:容器,tomcat,命令,File,镜像,Docker,DockerFile,docker From: https://www.cnblogs.com/qiutian888/p/18278740