7、DockerFile案例:自定义centos、自定义tomcat、webapps项目发布

 1、Base镜像(scratch)

Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的

2、自定义镜像mycentos

 1、Hub默认CentOS镜像什么情况

docker ps
docker rm -f $(docker ps -qa)
docker ps
docker images docker run
-it centos /bin/bash pwd

1.默认路径是别的,不是/

2. 精简版的cnetos没有vim包,不支持  vim abc.txt 

3、不支持ipconfig  

 

自定义mycentos目的使我们自己的镜像具备如下:
     登陆后的默认路径
     vim编辑器
     查看网络配置ifconfig支持

也许应该这样写:

2、编写

准备编写DockerFile文件
myCentOS内容DockerFile

cd myDocker 
touch DockerFile
FROM centos
MAINTAINER zzyy<zzyy167@126.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 "success--------------ok"
CMD /bin/bash

3、构建

docker build -t 新镜像名字:TAG .

# . 当前路径

[root@localhost mydocker]# pwd
/mydocker
[root@localhost mydocker]# docker build -f /mydocker/DockerFile1 -t centos:1.3 .
# 会看到 docker build 命令最后有一个 .                 . 表示当前目录
#  Step1 Step2 层层叠加
docker  images
# ERROR:
[root@localhost myDocker]# docker build -f /mydocker/Dockerfile -t centos:1.3 .
The Dockerfile (/mydocker/Dockerfile) must be within the build context (.)

# 原因:. 没有指定,至少代指,应该具体点
[root@localhost myDocker]# docker build -f /mydocker/Dockerfile -t centos:1.3 /mydocker/

# 实质原因
pwd
当前目录在 /myDocker
我的file在 /root/mydocker

 

4、运行

docker run -it 新镜像名字:TAG 

docker run -it mycentos:1.3
pwd
/user/local  # 工作目录WORKDIR
vim test.txt
ipconfig
# 都支持

 可以看到,我们自己的新镜像已经支持vim/ifconfig命令,扩展成功了。

5、列出镜像的变更历史

docker history 镜像名

docker  images mycentos
docker history 43124324
# 从底部往上看,栈,千层饼,花卷

3、CMD/ENTRYPOINT 镜像案例

都是指定一个容器启动时要运行的命令

1、CMD

Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
Case

2、tomcat的讲解演示

 

  

(1)正常情况, 怎么运行tomcat

docker images tomcat
docker run -it -p 7777:8080 tomcat
# 最后一行执行CMD ["catalina.sh", "run"]

 

(2)非正常情况
docker run -it -p 8888:8080 tomcat ls -l

相当于

(3)结论

docker ps
# tomcat 没有启动
# ls 把 cmd替换了 

3、ENTRYPOINT 

不会被覆盖,会追加

docker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合

4、Case案例

(1)制作CMD版可以查询IP信息的容器

[root@localhost /]# cd mydocker/
[root@localhost mydocker]# ls
Dockerfile  DockerFile1
[root@localhost mydocker]# vim dockerfile4
FROM centos
RUN yum install -y curl
CMD [ "curl", "-s", "https://ip.cn" ]   # 查ip的网址现在变成https了

编写,构建,启动

docker build -f /mydocker/dockerfile4 -t myip .
docker images myip
docker run -it myip

   (2)crul命令解释

curl命令可以用来执行下载、发送各种HTTP请求,指定HTTP头部等操作。
如果系统没有curl可以使用yum install curl安装,也可以下载安装。
curl是将下载文件输出到stdout
 
使用命令:curl http://www.baidu.com
执行后,www.baidu.com的html就会显示在屏幕上了
 
这是最简单的使用方法。用这个命令获得了http://curl.haxx.se指向的页面,同样,如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地。

如果下载的是HTML文档,那么缺省的将只显示文件头部,即HTML文档的header。要全部显示,请加参数 -i

(3)问题
如果我们希望显示 HTTP 头信息,就需要加上 -i 参数

curl -s https://ip.cn -i

 

 

docker run myip 
docker run myip -i

失效,报错

 相当于

(3)WHY
制作ENTROYPOINT版查询IP信息的容器

编写

# vim DockerFile5
FROM centos
RUN yum install -y curl
ENTRYPOINT?[ "curl", "-s", "https://ip.cn" ]

构建

docker build -f /mydocker/dockerfile5 -t myip02 .
docker images myip02

生成

docker run myip
docker run myip -i 
# 报错

docker run myip02
docker run myip02 -i 
# 成功

 

4、ONBUILD命令案例

 

 1、父镜像编写,构建

[root@localhost mydocker]# cat dockerfile6 
FROM centos
RUN yum install curl -y
ENTRYPOINT ["curl","-s","https://ip.cn"]
ONBUILD RUN echo "father images onbuild ---- 886"
ONBUILD RUN yum install tree -y
[root@localhost mydocker]# docker build -f /mydocker/dockerfile6 -t myip_father .

仅仅是在父镜像包裹,并不会执行

 

此处,为什么进不到交互模式,是dockerfile的问题吗

2、子镜像FROM父镜像,编写,构建,run

[root@localhost mydocker]# cat dockerfile7 
FROM myip_father
RUN yum install curl -y
ENTRYPOINT ["curl","-s","https://ip.cn"]

 继承my_ipfather

