本篇来自于尚硅谷周阳老师 https://www.bilibili.com/video/BV1Ls411n7mx
上一篇:docker 入门到实战(五)docker容器数据卷

六:dockerFile解析

1.png

6.1 dockerFile是什么

Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。

6.1.1 cenos7 Dockerfile文件
2.png

  1. FROM scratch
  2. ADD centos-7-x86_64-docker.tar.xz /
  3. LABEL org.label-schema.schema-version="1.0" \
  4. org.label-schema.name="CentOS Base Image" \
  5. org.label-schema.vendor="CentOS" \
  6. org.label-schema.license="GPLv2" \
  7. org.label-schema.build-date="20191001"
  8. CMD ["bin/bash"]

6.1.2 构建步骤

  1. 编写Dockerfile文件
  2. docker build
  3. docker run

    6.2 dockerFile构建过程解析

    6.2.1 Dockerfile内容基础知识

  4. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数

  5. 指令按照从上到下,顺序执行
  6. 表示注释

  7. 每条指令都会创建一个新的镜像层,并对镜像进行提交

    6.2.2 Docker执行Dockerfile的大致流程

  8. docker从基础镜像运行一个容器

  9. 执行一条指令并对容器作出修改
  10. 执行类似docker commit的操作提交一个新的镜像层
  11. docker再基于刚提交的镜像运行一个新容器
  12. 执行dockerfile中的下一条指令直到所有指令都执行完成

    6.2.3 小总结

    从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,
  • Dockerfile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件的运行态。

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

  1. Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
  2. Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;
  3. Docker容器,容器是直接提供服务的。

    6.3 DockerFile体系结构(保留字指令)

    | 保留字 | 描述 | | —- | —- | | FROM | 基础镜像,当前新镜像是基于哪个镜像的 | | MAINTAINER | 镜像维护者的姓名和邮箱地址 | | RUN | 容器构建时需要运行的命令 | | EXPOSE | 当前容器对外暴露出的端口 | | WORKDIR | 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点 | | ENV | 用来在构建镜像过程中设置环境变量 (k,v)形式 | | ADD | 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包 | | COPY | 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置 (k,v)形式和json格式都可以 | | VOLUME | 容器数据卷,用于数据保存和持久化工作 | | CMD | 指定一个容器启动时要运行的命令(Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换) | | ENTRYPOINT | 指定一个容器启动时要运行的命令 (ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数) | | ONBUILD | 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发 |

3.png

6.4 案例

6.4.1 base镜像(scratch)
几乎99%的镜像都来自于这个基础的镜像
4.png

6.4.2 自定义镜像

6.4.2.1 编写

默认centos只有很基础的命令 vim , ip addr都没有
编写一个基于centos的镜像 并且有编辑和查看ip的功能

  1. FROM centos
  2. MAINTAINER rem
  3. ENV MYPATH /usr/local
  4. WORKDIR $MYPATH
  5. RUN yum -y install vin
  6. RUN yum -y install net-tools
  7. EXPOSE 80
  8. CMD echo "finished,---successfully"
  9. CMD /bin/bash

6.4.2.2 构建

  1. docker build [OPTIONS] PATH | URL | -

[OPTIONS] 选项

  1. -f :指定要使用的Dockerfile路径;
  2. --tag, -t:镜像的名字及标签
  3. . :表示当前文件夹
  4. Dockerfile文件
  1. FROM centos
  2. MAINTAINER rem
  3. ENV MYPATH /usr/local
  4. WORKDIR $MYPATH
  5. RUN yum -y install vim
  6. RUN yum -y install net-tools
  7. EXPOSE 80
  8. CMD echo "finished,---successfully"
  9. CMD /bin/bash

5.png

6.4.2.3 运行
可以看到 vi命令和 ip addr命令可以使用了
6.png

6.4.3 查看镜像

  1. docker history [OPTIONS] IMAGE

7.png

6.4.4 自定义tomcat9镜像

6.4.4.1 准备环境

新建一个目录dockerfile
再在下面建一个测试文件
拷贝jdk和tomcat到目录中
8.png
新建挂载目录
9.png
Dockerfile文件

  1. FROM centos
  2. MAINTAINER rem
  3. #把宿主机当前上下文的test.txt拷贝到容器/usr/local/路径下
  4. COPY test.txt /usr/local/cincontainer.txt
  5. #把java与tomcat添加到容器中
  6. ADD jdk-8u144-linux-x64.tar.gz /usr/local/
  7. ADD apache-tomcat-9.0.33.tar.gz /usr/local/
  8. #安装vim编辑器
  9. RUN yum -y install vim
  10. #设置工作访问时候的WORKDIR路径,登录落脚点
  11. ENV MYPATH /usr/local
  12. WORKDIR $MYPATH
  13. #配置java与tomcat环境变量
  14. ENV JAVA_HOME /usr/local/jdk1.8.0_144
  15. ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  16. ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.33
  17. ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.33
  18. ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
  19. #容器运行时监听的端口
  20. EXPOSE 8080
  21. #启动时运行tomcat
  22. # ENTRYPOINT ["/usr/local/apache-tomcat-9.0.33/bin/startup.sh" ]
  23. # CMD ["/usr/local/apache-tomcat-9.0.33/bin/catalina.sh","run"]
  24. CMD /usr/local/apache-tomcat-9.0.33/bin/startup.sh && tail -F /usr/local/apache-tom

6.4.4.2 构建镜像

10.png

6.4.4.3 发布容器

11.png

  1. docker run -di -p 9090:8080 --name mytomcat9 -v /root/dockerfile/test:/usr/local/apache-tomcat-9.0.33/webapps/test -v /root/dockerfile/logs:/usr/local/apache-tomcat-9.0.33/logs rem/tomcat9

6.4.4.4 验证

12.png

Dockerfile上复制的文件
13.png

6.4.4.5 容器卷验证


14.png

a.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  6. <title>Insert title here</title>
  7. </head>
  8. <body>
  9. -----------welcome------------
  10. <%="i am in docker tomcat self "%>
  11. <br>
  12. <br>
  13. <% System.out.println("=============docker tomcat self");%>
  14. </body>

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app\_2\_5.xsd"
  5. id="WebApp\_ID" version="2.5">
  6. <display-name>test</display-name>
  7. </web-app>


日志
16.png

下一篇:
docker 入门到实战(七)docker常用安装