写点什么

【云原生】Docker 进阶 -- 构建自定义镜像实战

作者:Bug终结者
  • 2022 年 8 月 16 日
    河北
  • 本文字数:2670 字

    阅读完需:约 9 分钟

【云原生】Docker 进阶 -- 构建自定义镜像实战

📢📢📢📣📣📣<br>哈喽!大家好,我是【Bug 终结者,【CSDNJava 领域优质创作者】🏆,阿里云受邀专家博主🏆,51CTO 人气博主🏆 . <br/>一位上进心十足,拥有极强学习力的【Java 领域博主】😜😜😜 <br/>🏅【Bug 终结者】博客的领域是【面向后端技术】的学习,未来会持续更新更多的【后端技术】以及【学习心得】。 偶尔会分享些前端基础知识,会更新实战项目,面向企业级开发应用!🏅 如果有对【后端技术】、【前端领域】感兴趣的【小可爱】,欢迎关注【Bug 终结者】💞💞💞<br>❤️❤️❤️ 感谢各位大可爱小可爱! ❤️❤️❤️



一、什么是 Docker 镜像?

Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。


镜像是 Docker 容器的基石,容器是镜像的运行实例,有了镜像才能启动容器。

二、自定义镜像的好处?

从软件版本管理角度讲,Dockerfile 本身是脚本文件,是可以版本化的。理论上使用 Dockerfile,在任何时候任何机器上都可以重演镜像制作过程制作出一模一样的镜像,这是非常有利于工程化的。


Dockerfile 可以快速帮助我们构建自己的定制镜像!

三、构建自己的 Centos

通过编写 Dockerfile 文件来制作 Centos 镜像,并在官方提供的基础上添加 vim、net-tools 文件


新建 /home/dockerfile


cd /homemkdir dockerfile
复制代码


进入新建的 dockerfile 文件夹,并新建 mydockerfile-centos


# 基础镜像引入centos7FROM centos:centos7# 作者MAINTAINER xiaowang<wanghuichen2003@163.com>#配置工作目录ENV MYPATH /usr/local
WORKDIR $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 文件


vim test
pwd
复制代码



查看 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/dockerfile
vim dockerfile-entrypoint
# 写入以下命令FROM centos:centos7ENTRYPOINT ["ls", "-a"]
复制代码



编译文件并执行容器


# 编译文件docker build -f dockerfile-entrypoint# 执行容器docker run 29891c9ff3c9
复制代码



在启动时追加命令


docker run 29891c9ff3c9 -l
复制代码



可以看到直接追加了命令

五、【实战】Dockerfile 制作 tomcat 镜像

下载 JDK、Tomcat 文件


链接:https://pan.baidu.com/s/1OT3QZlMVhU_9qLvEwbmk6A提取码:6666


使用 Filezilla 将文件上传至 /home/xiaowang目录下


上传成功后查看文件



编写文件


编写 dockerfile 文件,文件名使用官方命名:Dockerfile,build 的时候会默认寻找当前目录下的文件,不需要 -f 参数指定


vim Dockerfile
# 写入以下文件
FROM centos:centos7MAINTAINER ethan<wanghuichen2003@163.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u311-linux-x64.tar.gz /usr/localADD apache-tomcat-9.0.62.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/localWORKDIR $MYPATH
ENV 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/bin
EXPOSE 8080
CMD /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/test
vim 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 镜像可利于我们的快速开发,提高开发的效率,可谓是开发利器!


如果这篇【文章】有帮助到你,希望可以给【Bug 终结者】点个赞👍,创作不易,如果有对【后端技术】、【前端领域】感兴趣的小可爱,也欢迎关注❤️❤️❤️ 【Bug 终结者】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💝💝💝!

发布于: 刚刚阅读数: 3
用户头像

Bug终结者

关注

励志成为一个优秀的开发者~ 2021.12.09 加入

星星之火,可以燎原

评论

发布
暂无评论
【云原生】Docker 进阶 -- 构建自定义镜像实战_Docker_Bug终结者_InfoQ写作社区