前置技能
- Linux基础
- Git基础
- Docker
- 常用指令
安装环境:
CentOS Docker 7 见官网
DockerFile简介
构建Docker镜像的构建文件,由一系列的命令与参数构成的脚本
- 每一条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令顺序执行
- # 表示注释
- 每条指令都会创建一个镜像层(类似套娃,一层套一层,最后最大的就是我们需要的镜像),并提交
- 最后交给我们的镜像就是最后一层(使用
docker history 镜像
,可以看到每一层镜像)
Docker执行DockerFile文件流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器进行相应的修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于上一条指令提交的镜像再运行一个容器
- 执行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
- 第一步 写
DockerFile文件
FROM centos
RUN yum -y install curl
# 不知道怎么回事,我的电脑执行下列指令没法获取ip
CMD ["curl","-s","http://ip.cn"]
# 替换成:(反正是用来体会CMD指令的)
CMD echo "test"
制作镜像,执行build指令,就不详细写出了
运行镜像(体会CMD只会执行最后一条指令)
docker run -it xxxx(新建镜像)
# 输出:
test
docker run -it xxxx(新建镜像) echo "123"
# 输出:
123
- 替换第一步的DockerFile文件
FROM centos
RUN yum -y install curl
ENTRYPOINT ["curl","-s","http://ip.cn"]
- 重新执行第2、3步(ENTRYPOINT追加参数)
# 执行:
docker run -it xxxx(新建镜像) -i
# 输出:
追加输出请求头信息
ONBUIL保留字案例
父镜像的DockerFile文件
:
FROM centos
# 一定要加RUN,不然子类报错,相当于在子类DockerFile里光写了一行echo "123",docker不认识好吧
ONBUILD RUN echo "123”
子镜像继承上面DockerFile构建的父镜像时会触发:
创建Tomcat容器案例
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环境变量是否需要配置
- 本文链接:https://wwww.zsmsfy.cn/2021/08/31/note/docker-dockerfile/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。