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