WSL2 + Docker + IDEA 開發到釋出一步到位

HiIT青年發表於2020-10-26

摘要:本文主要介紹瞭如何用WSL2、Docker、IDEA將Java應用從開發到釋出一步到位。

上次介紹瞭如何在Windows(WSL2) Linux子系統中搭建搭建Docker環境,這次將利用上次搭建的Docker環境實現Java應用從開發到釋出一步到位。
.>>> Windows(WLS2)Linux子系統搭建Docker環境(傳送門)

1. 遷移Linux子系統(非必要)

在Windows啟用WSL2功能後,預設情況下,在Microsoft store安裝的Linux系統(Ubuntu)是在系統盤中(C盤),但是一般來說系統盤的容量是由限的,所以下載安裝Linux子系統後的第一步就是遷移Linux子系統。
(如未作特殊說明,下面的命令在power shell執行)

首先檢視已安裝的Linux子系統,我的電腦只裝了一個Ubuntu18.04,如下:

wsl -l --all -v

將Linux子系統匯出到磁碟中(D盤)

wsl --export Ubuntu-18.04 d:\WSL\Ubuntu18.04.tar

登出當前Linux子系統(Ubuntu-18.04)

wsl --unregister Ubuntu-18.04

重新匯入Linux子系統,指定匯入位置為D盤的WSL目錄,WSL版本為2

wsl --import Ubuntu-18.04 d:\WSL d:\WSL\Ubuntu18.04.tar --version 2

匯入成功之後D盤的WSL目錄下面將會出現一個ext4.vhdx檔案,這個就是Linux子系統。

最後設定預設的登入使用者名稱,這個命令好像只能在cmd命令列執行(不知道為什麼)

Ubuntu1804 config --default-user itqn

2. 為WSL2設定固定IP

Windows的WSL有個坑,那就是每一次啟動的時候IP地址都是隨機生成的。

這對開發來說就很難受,所以要想使用WSL2作為開發環境的一部分首先要解決的問題就是為WSL設定一個固定IP。

這裡可以建立一個bat指令碼,每次開機的時候執行這個指令碼即可(也可以設定開機自動設定),指令碼獲取方式在文章底部,需要注意的是,這個指令碼一定要是Windows管理員身份執行。

這樣WSL2的Linux子系統中和Windows系統就有了同一個網段的IP了,如下圖:

設定固定IP之後,訪問WSL只需要使用固定的192.168.50.110即可,不需要知道WSL隨機生成的IP是什麼。

3. IDEA安裝Docker外掛

IDEA安裝Docker外掛跟IDEA安裝其他外掛是一樣的,在Setting->Plugins中搜尋安裝即可。

為了IDEA的Docker外掛能連線到WSL的Docker,需要開啟WSL的Docker 2375埠遠端訪問,編輯/etc/default/docker
修改如下配置:

# 開啟遠端訪問 -H tcp://0.0.0.0:2375
# 開啟本地套接字訪問 -H unix:///var/run/docker.sock
DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

重啟Docker程式:

$ sudo service docker restart

在IDEA配置Docker遠端連線,Build->Docker,配置對應WSL的IP即可連線Docker,如下圖:

連線Docker之後就可以檢視和管理Docker映象和容器, 如下圖:

4. 開發Java應用

這一步跟平時開發Java應用沒有任何差別, 這裡以一個簡單的Say Hi專案為例。

專案pom.xml:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.9.RELEASE</version>
    <relativePath/>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Rest API介面:

@RestController
public class HiController {

    @RequestMapping("/sayHi")
    public String sayHi() {
        return "Hi " + System.currentTimeMillis();
    }
}

Dockerfile:

FROM java:openjdk-8-jdk-alpine
ADD target/*.jar app.jar

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone

EXPOSE 8888
ENTRYPOINT [ "java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar" ]

5. 一鍵釋出部署

Java應用開發完成後, 只需要建立Docker構建即可一鍵釋出應用, 構建配置如下:

注意: 這裡設定前置任務來用maven編譯專案(clean package)

執行構建即可自動建立容器並執行

訪問Java應用

=========================================================
WSL設定固定IP的指令碼可關注公眾號 “HiIT青年” 傳送 “WSLIP” 獲取。

HiIT青年
關注公眾號,閱讀更多文章。

相關文章