编写自己的Tomcat docker镜像
dockerfile
dockerfile介绍
用来构建docker 镜像的
构建步骤:
- 编写一个docker file 文件
- docker build 构建成一个镜像
- docker run 运行镜像
- docker push 发布镜像(Docker hub 阿里云镜像)
我们来看看官方是怎么做的
很多官方的镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像
官方可以制作镜像,那我们也可以
DockerFile构建过程
基础知识:
- 每个保留关键字,指令都必须是大写字母
- 执行从上到下执行
- #表示注释
- 每个指令都会创建提交一个新的镜像层
dockerfile是面向开发的,我i们以后需要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单。
我们要掌握dockerfile 就基本可以掌握常用的docker镜像企业交付了
dockerfile :构建文件,定义了一切步骤,源代码
dockerimages:通过dockerfile生成的镜像,最终发布和运行的产品
docker容器:容器就是镜像运行起来,提供服务的
Dockerfile的指令
代码语言:javascript复制FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名 邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤, tomcat镜像, 这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令, 可以追加命令
ONBUILD # 当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令
COPY # 类似ADD, 将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
实战测试
代码语言:javascript复制创建一个自己的centos
FROM centos
MAINTAINER hyc<3132774018@qq,com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
# 2. 通过这个文件构建镜像
# 命令 docker build -f dockerfile文件路径 -t 镜像名:[tag] .
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .
Successfully built d2d9f0ea8cb2
Successfully tagged mycentos:0.1
#测试运行
对比之前原生的centos
我们增加了 vim 和 net-tools !](https://img-blog.csdnimg.cn/70d154bf1e304697ad51d6693d6ad385.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAZG9vbXdhdGNoZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)
我们可以查看一下镜像的变更历史
docker history
我们平时拿到一个镜像可以研究他是怎么构建的
代码语言:javascript复制CMD 和ENTRYPOINT区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令, 可以追加命令
测试CMD
代码语言:javascript复制# 1. 编写dockerfile文件
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# vim dockerfile-cmd-test
FROM centos
CMD ["ls", "-a"]
# 2. 构建镜像
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .
# 3. run运行, 发现我们的ls -a 命令生效
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
# 想追加一个命令 -l 变成 ls -al
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: "-l": executable file not found in $PATH": unknown.
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125 ls -l
# cmd的情况下 -l替换了CMD["ls", "-a"]命令, -l不是命令,所以报错了
测试ENTRYPOINT
代码语言:javascript复制# 1. 编写dockerfile文件
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# vim dockerfile-entrypoint-test
FROM centos
ENTRYPOINT ["ls", "-a"]
# 2. 构建文件
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f dockerfile-entrypoint-test -t entrypoint-test .
# 3. run运行 发现我们的ls -a 命令同样生效
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run entrypoint-test
.
..
.dockerenv
bin
dev
etc
home
lib
# 4. 我们的追加命令, 是直接拼接到ENTRYPOINT命令的后面的!
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run entrypoint-test -l
total 56
drwxr-xr-x 1 root root 4096 Aug 13 07:52 .
drwxr-xr-x 1 root root 4096 Aug 13 07:52 ..
-rwxr-xr-x 1 root root 0 Aug 13 07:52 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 Aug 13 07:52 dev
drwxr-xr-x 1 root root 4096 Aug 13 07:52 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64
drwx------ 2 root root 4096 Aug 9 21:40 lost found
实战 tomcat
这里我们先准备好 需要用到的 安装包
- apache-tomcat-9.0.54.tar.gz
- jdk-8u311-linux-x64.tar.gz
成功
我们同时挂载了 test 目录,当我们向容器加入自己的内容到时候,可以直接从宿主机放入文件,可以直接同步到docker容器中,十分的方便