使用 Dockerfile 自定义 Docker 镜像
对于一些常用的 Docker 镜像,我们可以从 Docker 官方仓库或者国内的阿里云仓库中获取,比如 mysql、redis、nginx 等等。但是对于一些我们自己开发的程序,要想很方便的在 Docker 中部署,还是需要自己制作镜像。
这里不介绍 Docker 常用命令的使用,网上学习资料很多,这里就直接进行演示。以之前的博客【SpringBoot 文件上传下载工具样例】的 Demo 程序为基础,制作自己的镜像并部署在 Docker 中供其它机器进行访问。
一、程序打包
从【SpringBoot 文件上传下载工具样例】这边博客中下载到 Demo 代码,使用 IDEA 打开工程,打开 application.yml 配置文件,查看里面配置的启动端口和文件存放的目录绝对路径:
server:
# 启动端口(这里就不修改了)
port: 9000
spring:
application:
name: fileupdown
servlet:
multipart:
# 单个文件的上传大小限制
max-file-size: 100MB
# 如果同时上传多个文件时,总大小限制
max-request-size: 100MB
# 这里将文件上传后存放的目录,设置为 /opt/files/
# 不用担心所配置的目录路径在 docker 中是否存在,
# 如果目录路径不存在,Docker 运行后会自动创建
upload:
path: /opt/files/
启动端口是 9000 ,这里就保持原样不变。由于是在 Docker 中部署,Docker 镜像运行的肯定是 linux 系统,因此文件上传后存放的目录需要配置为 linux 系统下的目录绝对路径,这里配置的绝对路径为 /opt/files/
可以修改一下 pom 文件,在 build 下新增 finalName 配置,指定打包后的 jar 包名称为 fileupdown.jar
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
</parent>
<groupId>com.jobs</groupId>
<artifactId>fileupdown</artifactId>
<version>1.0</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
</dependencies>
<build>
<!--
这里将 finalName 配置为 fileupdown,
这样打包后的 jar 包名称就为:fileupdown.jar
-->
<finalName>fileupdown</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
完成以上操作后,就可以打包了,在 target 目录下就能够找到打包后的 fileupdown.jar 文件。
二、制作自定义镜像
上篇博客中,我在自己的虚拟机 192.168.216.128 上已经安装好了 Docker ,这里就使用这个虚拟机。
使用 xshell 登录到 192.168.216.128 中,我使用 root 账号登录,默认进入到的目录是 /root/ 中。
创建一个目录 /root/mkimage/ ,执行命令 mkdir /root/mkimage
使用 xftp 将 fileupdown.jar 上传到 /root/mkimage/ 目录中,然后进入该目录 cd /root/mkimage
创建一个 Dockerfile 文件:vim Dockerfile
,填写以下内容并保存
# 指定基础镜像,如果需要生成图片,则需要使用 java:8 这个基础镜像
FROM java:8-alpine
# 拷贝文件到容器中
COPY ./fileupdown.jar /opt/app.jar
# 暴露端口
EXPOSE 9000
# 入口,java项目的启动命令
ENTRYPOINT java -jar /opt/app.jar
这里基于 java:8-alpine 制作自定义镜像,因为其内部已经安装好了 openjdk1.8 并且系统的编码是 UTF-8,这就节省了很多麻烦事儿。之前我基于 Centos7 和 ubuntu 制作自定义镜像,其内部的编码不是 UTF-8,导致上传的文件如果包含中文名称,则显示的都是问号(?),看着很不爽。基于 java:8-alpine 就不会出现这样的问题。
最后运行命令 docker bulid -t fileupdown:1.0 .
即可制作镜像。需要注意最后的那个点(.)不能省略,表示根据当前目录下的 Dockerfile 文件制作镜像,如果你用来制作镜像的文件名不是 Dockerfile ,而是其它的名字,如 aaa.txt 的话,那么你需要使用这样的命令:docker build -t fileupdown:1.0 -f aaa.txt
表示使用当前目录下的 aaa.txt 制作镜像。
然后使用 docker images
查看制作好的镜像:
三、运行镜像并验证
镜像已经制作好了,然后使用以下命令运行:
docker run --name fudweb -p 80:9000 -v /app/updownfiles/:/opt/files/ -d fileupdown:1.0
这里使用外部机器的 80 端口映射内部的 9000 端口,另外使用外部机器的 /app/updownfiles/ 目录映射内部的 /opt/files/ ,这样就可以访问外部机器的 80 端口来访问内部的 SpringBoot 程序,另外上传的文件可以保存到外部机器的 /app/updownfiles/ 目录中。
运行完以上命令后,可以使用 docker ps
查看正在运行的容器:
此时打开浏览器访问 http://192.168.216.128
就可以访问 SpringBoot 上传页面程序的页面了
通过页面上传的文件,在 192.168.216.128 的 /app/updownfiles/ 目录中可以查看到。如果你直接在 /app/updownfiles/ 目录中添加或删除文件,docker 内部的 /opt/files/ 目录也会自动同步更新。