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

简介: Docker进阶-- 构建自己的镜像
📢📢📢📣📣📣

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


❤️❤️❤️ 感谢各位大可爱小可爱! ❤️❤️❤️

在这里插入图片描述

@[TOC]

一、什么是 Docker 镜像?

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

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

二、自定义镜像的好处?

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

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

三、构建自己的Centos

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

新建 /home/dockerfile

cd /home
mkdir dockerfile

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

# 基础镜像引入centos7
FROM centos:centos7
# 作者
MAINTAINER xiaowang<wanghuichen2003@163.com>
#配置工作目录
ENV MYPATH /usr/local

WORKDIR $MYPATH
#由于官方默认提供的centos是压缩版本,没有vim以及一些其它的命令,只有基础的命令,我们需要去下载安装包
RUN yum -y install vim
RUN yum -y install net-tools

# 开放端口80
EXPOSE 80

# 输出工作目录
CMD echo $MYPATH
CMD 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:centos7
CMD ["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:centos7
ENTRYPOINT ["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:centos7
MAINTAINER ethan<wanghuichen2003@163.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u311-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.62.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_311
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib.tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.62
ENVPATH $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 终结者】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💝💝💝!
相关文章
|
6天前
|
运维 Cloud Native 持续交付
云原生技术:构建未来应用的基石
在当今这个数字化时代,云原生技术正迅速成为推动企业创新和数字化转型的关键力量。本文将深入探讨云原生的核心概念、主要特点以及它如何改变我们构建、部署和运行应用程序的方式。通过分析Kubernetes、微服务、容器化等关键技术,本文旨在为读者提供一个关于云原生技术的全面理解,并探讨其在未来软件开发领域的重要性。
|
3天前
|
运维 Cloud Native 持续交付
探索云原生技术:构建高效、可扩展的现代应用
在当今数字化时代,云原生技术正迅速改变着企业构建和运行应用程序的方式。本文深入探讨了云原生技术的基本原理、核心组件及其带来的优势,揭示了如何通过采用云原生架构来提升应用的敏捷性、弹性和可扩展性。无论是开发者、运维人员还是企业决策者,了解并掌握云原生技术都将成为推动业务创新和保持竞争力的关键。
|
6天前
|
监控 Cloud Native 持续交付
云原生架构:构建弹性与高效的现代应用##
随着云计算技术的不断成熟,云原生架构逐渐成为企业技术转型的重要方向。本文将深入探讨云原生的核心概念、主要技术和典型应用场景,以及如何通过云原生架构实现高可用性、弹性扩展和快速迭代,助力企业在数字化转型中保持竞争优势。 ##
25 6
|
7天前
|
运维 Cloud Native 持续交付
云原生架构:构建未来应用的基石
本文将深入探讨云原生架构的核心概念、主要优势以及实际应用案例,揭示其在现代IT领域的重要性。通过详细解析云原生技术的各个方面,帮助读者更好地理解和应用这一前沿技术。
|
5天前
|
网络协议 安全 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基础知识,包括网络驱动、端口映射和命名等核心概念,并深入探讨了 Bridge、Host、Overlay 和 Macvlan 四种网络类型的特点及应用场景。此外,还提供了创建、连接、查看和删除自定义网络的命令示例,以及高级网络配置方法,如网络命名空间、DNS 解析和安全通信配置,帮助开发者构建更健壮的容器化应用。
|
7天前
|
存储 Kubernetes Docker
深入探索容器化技术:Docker 实战与 Kubernetes 管理
深入探索容器化技术:Docker 实战与 Kubernetes 管理
21 0
|
8天前
|
Cloud Native Devops 持续交付
探秘云原生架构:构建高效、灵活的现代应用
在当今数字化时代,企业面临着日益复杂的技术挑战和快速变化的业务需求。为了适应这种环境,云原生架构应运而生。本文将带您深入了解云原生的核心概念、关键技术和应用案例,揭示其在提升业务效率、降低运维成本方面的独特优势。通过阅读本文,您将获得关于如何利用云原生技术构建现代化应用的宝贵见解。
25 0
|
8天前
|
运维 Cloud Native 持续交付
云原生技术:构建现代应用的未来
在当今数字化时代,技术的快速迭代和业务需求的不断变化要求企业具备更高的灵活性和响应速度。云原生技术以其独特的优势,如微服务架构、持续集成/持续部署(CI/CD)、容器化等,成为现代企业实现敏捷开发和运维的重要手段。本文将深入探讨云原生技术的核心概念、关键技术以及其在不同应用场景中的优势和挑战。
17 0
|
8天前
|
Cloud Native 持续交付 开发者
云端之旅:探索云原生应用的构建与部署
【9月更文挑战第26天】在这篇文章中,我们将一起踏上一段激动人心的旅程,深入探讨云原生应用的构建和部署。通过实际的代码示例和详细的步骤说明,我们将揭开云原生技术的神秘面纱,展示如何利用这些技术来创建灵活、可扩展的应用。无论你是云原生领域的新手还是希望深化理解的开发者,这篇文章都将为你提供宝贵的知识和技能。
18 0
|
Kubernetes 应用服务中间件 Docker
Docker——自定义网络实现
Docker——自定义网络实现
466 0
下一篇
无影云桌面