[root@localhost mydocker]# docker build -f /mydocker/dockerfile7 -t myip_son .
[root@localhost mydocker]# docker images
[root@localhost mydocker]# docker run -it myip_son /bin/bash

红色  # 触发器

先执行父亲的dockerfile的命令,在执行自己的

 

此处,为什么,son也不能进入交互模式,也没有启动

 

 

父类的Dockerfile中echo被执行

生成父镜像的dockerfile6,中的echo被执行,

如果父镜像安装tree命令,以后每个子镜像都会自动安装tree

 3、问题解决

进不去交互模式

可以进去,但是不打印ip地址了

 可以进去,CMD被/bin/bash覆盖,也不会打印ipl

实质:/bin/bash才是进入交互模式的最后一条执行命令,其他的都不可以

5、自定义镜像Tomcat9

1、说明: tomcat的Dockerfile

支持的版本

自己配置,很恶心,用的版本不统一,出现各种问题

2、touch c.txt

# 1. touch c.txt
mkdir -p /zzyyuse/mydockerfile/tomcat9
在上述目录下touch c.txt

 3、下载tomcat和jdk 版本

tomcat 9.029 https://tomcat.apache.org/download-90.cgi

 jdk13  https://www.oracle.com/technetwork/java/javase/downloads/jdk13-downloads-5672538.html

版本下正确,对于jdk8,已经不维护了。

# 压缩包上传
将jdk和tomcat安装的压缩包拷贝进上一步目录
apache-tomcat-9.0.8.tar.gz   
jdk-8u171-linux-x64.tar.gz  

# 存在
ll
3个存在

 

 4、编写DockerFIle

 在/zzyyuse/mydockerfile/tomcat9目录下新建Dockerfile文件

1、目录内容

2、讲解

纯净的centos
copy c.txt /user/local/cincotainer.txt   
copy+重名
copy  
add = copy+ 解压缩
安装vim
ENV 环境变量配置
CMD 追加到log日志

 3、apache9.09和jdk13对应的

FROM centos
MAINTAINER zzyy<zzyybs@126.com>
# 把宿主机当前上下文的c.txt copy到容器/usr/local下
COPY c.txt /usr/local/cincontainer.txt
# 把java和tomcat添加到docker中
ADD apache-tomcat-9.0.29.tar.gz /usr/local
ADD jdk-13.0.1_linux-x64_bin.tar.gz /usr/local
# 安装vim
RUN yum install vim -y
# 设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk-13.0.1
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.29
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.29
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 容器运行时监听的端口
EXPOSE 8080
# 启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.29/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.29/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.29/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.29/logs/catalina.out

5、构建

docker build -f DockerFile -t zzyytomcat9 .  
# 默认读取当前目录下的DockerFile
# 指定target 名称

docker images

 

构建完成

 

 6、run

 1、先 测试下

docker run -p 888:8080 -it zzyytomcat9

交互模式,打印日志

2、error:碰到的

原因:jdk版本与tomcat版本不匹配

 

 

 3、备注

Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个--privileged=true参数即可

 4、真实的run一下

完整命令

 

docker run -d 
-p 9080:8080 
--name myt9 
-v /zzyyuse/mydockderfile/tomcat9/test:/usr/local/apache-tomcat-9.0.29/webapps/test 
-v /zzyyuse/mydockderfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.29/logs 
--privileged=true  
zzyytomcat9

查看结果

 

浏览器登录

7、验证

docker ps 

# 隔空取物
docker exec 03434 ls -l
docker exec 03434 ls -l /tmp

 

6、结合前述的容器卷将测试的web服务test发布

1、总体概述

webapp 存放我们的项目

直接在容器里面读取我们在宿主机的项目

容器卷2个生成,往里面放web项目,容器会动生成

2、宿主机创建webapps

1、a.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    -----------welcome------------
    <%="i am in docker tomcat self "%>
    <br>
    <br>
    <% System.out.println("=============docker tomcat self");%>
  </body>
</html>

2、WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  id="WebApp_ID" version="2.5">
  
  <display-name>test</display-name>
 
</web-app>

3、ok

pwd
/zzyyuse/mydockderfile/tomcat9/test

vim a.jsp

mkdir WEB-INF
cd WEB-INF
vim web.xml

3、容器内

此时已经同步到容器内部了,webapps项目

docker exec 0da java --version

docker exec 0da ls /usr/local/apache-tomcat-9.0.29/webapps/test

 4、测试

docker ps
docker restart 0343
docker ps

# 浏览器访问 9080
localhost:9080/test/a.jsp

 

# 修改 内容
vim a.jsp

 

刷新页面,查看效果

 

 查看日志

查看日志

[root@localhost test]# cd /zzyyuse/mydockderfile/tomcat9/tomcat9logs/

[root@localhost tomcat9logs]# ls
catalina.2019-11-26.log host-manager.2019-11-26.log localhost_access_log.2019-11-26.txt
catalina.out localhost.2019-11-26.log manager.2019-11-26.log

[root@localhost tomcat9logs]# less catalina.out

 

7、小总结

 

原文地址:https://www.cnblogs.com/venicid/p/11922378.html