Docker的自定义镜像

2023-10-29

文章目录

五、自定义镜像

回顾一下,什么是镜像?
答:镜像是将应用程序及其所需要的系统函数库、环境、依赖、配置打包而成。

镜像的结构是分层的,每一层称为一个Layer。其中

  • 最底层包含基本的系统函数库、环境变量、文件系统 的层我们称之为BaseImage层
  • 最顶层作为镜像的入口,是镜像中应用启动的命令,我们称之为Entrypoint。
  • 其他在BaseImage层基础上添加的依赖、安装程序以及完成整个应用的安装和配置,处于BaseImage层和Entrypoint层之间,每一层我们称为一个Layer。

下面直接来一个实例(基于CentOS 7搭建一个JavaWeb的镜像工程),我们自己来定义一个我们的Java工程的镜像。

#新建一个目录
mkdir -p /tmp/docker-demo
#进入该目录
cd /tmp/docker-demo

然后我们把黑马教程给我们的jar包、jdk8 放到我们的服务器上。可以去我的阿里云盘获取:(由于阿里云盘不支持分享压缩包,因此这里jdk8得自己去下载一个)

jar包 阿里网盘下载地址:https://www.aliyundrive.com/s/FmF3okgLrFL

我们再介绍一下我们的DockerFile文件,及其常用的指令:(详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder

这里,介绍几个常用的DockerFile文本文件的指令:
在这里插入图片描述
来个实例:

# 指定基础镜像(即基于哪个系统,如果是Ubuntu16.04,那就是ubuntu:16.04,当然了,具体还得按照dockhub官网的来,不能乱写)
FROM centos:7
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local

# 拷贝jdk和java项目的包(这里的$JAVA_DIR就是上面的/usr/local)
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar

# 安装JDK(RUN就是使用我们的终端运行的指令)
RUN cd $JAVA_DIR \
 && tar -xf ./jdk8.tar.gz \
 && mv ./jdk1.8.0_144 ./java8

# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin

# 暴露端口(就是容器的端口,前面有用过-p 8080:80,8080是宿主机端口,
# 而80就是这里EXPOSE的端口号,当然了,这里我们暴露出去的端口号是9090)
EXPOSE 9090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

废话少说,此时我们的 /tmp/docker-demo 目录应该是这样的:
在这里插入图片描述
然后,我们就可以基于我们的Dockerfile文件制作我们的镜像了,命令如下:

docker build -t javaobject:1.0 .

在这里插入图片描述
这里,docker build 是创建镜像,-t 表示 -tag,用来给我们的镜像取名(名称中不能有大写),然后后面那个是版本号,我们就当他是1.0了,最后最后,记得有个空格跟一个点,表示将当前目录下的东西打包成镜像,当然了,如果你现在在其他位置要将 /tmp/docker-demo 下的东西制作成镜像的话,那么就将点(.)改成你要制作镜像的地址就可以了。
制作成功如下:(最后有一句Successfully tagged javaobject:1.0)
在这里插入图片描述
此时使用我们的docker images 命令可以看到我们的镜像已经成功生成了。
在这里插入图片描述
如果觉得这种写法过于复杂了,其实我们可以看看我们刚才的Dockerfile文件,其实有很大篇幅都是在安装跟配置我们的JDK,如果以后我们为我们的上百个微服务也都整一个镜像,那么我们光写这些东西,不得把人写麻了吗,有没有可能我们的Dockerfile也可以代码复用一下。当然是有的!!!
在这里插入图片描述
在dockerhub上面已经有人将JDK打包成一个轻量级的给我们用了,我们只需要 在 FROM 的时候基于那个包,而不是CentOS,或者Ubuntu,这不就好起来了吗?顺便提一嘴,这里我们要替换的环境是 java:8-alpineopenjdk:8-jre-alpine) 。

