这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战
之前文章中我们初步了解了dockerfile,知道dockerfile是用来构建docker镜像的文件,也就是命令参数脚本,现在我们尝试深入学习下dockerfile
先了解下构建步骤dockerfile构建的完整步骤:
-
编写一个dockerfile文件
-
docker build 构建成为一个镜像
-
docker run 运行镜像
-
docker push 发布镜像(DokcerHub、阿里云镜像仓库)
看下官方是怎么做的
1、在dockerhub上随便搜索一个镜像
2、随便选择一个版本会直接跳转到github上,并且可以看到镜像的命令脚本
很多官方的镜像是一个很纯净的包,我们可以按照自己的需求制作自己的镜像
Dockerfile的构建
dockerfile的构建并不难,主要我们要把命令脚本写好
基础知识
1、每个关键字(指令)都必须是大写字母
2、执行是从上到下顺序执行的
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层并提交
dockerfile是面向开发的,我们后面发布项目,做镜像,就需要编写dockerfile这个文件(dockerfile逐渐成为企业交付的标准)
我们在回顾下几个概念
- dockerfile:构建文件,定义所有步骤,源代码
- dockerImages:通过dockerfile构建生成镜像,最终发布和运行的产品
- docker容器:容器就是镜像运行起来提供服务器
DockerFile的指令
FROM # 基础镜像,一切从这里开始
MAINTAINER # 镜像是谁写的
RUN # 镜像构建是需要运行的命令
ADD # 步骤
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动时要运行的命令,只有最后一个会生效
ENTRYPOINT # 指定这个容器启动时要运行的命令,可以追加命令
COPY # 类似ADD,将文件拷贝到镜像中
ENV # 构建时候设置的环境变量
实战测试
从上面centos命令脚本中可以看到开头FROM scratch,dockerhub中99%的镜像都是从FROM scratch这个基础镜像来的,然后配置需要的软件和配置来构建的。
在官方的centos中对于一些基础的命令都是没有的,所以尝试创建一个自己的centos试一下
$ docker run -it centos
[root@8fbe85e4a93b /]# vim
bash: vim: command not found
[root@8fbe85e4a93b /]# ifconfig
bash: ifconfig: command not found
[root@8fbe85e4a93b /]#
第一步:编写文件
在指定路径下编写dockerfile的配置文件
FROM centos
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
第二步:构建镜像
mydockerfile是文件名
docker build -f mydockerfile -t mycentos:0.1 .
可以看到是按照我们编写的指令逐步构建的
查看下生成的镜像
第三步:测试运行
docker run -it mycentos:0.1
运行进入容器后,可以看到进入的是配置的工作目录,并且ifconfig命令也是可以使用的,尝试用vim命令也是ok的,所以我们自己通过dockerfile写的镜像是可以正常使用的
我们可以列出本地镜像的变更历史,通过历史可以看下这个镜像是怎么做起来的。这样的话我们可以研究下平时使用的镜像是怎么做的
docker history
实战tomcat镜像
准备镜像文件
准备镜像文件tomcat压缩包,jdk压缩包
编写dockerfile
编写dockerfile文件,官方命名Dockerfile,build的时候可以自动寻找这个文件,不需要-f指定了!
FROM centos
MAINTAINER ajajaj
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u301-linux-x64.tar /usr/local/
ADD apache-tomcat-8.5.70.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_301
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.70
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.70
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.70/bin/startup.sh && tail -F
/usr/local/apache-tomcat-8.5.70/bin/logs/catalina.out
构建镜像
编写好了dockerfile可以构建了
docker build -t diytomcat .
到这来自定义的tomcat镜像就创建成功了
启动镜像
然后我们启动这个镜像,并且顺便做了些操作,可以仔细看下下面的命令
- 端口映射到9090
- 工程目录、日志目录进行挂载
docker run -d -p 9090:8080 --name ajtomcat -v /Users/cb/test/tomcat-out/test:/usr/local/apache-tomcat-8.5.70/webapps/test -v /Users/cb/test/tomcat-out/tomcatlogs:/usr/local/apache-tomcat-8.5.70/logs diytomcat
进入容器
$ docker exec -it 9f3f7ed2b184 /bin/bash
[root@9f3f7ed2b184 local]#
访问测试
访问下tomcat(curl localhost:8080),是通的哦
宿主机访问下9090看下也是OK的哦
发布项目
由于做了卷挂载,我们之间在本地编写项目就可以了
上面的命令的挂载关系
/Users/cb/test/tomcat-out/test:/usr/local/apache-tomcat-8.5.70/webapps/test
我们在外部路径下创建一个最简单的web工程
- 创建一个WEB-INF文件夹,文件夹中新建一个web.xml文件
- 创建一个index.jsp文件
文件中按照格式随便写点东西
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"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
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">
</web-app>
index.jsp
<html>
<head><title>Hello World</title></head>
<body>
Hello World!<br/>
<%
out.println("Your IP address is " + request.getRemoteAddr());
%>
</body>
</html>
搞定之后我们来访问下这个web工程
最后我们来看下日志的输出情况,由下图可见日志也是稳稳的打印了
OK,到这里我们就算成功了
现在我们在本地就可以完成项目的实时发布,而且项目是部署在docker中的,最重要的是docker镜像使我们纯手工打造的哦,这一套完成的流程我们就算搞定了...
docker学习到这里算是对docker有了一个比较全面的认识了,后面还会继续深入的再研究下docker网络、镜像发布等一些东西,希望这个文章对大家有一点帮助!
有时我们的眼睛可以看见宇宙,却看不见社会底层最悲惨的世界 --《十宗罪》