使用 Dockerfile 自定义 Docker 镜像

发布时间 2023-06-07 20:01:25作者: 乔京飞

对于一些常用的 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 ,填写以下内容并保存

# 指定基础镜像
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 制作镜像。

image

然后使用 docker images 查看制作好的镜像:

image


三、运行镜像并验证

镜像已经制作好了,然后使用以下命令运行:

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 查看正在运行的容器:

image

此时打开浏览器访问 http://192.168.216.128 就可以访问 SpringBoot 上传页面程序的页面了

image

通过页面上传的文件,在 192.168.216.128 的 /app/updownfiles/ 目录中可以查看到。如果你直接在 /app/updownfiles/ 目录中添加或删除文件,docker 内部的 /opt/files/ 目录也会自动同步更新。