再来个其他博主的描述信息:Alpine 操作系统是一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,因此得到开源社区越来越多的青睐。在保持瘦身的同时,Alpine 还提供了自己的包管理工具 apk,可以通过 https://pkgs.alpinelinux.org/packages 网站上查询包信息,也可以直接通过 apk 命令直接查询和安装各种软件。
于是考虑使用Alpine作为最小的运行环境,docker官方也支持Apline的服务且有jdk与Alpine集成好的镜像,我们可以直接使用。
————————————————
版权声明:本文为CSDN博主「蓝色格子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/github_38924695/article/details/120513307

此时,我们的Dockerfile文件就可以修改为:

# 指定基础镜像(java:8-alpine这个在dockerhub上面已经找不到了)
FROM openjdk:8-jre-alpine

#拷贝jar包到/tmp目录下,并命名为 app.jar
COPY ./docker-demo.jar /tmp/app.jar

# 暴露端口
EXPOSE 9090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

此时,我们再使用docker build -t javaobject:1.1 .构建我们的镜像如下:
在这里插入图片描述
要想用我们的镜像启动一个容器也很简单,使用如下命令:

#启动容器
docker run --name myJava -p 9090:9090 -d javaobject:1.1

#防火墙开放端口
firewall-cmd --add-port=9090/tcp --permanent --zone=docker
firewall-cmd --reload

