IntelliJ IDEA 使用 Docker 遠程部署

前言


通常,部署流程主要爲下面幾個步驟:

  • 提交代碼 ( SVN 或者 Git ) 。

  • 構建服務器 上拉取代碼進行構建打包。

  • 將軟件包發送到 部署服務器,或者打包後上傳到倉庫,由 部署服務器 進行下載。

  • 部署服務器 停止現有服務,使用新的軟件包進行啓動。

上面的步驟很是繁瑣,而且全程需要人工盯着以進行後續步驟,如果需要經常部署的話無疑是很浪費時間的。有人會說可以用 Jenkins 這樣的 CI 工具啊,這也是一種方法,但不是本文的目標。

項目 Docker 化改造


既然要用 Docker 進行部署,那就要對現有項目做一些簡單的改造,如果項目結構之前已經比較規範了,那麼改造起來也會比較簡單。

先在項目 根目錄 ( 也可以放在一個 docker 文件夾下統一維護 ) 下添加幾個文件:

文件 說明
Dockerfile 鏡像配置文件,用於配置程序運行時依賴的環境,比如 JavaTomcat
.dockerignore 使用 Docker 構建鏡像的時候會將 上下文目錄 中的文件複製到 Docker Engine 中,如果每次都要複製一遍 源碼構建中間產物 就會很浪費時間,.dockerignore 的作用就是用於忽略指定的文件,加快鏡像構建速度。
docker-compose.yml 用於多個服務的編排。項目如果依賴了 數據庫緩存消息隊列 等,可以在這裏配置依賴關係,還可以進行動態 擴縮容
.env docker-compose.yml 中可以使用 環境變量 進行參數化配置,一些默認的 環境變量 可以保存在這個文件中,實際構建時可以配置 環境變量 對其進行覆蓋。

之後將項目中一些 寫死配置 改爲通過 環境變量 讀取,這樣就可以通過 docker-compose.yml 導入 環境變量 ,在不同環境下 ( 開發測試線上 等 ) 不用改文件就可以部署了。具體配置參考下面的測試項目。

準備工作


  • 安裝 IntelliJ IDEA ( 目前最新版本是 2019.1 ) 。

  • 安裝 Docker Desktop for Windows

    不推薦安裝 Docker Desktop for Windows ,本文只是用於測試。
    最好在其他的 Linux 主機上運行 Docker

  • 下載最新版的 Docker Compose - docker-compose-Windows-x86_64.exe

    Docker Desktop for Windows 已經集成了 Docker Compose ,一般不需要單獨下載。

  • 下載 測試項目

  • 先閱讀完本文。

使用方法


  • 打開測試項目 JetBrains-Docker-Example/Springboot-Example

  • 設置 Project JDK

  • 導入 pom.xml ( 右鍵 Add as Maven Project 或者直接拖拽到 Maven 工具欄 中 ) 。

  • 添加 Docker Daemon

    File -> Settings -> Build, Execution, Deployment -> Docker -> Add -> 輸入 Docker Daemon 的 URL

    Docker Daemon 的配置參考 這裏

    添加 Docker Daemon

    注意:如果要啓用 TLS 安全連接,協議名需要填寫 https 而不是命令行中使用的 tcp

  • Add Run Configuration -> New -> Docker -> Docker-compose

    添加 Run Configuration

  • 修改配置。

    配置 Run Configuration

    當然,也可以直接打開 docker-compose.yml ,點擊左側顯示的 三角形按鈕 自動生成運行配置。

    通過 docker-compose.yml 運行

  • 運行配置,可以看到容器已經啓動了,訪問看下效果:127.0.0.1:3000

    docker 部署

    通過 Docker 插件 還可以可視化查看 容器日誌環境變量端口映射數據卷 等配置信息,並且可以動態 修改配置進入容器 ,比起 敲命令 方便的不要太多。

    docker 插件

上面的步驟就是 Docker 插件 的常規用法,已經實現了 一鍵部署 效果,只是需要自己配置 Run Configuration

下面看下另一種使用方式:

  • 打開另一個測試項目 JetBrains-Docker-Example/Node-Example

  • 先使用命令 npm install 安裝依賴。

    最好先在命令行執行再打開 IDEA ,不然可能把 IDEA 卡死。

  • 打開 package.json ,部署命令已經在 Docker 寫好了,點擊命令左側顯示的 三角形按鈕 直接執行就行了。

    通過 package.json 運行

    如果需要部署到其他 遠程 Docker Daemon ,可以修改 環境變量 DOCKER_HOST

  • 訪問看下效果:127.0.0.1:8000

這種方式也是 一鍵式 的,也比較適合在命令行中執行。

