首页 > 其他分享 >3. Docker File

3. Docker File

时间:2024-07-01 20:09:42浏览次数:17  
标签:容器 tomcat 命令 File 镜像 Docker DockerFile docker

DockerFile

DockerFile是一个脚本程序。DockerFile这个脚本程序就是用来创建Docker镜像的。

使用DockerFile的三个固定步骤

☐ 编写DockerFile文件:手动编写一个DockerFile文件,语法必须符合DockerFile的语法规则

☐ docker build:使用“docker build DockerFile文件名”来创建出一个Docker镜像

☐ docker run:使用“docker run 镜像名”命令来根据镜像创建并运行一个容器

DockerFile的基本语法

1.关键字必须为纯大写的字母

2.关键字后面至少跟一个参数,也就是关键字后面不能为空

3.指令按照从上到下的顺序执行

4.单行注释的符号是:#

5.每条指令都会创建一个新的镜像层,并对镜像进行提交。

 

DockerFile运行的基本流程

docker从基础镜像运行一个容器;每执行一条指令,都对容器作出修改;执行类似docker commit的操作把当前层的容器提交为一个新的镜像层;docker再基于刚提交的镜像运行一个新容器;执行dockerfile中的下一条指令,直到所有指令都执行完成!

DockerFile关键字

DockerFile关键字

关键字解释

FROM

指定基础镜像,既当前镜像要基于哪个镜像来构建本层容器

MAINTAINER

镜像维护者的姓名和邮箱地址

RUN

构建镜像时,用来执行linux命令的关键字

EXPOSE

当前容器对外暴露出的端口

WORKDIR

指定在创建容器后,终端登录后的默认目录

ENV

在构建镜像的过程中,设置环境变量

ADD

ADD后面的文件如果是普通文件,则等同于COPY

ADD后面的文件如果是压缩文件,则直接解压到镜像文件中

COPY

类似于ADD,将宿主机目录下的文件拷贝进镜像

但是不会像ADD那样自动解压tar包

VOLUME

容器数据卷,用于数据保存和共享

CMD

指定一个容器启动时要运行的命令,DockerFile中可以有多个CMD指令,但只有最后一个生效,所以CMD也会被docker run之后的命令参数替换掉!

ENTRYPOINT

指定一个容器启动时要执行的命令,ENTRYPOINT和CMD的作用目前看起来是一样的

ONBUILD

当一个镜像被当做父镜像被另外一个镜像继承时,会触发这个被当做父镜像的ONBUILD

DockerFile案例一

我们从hub.docker.com网站上下载下来的centos镜像,是一个精简版的centos,从以下方面可以体会到它有多精简:

1. 没有vim命令

2. 没有ifconfig命令

3. 还有,进入centos容器的默认目录为 “/”,如下:

截图.png

 

我们下面要做的就是:自定义一个mycentos镜像文件,让该镜像文件具有以下特点:

☐ 登录后的默认路径为root家目录

☐ 拥有vim命令

☐ 拥有ifconfig命令

 

首先编辑一个DockerFile文件,内容如下:

截图.png

 

 然后使用docker build命令来构建一个新的镜像:“mycentos:1.0”

截图.png

 此时,在使用使用docker images命令查看镜像,会发现多一个了叫做mycentos的镜像

截图.png

 

然后,根据这个mycentos:1.0镜像来生成容器并运行:

截图.png

 

我们还可以通过“docker history 镜像名”命令来查看镜像的构建过程:

截图.png

DockerFile案例二

我们之前说过,DockerFile文件中可以有多个CMD指令,但只有最后一个会生效,且如果在“docker run 镜像”命令后加了命令,则会替换掉DockerFile中的最后一个CMD。

 

下面以hub.docker.com上的tomcat镜像为例来证明这一点。使用docker images检测本地是否有tomcat镜像,若没有,则使用docker pull,下载一个。

截图.png

 

重点是,我们要知道这个tomcat镜像的DockerFile文件的最后,CMD后面跟的命令是什么,可用通过docker history命令来查看:

截图.png

可以发现,tomcat的DockerFile的最后一行的CMD是启动tomcat的,所以当我们根据tomcat镜像生成容器后,一旦启动容器,这个容器一定会默认把其中的tomcat启动了!

 

如下,一旦根据tomcat镜像生成容器并运行,则会自动启动tomcat,这完全是因为tomcat镜像的DockerFile的最后一个CMD后面的命令! (注意没有后台运行)

截图.png

我们再次启动tomcat的容器,并在后面添加一个命令来替换tomcat的DockerFile最后的CMD命令:

截图.png

 以上的ls -l代替了tomcat的镜像中最后的CMD命令,所以tomcat没有被启动,而是展示出了tomcat家目录下的文件列表!

 

