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]#