Docker Desktop for Windows 的坑


  • 依賴於 Hyper-V 虛擬機,但是 Hyper-V 的兼容性不太好,容易出一些莫名其妙的問題,所以 不推薦安裝

  • 使用它 ( 2.0.0.3 (31259) ) 自帶的 docker-compose ( 1.23.2 ) 在執行某些鏡像構建操作的時候可能會出現下面的錯誤:

    Building api
    [18576] Failed to execute script docker-compose
    Traceback (most recent call last):
      File "docker-compose", line 6, in <module>
      File "compose\cli\main.py", line 71, in main
      File "compose\cli\main.py", line 127, in perform_command
      File "compose\cli\main.py", line 1080, in up
      File "compose\cli\main.py", line 1076, in up
      File "compose\project.py", line 475, in up
      File "compose\service.py", line 342, in ensure_image_exists
      File "compose\service.py", line 1082, in build
      File "site-packages\docker\api\build.py", line 150, in build
    UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 10: illegal multibyte sequence
    

    查看 源碼 發現是因爲 .dockerignore 文件中包含了中文導致亂碼, 1.19.0 及之前的版本沒有這個問題。( 同樣的版本,Linux 下沒有這個問題 )

  • Windows 下使用舊版 docker-compose ( 比如 1.19.0 ) 部署到 遠程 Linux Docker Daemon 時,如果使用了 數據卷 會出現下面的錯誤:

    Creating api ... 
    Creating api ... error
    ERROR: for api  Cannot create container for service api: create \etc\localtime: "\\etc\\localtime" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path
    
    ERROR: for api  Cannot create container for service api: create \etc\localtime: "\\etc\\localtime" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path
    Encountered errors while bringing up the project.
    

    使用 docker-compose config 命令可以看到 數據卷 源路徑被改成了 Windows 下的 反斜槓 類型的路徑格式 \etc\localtime

    services:
      api:
        build:
          context: D:\github\test\JetBrains-Docker-Example\Springboot-Example
        command: java -jar -Djava.security.egd=file:/dev/./urandom -server -XX:+DisableExplicitGC
          -Xms256m -Xmx256m -Dspring.profiles.active=docker /app.jar
        container_name: api
        hostname: api
        ports:
        - 3000:8080/tcp
        privileged: false
        restart: always
        volumes:
        - \etc\localtime:/etc/localtime:rw
    version: '3.0'
    

    通過閱讀 源碼 找到了方法:使用 docker-compose內置環境變量 - COMPOSE_CONVERT_WINDOWS_PATHS=1

其他方案


上面提到了 Docker Desktop for Windows 的一些問題,所以我不推薦去安裝它,單獨下載 docker-compose 就好了。考慮到 WindowsLinux 之間交互可能會存在的問題,我還有一種方案:

  • 安裝 WSL

  • WSL 中安裝 Docker,但是隻具備 客戶端 功能而無法運行 Docker Daemon

    2019-07-12 追加: 目前 WSL 已經能夠運行 Docker Daemon 了,參考我另一篇 文章

  • WSL 中安裝 docker-compose

  • Windows 下編寫腳本 docker-compose.bat

    @echo off
    
    echo current dir: %cd%
    
    :: 使用延遲變量
    setlocal enabledelayedexpansion
    
    :: 遍歷所有參數,如果是 compose 文件則轉換路徑格式
    :: 使用 wslpath 將 Windows 路徑轉爲 wsl 中的路徑
    for %%i in ( %* ) do (
        :: 當前參數
        set arg=%%i
        :: 使用下面這種方式中文路徑不會亂碼
        if !last_arg!==-f if !arg! neq -f  set "arg=`wslpath '!arg!'`"
        :: 追加到新的參數列表中
        set "args=!args! !arg!"
        :: 作爲上一個參數保存
        set last_arg=%%i
    )
    
    :: IDEA 部署到指定 Docker Daemon 的時候會設置下面的環境變量
    
    :: 設置環境變量 DOCKER_HOST 來指定 Docker Daemon 的 URL
    if defined DOCKER_HOST set "envs=export DOCKER_HOST=%DOCKER_HOST%;"
    
    :: 設置環境變量 DOCKER_TLS_VERIFY 和 DOCKER_CERT_PATH 指定 TLS 配置
    :: DOCKER_CERT_PATH 爲空時,wslpath 命令的結果是 '.',要做處理
    if defined DOCKER_CERT_PATH set "envs=%envs%export DOCKER_CERT_PATH=`wslpath '%DOCKER_CERT_PATH%'`;"
    set "envs=%envs%export DOCKER_TLS_VERIFY=%DOCKER_TLS_VERIFY%;"
    
    :: 通過 WSL 調用 docker-compose
    :: 如果 bash -c 命令參數中包含$則要轉義,否則在解析 bash -c 命令的時候就會對 shell 變量進行替換
    :: 注意:.env 文件需要在當前命令的執行目錄下
    bash -c "%envs%env|grep DOCKER;set -x;docker-compose %args%;"
    

    IDEA 通過設置 環境變量 : DOCKER_HOSTDOCKER_TLS_VERIFYDOCKER_CERT_PATH 起到連接 遠程 Docker Daemon 的目的。

  • 修改 Docker Compose可執行程序 爲上面的腳本。

    修改 docker 可執行程序

結語


上面其實只是介紹一個很簡單但又實用的功能,更多的是分享我在使用過程中遇到的一些問題,尤其是在寫這篇文章的時候才發現自己之前有些認知是錯誤的,也是一種收穫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章