相比CMD会被docker run的最后的命令替换而言,ENTRYPOINT是绝对不会被docker run最后的命令所替换的!下面我们以curl命令为例,来演示CMD和ENTRYPOINT的区别。

 

我们首先要知道,curl命令本身是做什么的:curl命令可以发起一个http请求,并且打印出web服务器的http响应信息

截图.png

 

 CURL http://www.baidu.com默认只会打印到响应体的内容,如果还想让该命令也能打印出响应头和响应体的信息,则只需要加上参数 “-i”,如下:

截图.png

此时,我们编写一个DockerFile文件,名叫DockerFile_2,如下:

截图.png

 

 然后,我们利用docker build来根据这个DockerFile_2来构建一个镜像

截图.png

查看一下目前的镜像文件:

截图.png

 

然后根据foo镜像来创建并运行一个容器

截图.png

最后的CMD命令执行了。然后因为没有任何可以让系统挂起的命令,容器就直接退出运行了。

 

重点是,如果此时,我们还希望myfoo容器运行应用时,也能打印出头信息,怎么办呢?

☐ 先删除旧旧容器

截图.png

☐ 再次运行foo镜像,在末尾添加“-i”参数:

截图.png

最后的-i参数代替了CMD指定的命令,所以报错了!

 

此时我们把DockerFile_2文件中的最后一行的CMD关键字,改为ENTRYPOINT关键字

截图.png

 

 然后在根据现在的DockerFile_2来生成一个新的镜像文件:

截图.png

 

现在,使用docker run来创建并启动bar镜像的容器:

☐ 不加参数 -i

截图.png

☐  加上参数 -i

截图.png

重点是:ENTRYPOINT后面的命令不会被docker run后面的命令所替换,而是追加效果。这就是ENTRYPOINT和CMD这两个关键字的区别了。

DockerFile案例三

ONBUILD关键字的使用,父镜像在被子镜像继承后,父镜像的ONBUILD指定的命令就会被触发!

再制作DockerFile_3,内容如下:

截图.png

 

根据DockerFile_3来构建一个镜像

截图.png

 

查看镜像

截图.png

 

 再创建一个DockerFile,名叫DockerFile_3_1,内容如下:

截图.png

  

再根据DockerFile_3_1来创建一个镜像:

截图.png

 

DockerFile案例四

创建一个文件夹mytomcat9,进入该目录,并创建一个文本文件

截图.png

  

通过wget命令,把tomcat9的压缩包也下载到该目录下。建议从清华大学镜像下载,速度快!

https://mirrors.tuna.tsinghua.edu.cn/

截图.png

https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.65/bin/

截图.png

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 

 

截图.png

再使用wget下载jdk:

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

截图.png

下载jdk安装包:https://www.oracle.com/java/technologies/downloads/#java8

截图.png

截图.png

在mytomcat9目录中,已经能看到tomcat和jdk的包了:

截图.png

 

继续在mytomcat9文件夹下创建一个DockerFile文件,名叫DockerFile_4,内容如下:

FROM centos:7

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

WORKDIR /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

EXPOSE 8080

CMD $CATALINA_HOME/bin/startup.sh && tail -F $CATALINA_HOME/logs/catalina.out

 

此时的mytomcat9目录中的内容看起来是这个样子,其中Dockerfile_4就是刚刚编写的文件

截图.png

 

 

然后根据Dockerfile_4来构建一个镜像出来

截图.png

 

查看镜像

截图.png

 

 然后根据gaotomcat9这个镜像来创建并运行容器

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  \

mytomcat:1.0

 

运行了容器后,再通过命令查看正在运行的容器:

截图.png

再在windows的浏览器中,输入url来访问tomcat!

截图.png

 能看到这个画面,就证明我们的gaotomcat镜像构建成功了!注意之前通过docker pull拉取下来的tomcat镜像是没有欢迎界面的!

 

再证明一下WORKDIR命令的效果

截图.png

 

 再来证明容器卷的存在

截图.png

 

查看logs目录中的文件,这些恰恰就是容器中的tomcat的日志文件,说明挂载成功!

截图.png

 

 再测试容器中的java环境是否配置好

截图.png

 

我们在该容器上部署一个web应用,宿主机的test目录已经挂载到了容器中tomcat的webapps下的test目录上,所以我们直接在宿主机的test目录中创建jsp文件: 

截图.png

 

现在,通过windows的浏览器来访问这个被部署到容器中的应用

截图.png

DockerFile案例五

使用DockerFile创建数据卷。首先创建一个DockerFile文件,名字叫DockerFile_5,在其中写出DockerFile的语法

