一、什么是 Docker 镜像?Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像是Docker容器的基石,容器是镜像的运行实例,有了镜像才能启动容器。
二、自定义镜像的好处?从软件版本管理角度讲,Dockerfile本身是脚本文件,是可以版本化的。理论上使用Dockerfile,在任何时候任何机器上都可以重演镜像制作过程制作出一模一样的镜像,这是非常有利于工程化的。
Dockerfile 可以快速帮助我们构建自己的定制镜像!
三、构建自己的Centos通过编写 Dockerfile 文件来制作Centos 镜像,并在官方提供的基础上添加 vim、net-tools文件 新建 /home/dockerfile 进入新建的dockerfile文件夹,并新建 mydockerfile-centos # 基础镜像引入centos7FROM centos:centos7# 作者MAINTAINER xiaowang<wanghuichen2003@163.com>#配置工作目录ENV MYPATH /usr/localWORKDIR $MYPATH#由于官方默认提供的centos是压缩版本,没有vim以及一些其它的命令,只有基础的命令,我们需要去下载安装包RUN yum -y install vimRUN yum -y install net-tools# 开放端口80EXPOSE 80# 输出工作目录CMD echo $MYPATHCMD echo "--- end ---"# 以bin/bash启动CMD /bin/bash 查看编写好的文件 
编译刚刚写好的centos7 # 注意后面有一个 . 代表当前目录docker build -f mydockerfile-centos -t mycentos:0.1 . 
等待编译完成即可 完成后运行镜像 docker run -it mycentos:0.1 
vim 文件 
查看ifconfig 
查看镜像历史操作 docker history 2c2feb50d12c 
四、RUN、CMD和ENTRYPOINT的区别RUN命令与CMD命令的区别在哪里? 简单说,RUN命令在Image 文件的构建阶段执行,执行结果会打包进入image文件,CMD命令则是在容器启动后执行。另外,一个Dockerfile可以包含多个RUN命令,但只能由一个CMD命令
注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。 CMD和ENTRYPOINT命令的区别 - CMD:指定容器启动的时候要运行的命令,只有最后一个会生效
- ENRTYPOINT:指定容器启动的时候要运行的命令,命令可以追加
CMD命令 # 进入dockerfile 目录,新建dockerfile-cmd-test文件FROM centos:centos7CMD ["ls", "-a"] 
编译并执行文件 # 编译文件docker build -f dockerfile-cmd-test -t cmdtest .# 执行文件docker run f74776bf8b3c 
追加命令查看全部文件目录 docker run f74776bf8b3c -l 
可以看到,cmd命令把上一个命令给替换了,由于 -l 不是命令,所以报错了,证明cmd命令会覆盖前面的cmd命令,只执行最后一个cmd命令 再次执行查看全部文件目录命令 docker run f74776bf8b3c ls -al 
可以看到,上一个 ls-a命令已被替换为ls -al 命令! ENTRYPOINT命令
回到 /home/dockerfile 目录,新建文件测试ENTRYPOINT并写入内容 cd /home/dockerfilevim dockerfile-entrypoint# 写入以下命令FROM centos:centos7ENTRYPOINT ["ls", "-a"] 
编译文件并执行容器 # 编译文件docker build -f dockerfile-entrypoint# 执行容器docker run 29891c9ff3c9 
在启动时追加命令 docker run 29891c9ff3c9 -l 
可以看到直接追加了命令
五、【实战】Dockerfile制作tomcat镜像下载JDK、Tomcat文件
jdk:https://www.jb51.net/softs/698365.html Tomcat:https://www.jb51.net/softs/537911.html 使用Filezilla将文件上传至 /home/xiaowang 目录下 上传成功后查看文件 
编写文件
编写dockerfile文件,文件名使用官方命名:Dockerfile,build的时候会默认寻找当前目录下的文件,不需要 -f 参数指定 vim Dockerfile# 写入以下文件FROM centos:centos7MAINTAINER ethan<wanghuichen2003@163.com>COPY readme.txt /usr/local/readme.txtADD jdk-8u311-linux-x64.tar.gz /usr/localADD apache-tomcat-9.0.62.tar.gz /usr/local/RUN yum -y install vimENV MYPATH /usr/localWORKDIR $MYPATHENV JAVA_HOME /usr/local/jdk1.8.0_311ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib.tools.jarENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.62ENVPATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 8080CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.62/bin/logs/catalina.out 
构建镜像
编译镜像文件 docker build -t diytomcat:1.0 
启动镜像
编译完成后启动镜像 # 启动容器,外部端口3355映射内部容器8080 重命名容器名称,挂载镜像docker run -d -p 3355:8080 --name diytomcat -v /home/dockerfile/xiaowang/test:/usr/local/apache-tomcat-9.0.62/webapps/test diytomcat:1.0 
测试访问
访问外网ip地址+3355端口出现tomcat界面 
在tomcat目录下新建html文件
由于内部容器和外部进行了挂载,所以修改外部内容,内部容器也会更新 我们进入目录,新建html文件对外访问时展示此页面
cd /home/dockerfile/xiaowang/testvim test.html 写入以下内容 <!DOCTYPE html><html> <head> <meta charset="UTF-8"/> <title>Title</title> </head> <body> <h1>简单的HTML页面</h1> <p>Hello World!</p> </body></html> 浏览器后缀+test路径访问 
ok,至此tomcat镜像制作完毕
小结以上就是【Bug 终结者】对 【云原生】Docker 进阶 – 构建自定义镜像实战 自定义我们的Docker镜像可利于我们的快速开发,提高开发的效率,可谓是开发利器! 下载地址: Docker安装jenkins实现微服务多模块打包的示例代码 k8s查看pod日志的几种实用方法汇总 |