Docker——Dockerfile(构建自己的CentOS镜像和Tomcat镜像)并打包镜像发布上线

Posted Pakho`

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker——Dockerfile(构建自己的CentOS镜像和Tomcat镜像)并打包镜像发布上线相关的知识,希望对你有一定的参考价值。

Dockerfile概述

  • Dockerfile是用来构建Dokcer镜像的文件!命令参数脚本
  • 构建步骤
    • 编写一个Dockerfile文件
    • Docker build构建成为一个镜像
    • Docker run 运行镜像
    • Docker push发布镜像(DockerHub、阿里云镜像仓库
  • 很多官方镜像都是基础包,我们通常会自己搭建自己的镜像

Dockerfile构建过程

  • 构建过程会有很多的指令
    在这里插入图片描述
  • Dockerfile基础知识
    • 每个保留关键字(指令)都必须是大写字母
    • 指令是从上到下依次执行的
    • #表示注释
    • 每一个指令都会创建提交一个新的镜像层,并提交!
  • Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写Dockerfile文件,这个文件十分简单!
  • Docker镜像逐渐成为企业交付的标准,必须要掌握!
  • 构建步骤,三步(开发部署运维):
    • Dockerfile构建文件,定义了一切的步骤,源代码
    • Dockerimages:通过Dockerfile构建生成的镜像,就是最终发布和运行的产品
    • Docker容器:容器就是镜像运行起来提供服务的

Dockerfile指令说明

在这里插入图片描述

指令说明
FROM基础镜像,一切从这里开始构建
MAINTAINER镜像是谁写的,姓名+邮箱
RUN镜像构建的时候需要运行的命令
ADD步骤:如大家tomcat镜像,这个tomcat压缩包!(添加内容)
WORKDIR指定镜像的工作目录
VOLUME挂载的目录位置
EXPOSE指定暴露端口
CMD指定这个容器启动要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT指定这个容器启动要运行的命令,可以追加命令
ONBUILD当构建一个被继承Dockerfile 这个时候就会运行ONBUILD的指令,触发指令
COPY类似ADD,将我们文件拷贝到镜像中
ENV构建的时候设置环境变量

实战:构建自己的CentOS

  • Docker Hub99%镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行构建的
    在这里插入图片描述
mkdir dockerfire

#默认的官方CentOS没有一些命令,自己构建一个具有基础命令的CentOS

#编写Dockerfile的文件
[root@docker dockerfire]# vim mydockerfile       
FROM centos                                
MAINTAINER pakho<1064981253@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

#通过这个文件构建镜像
[root@docker dockerfire]# docker build -f mydockerfile -t mycentos:0.1 .
#-f:dockerfile文件路径 -t:镜像名:[tag]

Successfully built 391ea92c0b6c
Successfully tagged mycentos:0.1

#测试运行
docker run -it mycentos:0.1
#ifconfig已经能够使用
[root@1af3e35224a6 local]# ifconfig 
  • 通过Docker history可以查看镜像构建历史
    • 我们平时拿到一个镜像后,可以研究它是怎么做的
docker images

[root@docker dockerfire]# docker history 391ea92c0b6c
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
391ea92c0b6c   8 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
a56b4745d241   8 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
cd5c8b221c1d   8 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
d96bd4a3dd37   8 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
6ca540fbb09a   8 minutes ago   /bin/sh -c yum -y install net-tools             24.9MB    
032bc69f6df0   8 minutes ago   /bin/sh -c yum -y install vim                   60.7MB    
b6da798d1552   9 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
c13af64a7d3e   9 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
fff65a8bbee7   9 minutes ago   /bin/sh -c #(nop)  MAINTAINER pakho<10649812…   0B        
300e315adb2f   6 months ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      6 months ago    /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      6 months ago    /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7…   209MB

CMD和ENTRYPOINT的区别

  • 测试CMD命令
[root@docker dockerfire]# vim dockerfile-cmd-test
#启动CentOS执行ls -a
FROM centos
CMD ["ls","-a"]

#执行构建命令
[root@docker dockerfire]# docker build -f dockerfile-cmd-test -t cmdtest .

#构建完成后通过run运行,发现ls -a命令生效
[root@docker dockerfire]# docker run 3a20dce5f782

#追加一个命令,发现报错
[root@docker dockerfire]# docker run 3a20dce5f782 -l
#cmd的清理下-l 替换了CMD ["1s","-a"]命令,-l不是命令所以报错!
  • 测试ENTRYPOINT命令
    • 追加!
[root@docker dockerfire]# vim dockerfile-cmd-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]

#执行构建命令
[root@docker dockerfire]# docker build -f dockerfile-cmd-entrypoint -t entrypoint-test .

#通过run运行,能够正常执行ls -a命令
[root@docker dockerfire]# docker run 23bc748e7f4b

#我们的追加命令是直接拼接在ENTRYPOINT的后面
[root@docker dockerfire]# docker run 23bc748e7f4b -l
  • Dokcerfile中很多命令及其相似,我们需要了解他们的区别

实战:Dockerfile构建Tomcat镜像

  • 准备镜像文件,Tomcat压缩包,jdk压缩包
[root@docker tomcat]# ls
apache-tomcat-9.0.48.tar.gz  jdk-8u291-linux-x64.tar.gz
  • 编写Dockerfile文件
    • 官方推荐命名Dockerfilebuild会自动寻找这个文件,就不需要 -f 指定文件了!
[root@docker tomcat]# touch readme.txt
[root@docker tomcat]# vim Dockerfile                               #编写Dockerfile文件
FROM centos                                  
MAINTAINER pakho<1064981253@qq.com>                                #作者名+邮箱

COPY readme.txt /usr/local/readme.txt                              #拷贝目录下的自述文件至容器内部/usr/local

#使用ADD命令会自动解压
ADD jdk-8u291-linux-x64.tar.gz /usr/local/                         #添加jdk安装包
ADD apache-tomcat-9.0.48.tar.gz /usr/local/                        #添加tomcat安装包

RUN yum -y install vim                                             #安装vim

ENV MYPATH /usr/local                                              #设置进入容器时的工作目录
WORKDIR $MYPATH                                         

ENV JAVA_HOME /usr/local/jdk1.8.0_291                              #设置jdk变量
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar     
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.48                  #设置tomcat变量
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.48
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080                                                        #暴露端口8080

#启动tomcat 还希望展示日志
CMD /usr/local/apache-tomcat-9.0.48/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.48/bin/logs/catalina.out

#构建镜像
[root@docker tomcat]# docker build -t diytomcat .

#启动镜像
[root@docker tomcat]# docker run -d -p 9090:8080 --name pakhotomcat2 -v /home/heyihao/tomcat/test:/usr/local/apache-tomcat-9.0.48/webapps/test -v /home/heyihao/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.48/logs diytomcat

#进入容器
[root@docker tomcat]# docker exec -it 863d7fa2cdeb /bin/bash

#宿主机测试
[root@docker ~]# curl localhost:9090

在这里插入图片描述

//发布项目,由于做了卷挂载,直接在本地编写项目即可

[root@docker test]# mkdir WEB-INF
//编辑xml文件
[root@docker test]# vim WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
  <web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                               http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">

  </web-app>

//编写一个jsp文件
[root@docker test]# vim index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello,pakho</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("----my test web logs----");
%>
</body>
</html>

//追踪日志
[root@docker tomcatlogs]# tailf catalina.out
  • 测试完成,能够正常访问
    在这里插入图片描述

发布镜像至DockerHub

  • https://hub.docker.com/
  • 确定账户登录
  • 在服务器上提交镜像
  • docker login
  • 登录完成后就可以提交镜像了,就是一步docker push
    • 提交的时候也是按照层级进行提交的!
#登录
[root@docker ~]# docker login -u pakho611
Password:                                   #输入dockerhub密码

Login Succeeded                             #登录成功

#为镜像修改为规范的镜像
[root@docker ~]# docker tag diytomcat pakho611/diytomcat:1.0
[root@docker ~]# docker images
REPOSITORY           TAG       IMAGE ID       CREATED        SIZE
pakho611/diytomcat   1.0       30a5aabdb38b   9 hours ago    646MB

#提交镜像
docker push 注册用户名/镜像名/版本号
[root@docker ~]# docker push pakho611/diytomcat:1.0
1.0: digest: sha256:a6a41622f98e52eab9b56dd9bda8a62c4ebe49ddeeeb32b8dad17ec5839e19ef size: 1373

在这里插入图片描述

发布镜像至阿里云容器服务

  • 登录阿里云
  • 找到容器镜像服务
  • 第一次登录需要创建仓库
  • 根据官方提示进行登陆
    • 参考官方文档即可
[root@docker ~]# docker login --username=作恶多端evil registry.cn-hangzhou.aliyuncs.com

Login Succeeded

[root@docker ~]# docker tag diytomcat registry.cn-hangzhou.aliyuncs.com/pakho/diytomcat:1.0

[root@docker ~]# docker push registry.cn-hangzhou.aliyuncs.com/pakho/diytomcat:1.0
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/pakho/diytomcat]
bc32333b4176: Pushed 
ecf186c3bcaa: Pushed 
f4783a52c44c: Pushed 
a089274b1442: Pushed 
2653d992f4ef: Pushed 
1.0: digest: sha256:a6a41622f98e52eab9b56dd9bda8a62c4ebe49ddeeeb32b8dad17ec5839e19ef size: 1373

在这里插入图片描述

以上是关于Docker——Dockerfile(构建自己的CentOS镜像和Tomcat镜像)并打包镜像发布上线的主要内容,如果未能解决你的问题,请参考以下文章

Docker学习笔记-- 如何使用Dockerfile构建镜像

自己动手编写 Dockerfile 构建自定义的Jenkins

Docker:Dockerfile自定义镜像

根据Dockerfile构建镜像

Docker学习笔记-- 如何使用Dockerfile构建镜像

使用 Dockerfile 构建镜像