然后我们就可以访问我们的服务器的ip地址加8090端口加/ ,结果如下:(结果有点不仅如此人意哈,但是还是访问到了的。)
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker的自定义镜像 的相关文章

  • Bash - 比较 2 个文件列表及其 md5 校验和

    我有 2 个列表 其中包含带有 md5sum 检查的文件 即使文件相同 列表也具有不同的路径 我想检查每个文件的 md5 和 我们正在讨论数千个文件 这就是为什么我需要脚本来仅显示差异 第一个列表是普通列表 第二个列表是文件的当前状态 我想
  • 运行 shell 命令并将输出发送到文件?

    我需要能够通过 php 脚本修改我的 openvpn 身份验证文件 我已将我的 http 用户设置为免通 sudoer 因为这台机器仅在我的家庭网络中可用 我目前有以下命令 echo shell exec sudo echo usernam
  • 如何在 sles 12 中安装 docker?

    我想在我的 suse 系统中安装 docker stable 版本 版本 sles 12 在suse系统中安装docker 需要添加docker的仓库 我没有找到任何用于添加1 6版本的docker存储库的url 存储库url 我发现 do
  • Windows docker:权限被拒绝 /var/run/docker.sock

    当我尝试使用自动发现运行 filebeat 时 出现以下错误 退出 自动发现提供程序设置中出现错误 已获得权限 尝试连接到 Docker 守护程序套接字时被拒绝 unix var run docker sock 获取http 2Fvar 2
  • 如何在linux中使用iptables将http和https流量转发到透明代理[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • 无法解析docker容器内的域名

    我在 Windows PC 上的 virtualbox 中运行 Linux 虚拟机 我在虚拟机中安装了docker 然后我使用以下命令启动了一个高山容器docker run it alpine 在这个容器中 我可以成功 ping 外部 IP
  • 在用户程序中使用 或在驱动程序模块代码中使用 ...这有关系吗?

    我正在开发一个设备驱动程序模块和关联的用户库来处理ioctl 来电 该库获取相关信息并将其放入一个结构中 该结构被传递到驱动程序模块中并在那里解压 然后进行处理 我省略了很多步骤 但这就是总体思路 一些数据通过结构体传递ioctl is u
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec
  • 如何在arm64主机上运行amd64 docker镜像

    警告 请求的映像平台 linux amd64 与检测到的主机平台 linux arm64 v8 不匹配 并且未请求特定平台 2021 07 28 22 25 06 349222 F tensorflow core platform cpu
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na
  • 隐式声明“gets”

    据我所知 隐式声明 通常意味着该函数必须在调用之前放置在程序的顶部 或者我需要声明原型 然而 gets应该在stdio h文件 我已包含 有没有什么办法解决这一问题 include
  • 如何通过不同的接口路由 TCP/IP 响应?

    我有两台机器 每台机器都有两个有效的网络接口 一个以太网接口eth0和 tun tap 接口gr0 目标是使用接口在机器 A 上启动 TCP 连接gr0但然后让机器 B 的响应 ACK 等 通过以太网接口返回 eth0 因此 机器 A 发出
  • 如何使用缓存快速重建dockerfile?

    我想优化我的 Dockerfile 我希望将缓存文件保留在磁盘中 但是 当我跑步的时候我发现docker build 它总是尝试从网络获取每个文件 我希望在构建期间共享我的缓存目录 例如 var cache yum x86 64 6 但是
  • Docker 多个相同端口问题

    我目前正在解决方案中开发两个相互关联的 ASP NET Core WebAPI 服务 Service1 和 Service2 两者都有 docker 文件并暴露端口 80 Service1是一个独立的服务 需要从Service2调用 我已经
  • 如何使用 VSCode 调试 Linux 核心转储?

    我故意从我使用 VSCode 编写的 C 应用程序生成核心转储 我不知道如何调试核心转储 有没有人愿意分享这方面的经验 更新 我相信我现在已经可以使用了 我为核心文件创建了第二个调试配置 我需要添加指向生成的转储文件的 coreDumpPa
  • Unix 中的访问时间是多少

    我想知道访问时间是多少 我在网上搜索但得到了相同的定义 读 被改变 我知道与touch我们可以改变它 谁能用一个例子来解释一下它是如何改变的 有没有办法在unix中获取创建日期 时间 stat结构 The stat 2 结构跟踪所有文件日期
  • 无法连接到docker中的elasticsearch容器

    我正在尝试使用 docker 的官方 elasticsearch 镜像 我遵循了本指南 https www elastic co guide en elasticsearch reference current docker html但是当
  • 如何在没有 Visual Studio 和 docker compose 的情况下使用 docker 复制 csproj 文件?

    我刚刚使用 Visual Studio 15 8 8 启动了一个 NET Core 项目 2 1 的新解决方案 通过将docker compose文件设置为启动项目即可运行和调试 有用 从逻辑上讲 我应该能够使用简单的命令行语句构建 doc
  • ASP.NET Core - 在 Visual Studio 2015 中通过 Docker 调试时出现问题

    我在 Visual Studio 中使用 Docker 运行基于 ASP NET Core 构建的应用程序时遇到问题 我的应用程序仅使用dnxcore50框架 我的project json 文件是 version 1 0 0 compila
  • 在 docker 容器内创建 android 模拟器时出现“sh: 1: file: not found”

    我正在尝试在 docker 容器内创建一个 android 模拟器 但遇到了一些问题 SDK 更新和 AVD 创建成功 我尝试创建模拟器 出现以下错误 emulator avd test 22 no skin no audio no win

随机推荐

  • go版本升级

    Window版本的go升级 首先到Go语言中文网下载windows对应的go版本 此处将go升级到1 18 版本 直接下载安装 安装之前会提示卸载旧版本 确定后直接安装在原来的Go安装目录 直接覆盖 安装成功后 在终端输入go versio
  • oracle优化中的常用语句

    查看session使用数 或者称建立的连接数 select count from v session 1 2 查看oracle锁 SELECT substr v lock sid 1 4 SID substr username 1 12 U
  • 专利与论文-6:《专利权利要求书》的撰写与注意事项

    前言 专利权利要求书 在对于专利而言 怎么说它的重要性都不过分 它直接关系到你的专利的权利在哪里 当发生专利侵权的时候 如何保护自己的利益 如果说 专利权利说明书 是专利的技术性文档 那么 专利权利要求书 就是法律性文档 它定义了 哪些技术
  • prefetch 和 preload 及 webpack 的相关处理

    使用预取和预加载是网站性能和用户体验提升的一个很好的途径 本文介绍了使用 prefetch 和 prefetch 进行预取和预加载的方法 并使用 webpack 进行实现 Link 的链接类型 标签的 rel 属性可以定义链接类型 pref
  • 60黑马QT笔记之SQLite

    60黑马QT笔记之SQLite 1 与MYSQL的区别 1 SQLite是本地数据库 不需要和MYSQL一样需要连接 2 插入时不支持自动增长 所以主键例如id 在输入时需要自己去控制 3 使用时需要先提前建好后缀为xxx db的文本文件
  • ubuntu 20.04安装开发环境总结_安装python

    Ubuntu 20 04 是一款主要面向开发人员的操作系统之一 与此同时 它还支持多种开发环境和工具的使用 但是因为对市面上各种软件的支持没有window那样友好 所以对ubuntu系统安装配置各种环境的问题做了个总结 安装 PyCharm
  • C/C++入门秋招知识点八股文

    1 C C 关键字 1 1 static 静态 变量 在C中 关键字static是静态变量 静态变量只会初始化一次 然后在这函数被调用过程中值不变 在文件内定义静态变量 函数外 作用域是当前文件 该变量可以被文件内所有函数访问 不能被其他文
  • 38.求解简单表达式。输入一个形式如“操作数  运算符  操作数”的四则运算表达式,输出运算结果,要求使用switch语句编写

    38 求解简单表达式 输入一个形式如 操作数 运算符 操作数 的四则运算表达式 输出运算结果 要求使用switch语句编写 include
  • 高速缓存(cache)原理

    高速缓存 cache 概念和原理 cache基本思想 cache 存储器 Cache memories 在处理器附近增加一个小容量快速存储器 cache 基于SRAM 由硬件自动管理 cache基本思想 频繁访问的数据块存储在cache中
  • 前端和后端终极学习视频(百度网盘资料)

    1 ps 链接 https pan baidu com s 1mjYbcJA密码 pqdt2 HTML5 CSS3从入门到精通 iso链接 https pan baidu com s 1mjYbcJA密码 gdyw3 Javascript视
  • 视频去抖动稳像总结

    下面转载了两篇别的文章 都是传统算法做的 后面将会持续更新 原文链接 https blog csdn net update7 article details 107864986 1 背景 点播 直播行业的蓬勃发展 使用户生产视频 UGC 逐
  • 使用sqoop命令报错ERROR mapreduce.ExportJobBase: Export job failed ERROR tool.ExportTool: Error during exp

    如图所示 仔细查看错误信息会发现有下面一条 2022 07 10 20 17 39 786 INFO mapreduce Job Job job 1657447073157 0042 running in uber mode false 2
  • 用Android NDK编译FFmpeg错误解决

    转载 http abitno me compile ffmpeg android ndk 编译出来只有15k 后来借鉴这篇文章 http www cnblogs com shaobin0604 archive 2011 08 05 2128
  • 【译】Nodejs最好的ORM - TypeORM

    TypeORM github https github com typeorm typeorm 这篇译文是从TypeORM github上的使用说明上翻译过来的 已经提交PR并merge到库中了 TypeORM是一个采用TypeScript
  • Angular引入node_modules里面的css文件出错Module build failed:TypeError:URL.startsWith is not a function

    问题困扰了好几天 原来是路径的问题 1 目录结构如下 2 webpack配置 include path join process cwd src styles css test css use style loader loader css
  • Hibernate Annotation (Hibernate 注解)

    进入 http www hibernate org 说明文档 英文 http docs jboss org hibernate annotations 3 5 reference en html single 中文 http docs jb
  • 轻量级网络:DenseNet

    目录 Insight DenseNet ResNets Dense connectivity Composite function Pooling layers Growth rate Bottleneck layers Compressi
  • CSS深度选择器(穿透)

    问题 vue compiler sfc v deep usage as a combinator has been deprecated Use deep inner selector 报错 修改 正确 CSS深度选择器 穿透 1 styl
  • JDK安装及oracle安装

    这里写自定义目录标题 JDK安装 虚拟机win03中安装Oracle JDK安装 1 jdk安装 解压安装包进行安装 记住安装地址 不要安装在含有中文的文件夹 若忘记则win r键 输入cmd 进入命令行模式 输入 where java 查
  • Docker的自定义镜像

    文章目录 五 自定义镜像 五 自定义镜像 回顾一下 什么是镜像 答 镜像是将应用程序及其所需要的系统函数库 环境 依赖 配置打包而成 镜像的结构是分层的 每一层称为一个Layer 其中 最底层包含基本的系统函数库 环境变量 文件系统 的层我