(五)DockerFile保留字和使用DockerFile构建镜像

什么是DockerFile文件

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

通过build命令,可以通过DockerFile文件生成镜像。DockerFile文件中每一行都是一条指令,构建是指令按照从上到下,顺序执行。每条指令都会创建一个新的镜像层,并对镜像进行提交。

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,

  • Dockerfile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件的运行态。
    在这里插入图片描述

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

1、Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;

2、Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;

3、Docker容器,容器是直接提供服务的。


DockerFile的保留字

每条保留字指令都必须为大写字母且后面要跟随至少一个参数

保留字作用
FROM基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER镜像维护者的姓名和邮箱地址
RUN容器构建时需要运行的命令
EXPOSE当前容器对外暴露出的端口
WORKDIR指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
ENV用来在构建镜像过程中设置环境变量,使用 $变量名称 来使用
ADD将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
VOLUME容器数据卷,用于数据保存和持久化工作
CMD指定一个容器启动时要运行的命令。Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
ENTRYPOINT​指定一个容器启动时要运行的命令。ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。docker run 之后的命令则会追加到ENTRYPOINT之后
ONBUILD当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

Docker执行Dockerfile的大致流程

(1)docker从基础镜像运行一个容器
(2)执行一条指令并对容器作出修改
(3)执行类似docker commit的操作提交一个新的镜像层
(4)docker再基于刚提交的镜像运行一个新容器
(5)执行dockerfile中的下一条指令直到所有指令都执行完成


案例1:基于centos镜像写一个简单的dockerfile

1、创建一个名为my-centos-vim.dockerfile的文件

文件内容:

FROM centos:7
MAINTAINER yyyL<yyyL@163.com>

ENV MYPATH /tmp/yyyL
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools
RUN mkdir -p $MYPATH

EXPOSE 80

CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

在这里插入图片描述

2、使用dockerfile构建镜像

命令:docker build -f my-centos-vim.dockerfile -t my-centos-vim:latest .
在镜像的构建过程中,我们可以看到, Step x/11(一共11步是因为我们的dockerfile文件的命令有11行) 的步骤,每个步骤都会生成一个中间层的镜像,这个中间层的镜像的id会在执行完成后打印。
在这里插入图片描述在这里插入图片描述

3、运行镜像查看是否和预期一样

运行镜像:docker run -it my-centos-vim
可以看到已经可以使用vim命令,并且运行成功后直接进入到了/tmp/yyyL目录下:
在这里插入图片描述

4、查看镜像的构建过程

命令:docker history my-centos-vim
通过history命令,可以看到镜像构建过程的每一步执行的命令和生成的中间层的镜像
在这里插入图片描述


案例2:制作一个tomcat镜像

在有案例1的镜像制作基础上,学习如何制作一个tomcat进行


1、创建一个名为my-tomcat.dockerfile的文件

需要用到的其他文件都放在dockerfile文件的同一目录下:
my.txt (用于测试ADD保留字)
jre-8u211-linux-x64.tar.gz
apache-tomcat-9.0.8.tar.gz 下载链接:https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.8/bin/apache-tomcat-9.0.8.tar.gz

#以centos:7为基础镜像
FROM centos:7
MAINTAINER yyyL<yyyL@163.com>

# 把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下。并改名cincontainer.txt
COPY my.txt /usr/local/cincontainer.txt

# 把jre与tomcat添加到容器中
ADD jre-8u211-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/

# 安装vim编辑器
RUN yum -y install vim

# 设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH

# 配置java_home与tomcat环境变量(注:这个目录是jre的tar.gz解压之后的文件目录)
ENV JAVA_HOME 		/usr/local/jre1.8.0_211
ENV CLASSPATH 		$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME 	/usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE 	/usr/local/apache-tomcat-9.0.8
ENV PATH 			$PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

# 容器运行时监听的端口
EXPOSE  8080

# 在容器启动时执行该命令运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out

在这里插入图片描述
图片里面因为Apache的压缩包下载出错了,所以是0dec。后面运行容器也报错了。

关于JAVA_HOME的路径,实际上我们是将宿主机上面的jre的tar.gz复制到容器内的/usr/local路径下,并解压,所以可以先解压看下解压后的目录是啥,就知道该怎么配置了。
在这里插入图片描述


2、使用dockerfile构建镜像

命令:docker build -f my-tomcat.dockerfile -t my-tomcat:latest .
在这里插入图片描述

3、运行镜像查看是否和预期一样

运行镜像: 普通运行:docker run -d --name="my-tomcat" -p 8888:8080 my-tomcat:latest
绑定容器数据卷:docker run -d --name="my-tomcat" -v /tmp/docker-volume/my-tomcat/page:/usr/local/apache-tomcat-9.0.8/webapps/page -v /tmp/docker-volume/my-tomcat/logs/:/usr/local/apache-tomcat-9.0.8/logs -p 8888:8080 my-tomcat:latest
在这里插入图片描述

# 进入容器
[root@localhost my-tomcat]# docker exec -it dc8668b7d514 /bin/bash
# 直接进来就是/usr/local,这和我们dockerfile文件中的一致
[root@dc8668b7d514 local]# pwd
/usr/local
[root@dc8668b7d514 local]# ls
apache-tomcat-9.0.8  bin  cincontainer.txt  etc  games  include  jre1.8.0_211  lib  lib64  libexec  sbin  share  src
# 因为在dockerfile中我们是将宿主机中的my.txt文件拷贝到容器/usr/local/路径下。并改名cincontainer.txt,所以这里可以看得到
[root@dc8668b7d514 local]# cat cincontainer.txt 
my name is yanlei!!!
# 查看容器内的java版本
[root@dc8668b7d514 local]# java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
# 查看容器内的java进程
[root@dc8668b7d514 local]# ps -aux | grep java
root         15  0.7 11.7 2244656 117180 ?      Sl   16:38   0:05 /usr/local/jre1.8.0_211/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-9.0.8/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/apache-tomcat-9.0.8/bin/bootstrap.jar:/usr/local/apache-tomcat-9.0.8/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-9.0.8 -Dcatalina.home=/usr/local/apache-tomcat-9.0.8 -Djava.io.tmpdir=/usr/local/apache-tomcat-9.0.8/temp org.apache.catalina.startup.Bootstrap start
root         98  0.0  0.0   9092   672 pts/0    S+   16:50   0:00 grep --color=auto java

在这里插入图片描述
访问tomcat:

注:访问404,可能是安装tomcat版本就没有这个页面或者是防火墙的问题。
CentOS 7.0默认使用的是firewall作为防火墙
关闭: systemctl stop firewalld
启动: systemctl start firewalld
查看状态:firewall-cmd --state

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值