IntelliJ IDEA 使用 Docker 遠程部署

前言


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

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

  • 構(gòu)建服務(wù)器 上拉取代碼進行構(gòu)建打包耻陕。

  • 將軟件包發(fā)送到 部署服務(wù)器括眠,或者打包后上傳到倉庫,由 部署服務(wù)器 進行下載概而。

  • 部署服務(wù)器 停止現(xiàn)有服務(wù)呼巷,使用新的軟件包進行啟動。

上面的步驟很是繁瑣赎瑰,而且全程需要人工盯著以進行后續(xù)步驟王悍,如果需要經(jīng)常部署的話無疑是很浪費時間的。有人會說可以用 Jenkins 這樣的 CI 工具啊餐曼,這也是一種方法压储,但不是本文的目標。

項目 Docker 化改造


既然要用 Docker 進行部署源譬,那就要對現(xiàn)有項目做一些簡單的改造集惋,如果項目結(jié)構(gòu)之前已經(jīng)比較規(guī)范了,那么改造起來也會比較簡單踩娘。

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

文件 說明
Dockerfile 鏡像配置文件刮刑,用于配置程序運行時依賴的環(huán)境,比如 Java 霸饲、 Tomcat
.dockerignore 使用 Docker 構(gòu)建鏡像的時候會將 上下文目錄 中的文件復(fù)制到 Docker Engine 中为朋,如果每次都要復(fù)制一遍 源碼構(gòu)建中間產(chǎn)物 就會很浪費時間,.dockerignore 的作用就是用于忽略指定的文件厚脉,加快鏡像構(gòu)建速度习寸。
docker-compose.yml 用于多個服務(wù)的編排。項目如果依賴了 數(shù)據(jù)庫 傻工、緩存 霞溪、消息隊列 等,可以在這里配置依賴關(guān)系中捆,還可以進行動態(tài) 擴縮容 鸯匹。
.env docker-compose.yml 中可以使用 環(huán)境變量 進行參數(shù)化配置,一些默認的 環(huán)境變量 可以保存在這個文件中泄伪,實際構(gòu)建時可以配置 環(huán)境變量 對其進行覆蓋殴蓬。

之后將項目中一些 寫死配置 改為通過 環(huán)境變量 讀取,這樣就可以通過 docker-compose.yml 導(dǎo)入 環(huán)境變量 蟋滴,在不同環(huán)境下 ( 開發(fā) 染厅、 測試線上 等 ) 不用改文件就可以部署了津函。具體配置參考下面的測試項目肖粮。

準備工作


  • 安裝 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 已經(jīng)集成了 Docker Compose 蛾号,一般不需要單獨下載。

  • 下載 測試項目 涯雅。

  • 先閱讀完本文须教。

使用方法


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

  • 設(shè)置 Project JDK 斩芭。

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

  • 添加 Docker Daemon 乐疆。

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

    Docker Daemon 的配置參考 這里 划乖。

    添加 Docker Daemon

    注意:如果要啟用 TLS 安全連接,協(xié)議名需要填寫 https 而不是命令行中使用的 tcp 挤土。

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

    添加 Run Configuration
  • 修改配置琴庵。

    配置 Run Configuration

    當(dāng)然,也可以直接打開 docker-compose.yml 仰美,點擊左側(cè)顯示的 三角形按鈕 自動生成運行配置迷殿。

    通過 docker-compose.yml 運行
  • 運行配置,可以看到容器已經(jīng)啟動了咖杂,訪問看下效果:127.0.0.1:3000 庆寺。

    docker 部署

    通過 Docker 插件 還可以可視化查看 容器日志環(huán)境變量 诉字、 端口映射 懦尝、 數(shù)據(jù)卷 等配置信息,并且可以動態(tài) 修改配置進入容器 壤圃,比起 敲命令 方便的不要太多陵霉。

    docker 插件

