Docker——Dockerfile(构建自己的CentOS镜像和Tomcat镜像)并打包镜像发布上线
Posted Pakho`
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker——Dockerfile(构建自己的CentOS镜像和Tomcat镜像)并打包镜像发布上线相关的知识,希望对你有一定的参考价值。
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 Hub
中99%
镜像都是从这个基础镜像过来的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
文件- 官方推荐命名
Dockerfile
,build
会自动寻找这个文件,就不需要-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