DockerFile详解&实战

1,472 阅读4分钟

这是我参与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 . 

可以看到是按照我们编写的指令逐步构建的

img

查看下生成的镜像

img

第三步:测试运行

docker run -it mycentos:0.1

运行进入容器后,可以看到进入的是配置的工作目录,并且ifconfig命令也是可以使用的,尝试用vim命令也是ok的,所以我们自己通过dockerfile写的镜像是可以正常使用的

img

我们可以列出本地镜像的变更历史,通过历史可以看下这个镜像是怎么做起来的。这样的话我们可以研究下平时使用的镜像是怎么做的

docker history

img

实战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网络、镜像发布等一些东西,希望这个文章对大家有一点帮助!

有时我们的眼睛可以看见宇宙,却看不见社会底层最悲惨的世界 --《十宗罪》