Docker的自定义镜像

文章目录

五、自定义镜像

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

镜像的结构是分层的,每一层称为一个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端口加/ ,结果如下:(结果有点不仅如此人意哈,但是还是访问到了的。)
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值