回顾一下,什么是镜像?
答:镜像是将应用程序及其所需要的系统函数库、环境、依赖、配置打包而成。
镜像的结构是分层的,每一层称为一个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-alpine(openjdk: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端口加/ ,结果如下:(结果有点不仅如此人意哈,但是还是访问到了的。)