前置技能

  • Linux基础
  • Git基础
  • Docker
    • 常用指令

安装环境:

CentOS Docker
7 见官网

DockerFile简介

构建Docker镜像的构建文件,由一系列的命令与参数构成的脚本

  • 每一条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令顺序执行
  • # 表示注释
  • 每条指令都会创建一个镜像层(类似套娃,一层套一层,最后最大的就是我们需要的镜像),并提交
  • 最后交给我们的镜像就是最后一层(使用docker history 镜像,可以看到每一层镜像)

Docker执行DockerFile文件流程

  • docker从基础镜像运行一个容器
  • 执行一条指令并对容器进行相应的修改
  • 执行类似docker commit的操作提交一个新的镜像层
  • docker再基于上一条指令提交的镜像再运行一个容器
  • 执行DockerFile文件中的下一条指令直到执行完成

DockerFile常用保留字指令

保留字分类:

DockerFile保留字分类

FROM

基础镜像,新镜像基于该镜像创建

注意: scratch 的地位相对与Java中的Object类,属于保留镜像,是所有镜像的第一层

MAINTAINER

自定义镜像作者信息,如作者名、邮箱等

RUN

构建镜像时需要运行的其他指令

EXPOSE

容器对外暴露的端口号

WORKDIR

创建容器时,终端默认登录时的目录

ENV

设置构建镜像时的环境变量

ENV test_PATH /usr/test

# 可以在下面使用,eg:
WORKDIR $test_PATH

AND(COPY+解压缩)

将宿主机目录下的文件拷贝进镜像,而且ADD指令会自动处理URL和解压缩tar包

COPY

类似ADD,拷贝文件和目录到镜像中

# 类似linux的shell脚本写法:
copy src(源文件或目录路径) dest(镜像内目标路径)

# 类似JSON串写法
COPY["src","dest"]

VOLUME

容器数据卷,用于数据保存与持久化

CMD

指定容器启动时运行的指令

文件中可以有多个CMD指令,但只有最后一个会生效,并且在执行docker run指令时会被后面的参数替换

# shell格式:
CMD 指令

# EXEC格式:
CMD ["可执行文件","参数1"...]

# 参数列表格式:(指定ENTRYPOINT指令后,用CMD指定具体参数)
CMD ["参数1","参数2"...]

ENTRYPOINT

指定容器启动时运行的指令,与CMD一样都是指定容器启动程序和参数,但与CMD指令只有最后一个生效不同,它会追加指令

ONBUILD

触发器,当有新的镜像继承该镜像时,该镜像的onbuild被触发

DockerFile案例

Base案例

DockerFile文件: 创建一个具有vim、net-tools功能的centos镜像

FROM centos
MAINTAINER sheng1000<sheng1000@qq.com>

EVC PATH /usr
WOEKDIR $PATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo "This is a test"
CMD /bin/bash

IP查询案例(现在不是了,笑)

创建一个查询当前容器ip的centos镜像,返回ip后返回宿主机,因为最后的CMD指令没有/bin/bash

  1. 第一步 写DockerFile文件
FROM centos

RUN yum -y install curl
# 不知道怎么回事,我的电脑执行下列指令没法获取ip
CMD ["curl","-s","http://ip.cn"]

# 替换成:(反正是用来体会CMD指令的)
CMD echo "test"
  1. 制作镜像,执行build指令,就不详细写出了

  2. 运行镜像(体会CMD只会执行最后一条指令)

docker run -it xxxx(新建镜像)

# 输出:
test

docker run -it xxxx(新建镜像) echo "123"

# 输出:
123
  1. 替换第一步的DockerFile文件
FROM centos
RUN yum -y install curl
ENTRYPOINT ["curl","-s","http://ip.cn"]
  1. 重新执行第2、3步(ENTRYPOINT追加参数)
# 执行:
docker run -it xxxx(新建镜像) -i

# 输出:
追加输出请求头信息

ONBUIL保留字案例

父镜像的DockerFile文件

FROM centos
# 一定要加RUN,不然子类报错,相当于在子类DockerFile里光写了一行echo "123",docker不认识好吧
ONBUILD RUN echo "123”

子镜像继承上面DockerFile构建的父镜像时会触发:
ONBUILD保留字

创建Tomcat容器案例

–>Docker hub

Tomcat案例的DockerFile文件:(能看懂就行,日常对着Docker hub写)

翻了一下Docker hub上的Tomcat的DockerFile,发现都是编译源码安装,果然偷懒就对了

FROM centos
MAINTAINER zzyy<zzyybs@126.com>
#把宿主机当前上下文的test.txt拷贝到容器/usr/local/路径下
COPY test.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u171-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与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
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

上面的: ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
稍微查了一下,好像可以写ENV CLASSPATH $JAVA_HOME/lib一劳永逸,直接导入所有jar
注意:似乎是jdk1.5的遗留问题,新版的jdk好像不用配classpath,有时间试一下

后续

  • 2021.8.31
    • 测试新版jdk的classpath环境变量是否需要配置