Dockerfile自定义镜像 布满荆棘的人生 2024-03-25 20:36 47阅读 0赞 常见的镜像在`DockerHub`就能找到,但是我们自己写的项目就必须自己构建镜像了。 而要自定义镜像,就必须先了解镜像的结构才行。 ### 1.镜像结构 ### 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。 我们以`MySQL`为例,来看看镜像的组成结构: ![在这里插入图片描述][a8e4b2f0f9754c6880e98a2338fed358.png_pic_center] 简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。 我们要构建镜像,其实就是实现上述打包的过程。 ### 2.`Dockerfile`语法 ### 构建自定义的镜像时,并不需要一个个文件去拷贝,打包。 我们只需要告诉`Docker`,我们的镜像的组成,需要哪些`BaseImage`、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来`Docker`会帮助我们构建镜像。 而描述上述信息的文件就是`Dockerfile`文件。 `Dockerfile`就是一个文本文件,其中包含一个个的**指令(`Instruction`)**,用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层`Layer`。 ![在这里插入图片描述][df36664753f543fcab22f2cfb4da3d91.png_pic_center] 更新详细语法说明,请参考官网文档:[Dockerfile reference][] ### 3.构建`Java`项目 ### #### 3.1.基于`Ubuntu`构建`Java`项目 #### 需求:基于`Ubuntu`镜像构建一个新镜像,运行一个`java`项目。[CSDN资源下载][CSDN] * 步骤1:新建一个空文件夹`docker-demo` * 步骤2:拷贝`docker-demo.jar`文件到`docker-demo`这个目录 * 步骤3:拷贝`jdk8.tar.gz`文件到`docker-demo`这个目录 * 步骤4:拷贝`Dockerfile`到`docker-demo`这个目录 其中`Dockerfile`的内容如下: # 指定基础镜像 FROM ubuntu:16.04 # 配置环境变量,JDK的安装目录 ENV JAVA_DIR=/usr/local # 拷贝jdk和java项目的包 COPY ./jdk8.tar.gz $JAVA_DIR/ COPY ./docker-demo.jar /tmp/app.jar # 安装JDK 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 # 暴露端口 EXPOSE 8090 # 入口,java项目的启动命令 ENTRYPOINT java -jar /tmp/app.jar * 步骤5:进入`docker-demo` 将准备好的`docker-demo`上传到虚拟机任意目录,然后进入`docker-demo`目录下 ![在这里插入图片描述][4ebd66b4313548ee9f94a168ae75ec41.png_pic_center] * 步骤6:运行命令: docker build -t javaweb:1.0 . ![在这里插入图片描述][283dbe04d2ce449cbc3e25812e928b7e.png_pic_center] * 步骤7:查询运行结果 ![在这里插入图片描述][6cb94b732b524e71bf0252c014fe3ff4.png_pic_center] * 步骤8:创建并运行`javaweb:1.0`容器的命令: docker run --name web -p 8090:8090 -d javaweb:1.0 ![在这里插入图片描述][83e7bc73339d4dd4bf1f14daf5bdad3e.png_pic_center] * 步骤9:最后访问 `http://124.222.106.122:8090/hello/count` ![在这里插入图片描述][bf6bbe016308463e9962dcb3f91ace22.png_pic_center] #### 3.2.基于`java8`构建`Java`项目 #### 虽然我们可以基于`Ubuntu`基础镜像,添加任意自己需要的安装包,构建镜像,但是却比较麻烦。所以大多数情况下,我们都可以在一些安装了部分软件的基础镜像上做改造。 例如,构建`java`项目的镜像,可以在已经准备了`JDK`的基础镜像基础上构建。 需求:基于`java:openjdk-8u111-alpine`镜像,将一个`Java`项目构建为镜像 实现思路如下: * ① 新建一个空的目录,然后在目录中新建一个文件,命名为`Dockerfile` * ② 拷贝课前资料提供的`docker-demo.jar`到这个目录中 * ③ 编写`Dockerfile`文件: * a )基于`java:openjdk-8u111-alpine`作为基础镜像 * b )将`docker-demo.jar`拷贝到镜像中 * c )暴露端口 * d )编写入口`ENTRYPOINT` 内容如下: # 指定基础镜像 FROM java:openjdk-8u111-alpine # 拷贝jdk和java项目的包 COPY ./docker-demo.jar /tmp/app.jar # 暴露端口 EXPOSE 8090 # 入口,java项目的启动命令 ENTRYPOINT java -jar /tmp/app.jar * ④ 使用`docker build`命令构建镜像 docker build -t javaweb:2.0 . ![在这里插入图片描述][bf3faa5096fa4e2db10eda6466528e8a.png_pic_center] * ⑤ 使用`docker run`创建容器并运行 docker run --name web2 -p 20080:8090 -d javaweb:2.0 ![在这里插入图片描述][daaec2784a8a48048f3d2c3d66ac5c56.png_pic_center] 最后访问 `http://124.222.106.122:20080/hello/count` ![在这里插入图片描述][80b0498bbcb14025bea033c9aa5a4741.png_pic_center] ### 4.小结 ### 小结: 1. `Dockerfile`的本质是一个文件,通过指令描述镜像的构建过程 2. `Dockerfile`的第一行必须是`FROM`,从一个基础镜像来构建 3. 基础镜像可以是基本操作系统,如`Ubuntu`。也可以是其他人制作好的镜像,例如:`java:openjdk-8u111-alpine` [a8e4b2f0f9754c6880e98a2338fed358.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/25/cda5e681a00c49fa915acedb18d85082.png [df36664753f543fcab22f2cfb4da3d91.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/25/879f30e4608641d29ad436ed07c8af14.png [Dockerfile reference]: https://docs.docker.com/engine/reference/builder [CSDN]: https://download.csdn.net/download/qq_37726813/87588669 [4ebd66b4313548ee9f94a168ae75ec41.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/25/aa8286fc74f443998c754c296e319d04.png [283dbe04d2ce449cbc3e25812e928b7e.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/25/5719a3969cc9449dbe899fd7a4fac52f.png [6cb94b732b524e71bf0252c014fe3ff4.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/25/04b64ca6f1fe438aadbc01d5aa52a323.png [83e7bc73339d4dd4bf1f14daf5bdad3e.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/25/c5f3118646f94a7a96965ac6baa33c12.png [bf6bbe016308463e9962dcb3f91ace22.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/25/051e555afaed446ab29d3b289dd2ae3b.png [bf3faa5096fa4e2db10eda6466528e8a.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/25/0f32793f3de94252939541e91e36aabc.png [daaec2784a8a48048f3d2c3d66ac5c56.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/25/3e7a72a6887c45ac936294d4b822c921.png [80b0498bbcb14025bea033c9aa5a4741.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/25/92779aa048c8443bb15fa906eff8376d.png
还没有评论,来说两句吧...