截图.png

 

 使用docker build命令来根据DockerFile_5生成镜像

截图.png

查看镜像

截图.png

 

然后运行该镜像

截图.png

发现有两个卷,它们是DockerFile_5文件中用命令创建好的。问题是这两个卷对应的宿主机的目录是哪里呢?退出容器但不关闭容器:ctrl+p+q

截图.png

 

然后,使用docker inspect命令,该命令可以查看容器中的两个卷对应的主机目录

截图.png

以上的两个Source就是主机中与容器中两个卷对应的目录!

 

证实一下:在宿主机的对应目录下创建一个文件,名字叫yu_nian

截图.png

 

进入容器,并查看与主机目录对应的目录内容

截图.png

DockerFile案例六

数据卷容器:数据卷容器要解决的问题是,容器和容器之间的数据同步共享。

第一步:启动一个容器作为server,用于提供卷

截图.png

第二步:启动其他容器,挂载数据卷容器

截图.png

第三步:在宿主机的/v1中创建文件,在容器volume-server和web01中都可以看到这个文件

截图.png

我们可以让多个容器挂载到同一个容器的卷上,从而实现多个容器共享数据的需求。

补充:docker仓库中的那些镜像,都是由dockerfile文件创建出来的。

小结:

截图.png

标签:容器,tomcat,命令,File,镜像,Docker,DockerFile,docker
From: https://www.cnblogs.com/qiutian888/p/18278740

相关文章

  • 2. Docker基础
    Docker深入演示例子为了加深大家对docker技术中的三大概念的理解,我再演示一个例子:拉取tomcat镜像,并部署web应用,并且运行。 dockersearchtomcat在仓库中搜索tomcat镜像,部分截图如下:dockerpulltomcat拉取tomcat镜像这里为什么tomcat镜像的大小有529MB?tomcat 不会这么大啊。......
  • 1. Docker快速起步
    Docker先安装Docker,再讲课没有Docker的日子里在以前的开发时代,开发人员把自己开发好的war交付给运维人员,运维人员为了把war部署到服务器上且保证能运行,就必须由运维人员在服务器上搭建好运行环境! 可这样带来的问题是,如果开发环境与部署环境不一致(比如版本),则会导致无法在服务器环......
  • 一键部署Docker脚本
    bashdocker_install.sh#!/bin/bash#auther:maqinghang#blog:https://www.cnblogs.com/maqinghang#加载操作系统的变量,主要是ID变量。./etc/os-releaseDOCKER_VERSION=20.10.24#指定Docker的版本DOCKER_COMPOSE_VERSION=2.23.0#指定docker-conpose的版本FILE......
  • Linux容器篇-Docker镜像的使用
    文章目录前言一、列出镜像列表二、获取一个新镜像三、查找镜像四、拉取镜像五、删除镜像六、创建镜像1、更新镜像2、构建镜像七、设置镜像标签总结前言当运行容器时,使用的镜像如果在本地中不存在,docker就会自动从docker镜像仓库中下载,默认是从DockerHub公共......
  • 【Docker】Docker安全与最佳实践:保护你的容器化应用程序
    Docker安全与最佳实践:保护你的容器化应用程序一、保持Docker更新*1\.使用容器编排工具2.蓝绿部署3.滚动更新4.就地更新5.监控和回滚二、最小权限原则三、网络隔离四、其他安全措施前言Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到......
  • docker
    dockerDocker是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。加了Linux基金会,遵从了Apache2.0协议,项目代码在上进行维护。容器化技术,区分于虚拟机,又类虚拟机,兼具虚拟机隔离的优点,又有速度快的优点容器......
  • Docker 镜像安装
    ​​​前言Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。在安装Docker时,我们经常需要用到镜像安装,为此我整理了一下如何通过镜像源来安装Docker的......
  • LeetCode //Bash - 194. Transpose File
    194.TransposeFileGivenatextfilefile.txt,transposeitscontent.Youmayassumethateachrowhasthesamenumberofcolumns,andeachfieldisseparatedbythe’’character. Example:Iffile.txthasthefollowingcontent:nameagealice21......
  • 初始docker
    前置知识通过面向对象的知识来了解docker中的镜像和容器就很好理解了,docker是C/S架构镜像:是一个只读的模板,可以用来创建容器。类容器:是docker的运行实例,提供了一个独立的可移植的环境,可以在这个环境中运行应用程序。实例,1个或多个docker仓库:用来存储docker镜像的地方,最......
  • Docker教程
    Docker教程1.Docker是什么?Docker是Linux容器的一种封装,提供简单易用的容器使用接口。Docker将应用程序与该程序的依赖打包在一个文件里,运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样,有了Docker就不用担心环境问题。2.Docker的......