Docker Desktop配合WSL和IDEA进行Java服务的打包+镜像构建+容器运行测试

  在Windows10 22H2+的版本可以使用WSL了(Windows Subsystem for Linux 或叫 Windows Support Linux,即Windows内置的Linux子系统)!它对于在Windows下工作的容器化微服务开发人员是非常有用的!有了它你就可以直接在Windows本地构建Linux平台的镜像并运行容器进行测试(当然WSL还得配合Docker Desktop来使用)。关于WSL的说明见微软官网(https://learn.microsoft.com/zh-cn/windows/wsl/),关于Docker Desktop的说明见Docker官网(https://docs.docker.com/desktop/install/windows-install/),这里假设你都已经安装好了这两个东东!

  首先,我们先来配置一下Docker Desktop里的Docker Engine:

  国内加速的公有镜像库地址如下(私有的是我自己本地的):

  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://registry.aliyuncs.com",
    "https://registry.docker-cn.com"
  ]

  修改好后,点右下角的 【Apply & restart】,等左下角的【鲸鱼托集装箱】状态栏重新变成绿色就好了!

  接着我们用IDEA准备一个HelloWorld级别的Web后端应用(确保应用运行正常),并用Maven打包一下,然在该应用工程根目录下创建好一个Dockerfile文件:

  以下是完整的Dockerfile文件内容:

#指明制作当前镜像将基于的基础镜像
FROM master1:80/library/alpinejdk:1.8.0_201
#指定所制作镜像的维护者和联系方式
MAINTAINER xurm "707669522@qq.com"
#定义镜像构建过程中的临时变量(build命令完成后该变量会删除,所以不能直接用于镜像构建后执行的命令里,比如容器启动和运行阶段的命令)
#可在构建镜像时用-build-arg传入覆盖(例 docker build --build-arg app_name_arg="myapp" -t master1:80/library/helloworld:0.1)
ARG app_name_arg="apps"
ARG java_opts_arg="-server -Xms512m -Xmx512m"
#定义环境变量(变量会永久保存在镜像里,还会从FROM的基础镜像继承其他环境变量)
ENV APP_NAME=$app_name_arg
ENV JAVA_OPTS=$java_opts_arg
#指定启动当前镜像的容器时分配给容器的存储卷(一般用于存储容器启动后工作过程中产生的需要持久保存的数据,不随容器退出而丢失,比如日志)
VOLUME /data
#指定容器运行时的默认工作目录(没有会自动创建),不指定则会使用FROM基础镜像指定的默认工作目录
WORKDIR /data/$APP_NAME
#设置时区(和普通操作系统一样需要对齐服务器时区,跑在上面的应用拿到的时间才不会乱)
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
#从镜像构建上下文目录里添加需要的文件到容器镜像的指定目录,添加分ADD和COPY两种,ADD会复制并解压,
#(这里添加的文件将影响镜像的大小,多文件COPY目的目录要以/结尾)第一个是jar包的原始名,第二个是重命令(这对自动化部署脚本的编写有用)
ADD target/*.jar /opt/$APP_NAME/app.jar
#容器将暴露的端口
EXPOSE 8080
#指定容器启动时需要执行的命令
ENTRYPOINT java $JAVA_OPTS -Dfile.encoding=UTF-8 -jar /opt/$APP_NAME/app.jar

  确保Docker Desktop运行正常的情况下(主界面左下角的【鲸鱼托集装箱】状态栏成绿色),启动Windows的WSL子系统,例如我的是Oracle Linux 7.9(就像一个普通的Windows应用一样在启动菜单里),启动后如下图所示:

  在WSL子系统里,你可以像在对应版本的Linux上一样执行命令!这里重点讲一下WSL子系统的文件系统和Windows文件系统目录打通的地方:那就是WSL子系统将宿主Windows系统的全部盘符,以小写字符的形式挂到了 /mnt 目录下(这样我们就可以直接在WSL和Windows系统的目录之间相互切换了):

  因此,我们可以在WSL上利用Docker直接使用工程目录下的Dockerfile文件和Maven Package打出来的jar包进行镜像构建,运行和维护等操作,就像在Linux上一样:

  主要用到的命令如下:

#构建镜像(对应Dockerfile里传了一个参数app_name_arg,最后的点 . 不要漏了!)
docker build --build-arg app_name_arg="myhelloworld" -t master1:80/library/helloworld:0.0.1 .

#使用新构建的镜像以守护进程模式(-d)启动容器,(-p)绑定宿主机80端口,映射容器内8080端口
docker run -d -p 80:8080 master1:80/library/helloworld:0.0.1

  此时我们转到Docker Desktop上也能看到镜像和容器,并且容器处于运行状态,还提供了容器访问入口和其他控制操作入口:

  我们直接点访问入口:

  以上就是全部内容!

  最后提一点,其实IDEA很早就直接集成了Docker的相关操作,只是少了直接在Windows本地运行Linux环境来检验镜像包的能力,见下截图(详细用法就自己去找资料了):

 将镜像推送到私有Harbor镜像仓库:

[xurm@xurm-pad HelloWorld]$ su
Password:
[root@xurm-pad HelloWorld]# docker push master1:80/library/helloworld:0.0.1
The push refers to repository [master1:80/library/helloworld]
0336ae1698a1: Pushed
c72b359649e0: Pushed
9e1c5a4bc95e: Pushed
79a8b288cffd: Mounted from library/alpinejdk
00fd0a69160a: Mounted from library/alpinejdk
bff1a95875ae: Mounted from library/alpinejdk
de7ed4c1da1b: Mounted from library/alpinejdk
6c3d528d239f: Mounted from library/alpinejdk
5c3cd3b72db8: Mounted from library/alpinejdk
ac9d1cbe524a: Mounted from library/alpinejdk
9fb3aa2f8b80: Layer already exists
0.0.1: digest: sha256:f9b145fe27dd5c263e438c4aecd00ff6e62179ff4745783bd81eb3be0b075b7b size: 2623
[root@xurm-pad HelloWorld]#

 

posted @ 2023-02-23 13:02  岁月已走远  阅读(705)  评论(0编辑  收藏  举报