上面的步驟就是 Docker 插件 的常規(guī)用法,已經(jīng)實現(xiàn)了 一鍵部署 效果伍绳,只是需要自己配置 Run Configuration 踊挠。

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

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

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

    最好先在命令行執(zhí)行再打開 IDEA 效床,不然可能把 IDEA 卡死。

  • 打開 package.json 漠趁,部署命令已經(jīng)在 Docker 寫好了扁凛,點擊命令左側(cè)顯示的 三角形按鈕 直接執(zhí)行就行了。

    通過 package.json 運行

    如果需要部署到其他 遠程 Docker Daemon 闯传,可以修改 環(huán)境變量 DOCKER_HOST 谨朝。

  • 訪問看下效果:127.0.0.1:8000 卤妒。

這種方式也是 一鍵式 的,也比較適合在命令行中執(zhí)行字币。

Docker Desktop for Windows 的坑


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

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

    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
    

    查看 源碼 發(fā)現(xiàn)是因為 .dockerignore 文件中包含了中文導(dǎo)致亂碼, 1.19.0 及之前的版本沒有這個問題翩活。( 同樣的版本阱洪,Linux 下沒有這個問題 )

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

    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 命令可以看到 數(shù)據(jù)卷 源路徑被改成了 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內(nèi)置環(huán)境變量 - COMPOSE_CONVERT_WINDOWS_PATHS=1

其他方案


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

  • 安裝 WSL 隘梨。

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

    2019-07-12 追加: 目前 WSL 已經(jīng)能夠運行 Docker Daemon 了轴猎,參考我另一篇 文章 嵌莉。

  • WSL 中安裝 docker-compose

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

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

    IDEA 通過設(shè)置 環(huán)境變量 : DOCKER_HOSTDOCKER_TLS_VERIFY 扰肌、DOCKER_CERT_PATH 起到連接 遠程 Docker Daemon 的目的抛寝。

  • 修改 Docker Compose可執(zhí)行程序 為上面的腳本。

    修改 docker 可執(zhí)行程序

結(jié)語


上面其實只是介紹一個很簡單但又實用的功能曙旭,更多的是分享我在使用過程中遇到的一些問題盗舰,尤其是在寫這篇文章的時候才發(fā)現(xiàn)自己之前有些認知是錯誤的,也是一種收獲桂躏。


轉(zhuǎn)載請注明出處:http://www.reibang.com/p/410ea6e0b13a

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钻趋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子剂习,更是在濱河造成了極大的恐慌蛮位,老刑警劉巖较沪,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異失仁,居然都是意外死亡尸曼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門萄焦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來控轿,“玉大人,你說我怎么就攤上這事拂封〔缟洌” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵冒签,是天一觀的道長躲株。 經(jīng)常有香客問我,道長镣衡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任档悠,我火速辦了婚禮廊鸥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辖所。我一直安慰自己惰说,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布缘回。 她就那樣靜靜地躺著吆视,像睡著了一般。 火紅的嫁衣襯著肌膚如雪酥宴。 梳的紋絲不亂的頭發(fā)上啦吧,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音拙寡,去河邊找鬼授滓。 笑死,一個胖子當(dāng)著我的面吹牛肆糕,可吹牛的內(nèi)容都是我干的般堆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼诚啃,長吁一口氣:“原來是場噩夢啊……” “哼淮摔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起始赎,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤和橙,失蹤者是張志新(化名)和其女友劉穎仔燕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胃碾,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡涨享,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了仆百。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厕隧。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖俄周,靈堂內(nèi)的尸體忽然破棺而出吁讨,到底是詐尸還是另有隱情,我是刑警寧澤峦朗,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布建丧,位于F島的核電站,受9級特大地震影響波势,放射性物質(zhì)發(fā)生泄漏翎朱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一尺铣、第九天 我趴在偏房一處隱蔽的房頂上張望拴曲。 院中可真熱鬧,春花似錦凛忿、人聲如沸澈灼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叁熔。三九已至,卻和暖如春床牧,著一層夾襖步出監(jiān)牢的瞬間荣回,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工戈咳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驹马,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓除秀,卻偏偏與公主長得像糯累,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子册踩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354