使用docker,docker-compose,jenkins,git自動部署屬于自己的https項目(ssm和vue項目的部署方法)

前言

  • 初入docker門的新人膀捷,容器化概念越來越流行懊亡,希望這篇小白文能幫助到想使用docker做部署的大家效诅。其中有什么遺漏梧乘,錯誤歡迎大家指出!
  • 這篇文章適用于簡單的部署單機應用,想部署集群化的進階操作還需要加入k8s稼虎,對這部實踐完成后再發(fā)一份集群化的部署文章衅檀。

服務器基本信息

  • 操作系統(tǒng):Centos 7.4

部署概要圖

部署概要圖.png

環(huán)境搭建

docker

  • 安裝docker

    • 安裝所需依賴

      $ sudo yum install -y yum-utils \
        device-mapper-persistent-data \
        lvm2
      
    • 更新穩(wěn)定倉庫

      $ sudo yum-config-manager \
          --add-repo \
          https://download.docker.com/linux/centos/docker-ce.repo
      
    • 安裝最新版本的docker

      $ sudo yum install docker-ce docker-ce-cli containerd.io
      
    • 啟動docker

      $ sudo systemctl start docker
      
    • 設(shè)置開機啟動

      $ sudo systemctl enable docker
      

docker-compose

  • 安裝docker-compse

    • 下載安裝包

      sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
      
    • 賦予可執(zhí)行文件權(quán)限

      $ sudo chmod +x /usr/local/bin/docker-compose
      

docker鏡像準備

  • 所需鏡像

    • gogs
    • jenkins
    • letsencrypt-nginx-proxy-companion
    • nginx-proxy
    • open-jdk1.8
    • mysql:5.7
    • redis
  • 鏡像拉取

    $ docker pull gogs/gogs
    
    $ docker pull jenkins
    
    $ docker pull jrcs/letsencrypt-nginx-proxy-companion
    
    $ docker pull jwilder/nginx-proxy
    
    $ docker pull openjdk:8-jdk-alpine
    
    $ docker pull mysql:5.7
    
    $ docker pull redis
    
  • 通過docker-compse啟動鏡像

    • 分別創(chuàng)建3個文件夾comm,project,nginx-proxy里面都放docker-compose.yml文件

      mkdir /web/docker/comm && mkdir /web/docker/project && mkdir /web/docker/nginx-proxy
      
      • 配置comm下的docker-compose.yml文件

        version: "3"
        services:
         redis: #service應用名稱
          image: docker.io/redis #鏡像地址
          container_name: redis #容器名稱
          restart: always #自動重啟
          command: redis-server --requirepass redis_pwd #設(shè)置redis連接密碼
          ports: #映射6379端口到宿主機的6379端口
           - 6379:6379
          volumes: #掛載數(shù)據(jù)到宿主機中做數(shù)據(jù)持久化
           - /web/data/redis:/data
           - /etc/localtime:/etc/localtime
         db:
          image: docker.io/mysql:5.7
          container_name: mysql
          restart: always
          ports: #映射3306端口到宿主機的3306端口
           - 3306:3306
          environment: #設(shè)置mysql連接密碼
           MYSQL_ROOT_PASSWORD: mysql_pwd 
          volumes: #掛載數(shù)據(jù)到宿主機中做數(shù)據(jù)持久化
           - /etc/localtime:/etc/localtime
           - /web/data/mysql:/var/lib/mysql
         git-gogs:
          image: gogs/gogs
          container_name: git-gogs
          restart: always
          environment: #(VIRTUAL_HOST與LETSENCRYPT_HOST填寫的內(nèi)容一致)
           - VIRTUAL_PORT=3000 #轉(zhuǎn)發(fā)端口
           - VIRTUAL_HOST=git.xx.xx #域名轉(zhuǎn)發(fā)(填上自己的域名)
           - LETSENCRYPT_HOST=git.xx.xx #ssl證書申請域名(填上自己的域名)
           - LETSENCRYPT_EMAIL=xx@xx.xx #ssl證書到期通知郵箱(填上自己的郵箱)
          volumes: #掛載數(shù)據(jù)到宿主機中做數(shù)據(jù)持久化
           - /etc/localtime:/etc/localtime
           - /web/data/gogs:/data/git/gogs-repositories
          expose: #對宿內(nèi)部docker網(wǎng)絡(luò)開放3000端口
           - 3000
        # ports: #映射3000端口到宿主機的3000端口
        #  - 3000:3000
          links: #進行容器連接,連接上面配置好的db服務別名為mysql 
           - db:mysql
         jenkins:
          image: jenkins
          container_name: jenkins
          restart: always
        # ports: #映射8080端口到宿主機的8080端口
        #  - 8080:8080
          environment:
           - VIRTUAL_PORT=8080
           - VIRTUAL_HOST=jenkins.xx.xx
           - LETSENCRYPT_HOST=jenkins.xx.xx
           - LETSENCRYPT_EMAIL=jenkins.xx.xx
          volumes: #掛載數(shù)據(jù)到宿主機中做數(shù)據(jù)持久化
           - /etc/localtime:/etc/localtime
           - /web/data/jenkins:/var/jenkins_home
        networks: # 設(shè)置內(nèi)部網(wǎng)絡(luò)nginx-proxy
          default:
            external:
              name: nginx-proxy
        
        
      • 配置nginx-proxy下的docker-compose.yml文件

        version: "3"
        services:
         nginx-proxy:
          image: jwilder/nginx-proxy
          container_name: nginx-proxy
          ports:
           - 80:80
           - 443:443
          restart: always
          volumes:
           - html:/usr/share/nginx/html #docker內(nèi)部數(shù)據(jù)卷掛載html
           - dhparam:/etc/nginx/dhparam #docker內(nèi)部數(shù)據(jù)卷掛載dhparam
           - vhost:/etc/nginx/vhost.d #docker內(nèi)部數(shù)據(jù)卷掛載vhost
           - certs:/etc/nginx/certs:ro #docker內(nèi)部數(shù)據(jù)卷掛載certs
           - /var/run/docker.sock:/tmp/docker.sock:ro #掛載宿主機docker.sock用于監(jiān)聽容器啟動情況
          labels: # 設(shè)置一個標簽
           - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
         letsencrypt-nginx-proxy-companion:
          restart: always
          image: jrcs/letsencrypt-nginx-proxy-companion
          container_name: letsencrypt-nginx-proxy-companion
          volumes:
           - /web/config/nginx:/etc/nginx/nginx.conf 
           - certs:/etc/nginx/certs:rw
           - vhost:/etc/nginx/vhost.d
           - html:/usr/share/nginx/html
           - /var/run/docker.sock:/var/run/docker.sock:ro
        volumes: #設(shè)置數(shù)據(jù)卷
          certs:
          html:
          vhost:
          dhparam:
        networks: #設(shè)置內(nèi)部網(wǎng)絡(luò)nginx-proxy
          default:
            external:
              name: nginx-proxy
        
      • project中的docker-compse.yml文件稍后結(jié)合項目再配置

    • 啟動redis,mysql,jenkins,gogs,letsencrypt-nginx-proxy-companion,nginx-proxy容器

      • 掛載目錄授權(quán)

        $ sudo chown -R 1000 /home/yk/data
        
      • 啟動容器

        • 啟動comm下配置的容器

          $ cd /web/docker/comm && docker-compose up -d
          
        • 啟動nginx-proxy下的容器

          $ cd /web/docker/nginx-proxy && docker-compose up -d
          

項目Dockerfile配置

  • 后端項目配置

    • 在項目根目錄新建一個文件docker/dev/Dockerfile內(nèi)容如下

      FROM openjdk:8-jdk-alpine
      COPY app.jar /app/app.jar
      ENV JAVA_OPTS=""
      EXPOSE 8080
      ENV TIME_ZONE=Asia/Shanghai
      ENTRYPOINT exec java $JAVA_OPTS -jar /app/app.jar --spring.profiles.active=dev #springboot的環(huán)境配置
      
  • 前端項目配置

    • 在項目根目錄新建一個文件docker/dev/Dockerfile內(nèi)容如下

      FROM nginx
      COPY ./dist /usr/share/nginx/html
      
  • 配置服務器中的/web/docker/proj中的docker-compose.yml文件

    version: "3"
    services:
     web-dev:
      image: registry.cn-shenzhen.aliyuncs.com/xx/xx #這里填寫你的docker云倉庫項目地址
      container_name: web-dev
      environment:
       - VIRTUAL_PORT=8080 
       - VIRTUAL_HOST=web-dev.xx.xx 
       - LETSENCRYPT_HOST=web-dev.xx.xx 
       - LETSENCRYPT_EMAIL=xx@xx.xx
      volumes:
       - /etc/localtime:/etc/localtime
      expose:
       - 8080
     web-cms-dev:
      restart: always
      image: registry.cn-shenzhen.aliyuncs.com/xx/xx #這里填寫你的docker云倉庫項目地址
      container_name: web-cms-dev
      environment:
       - VIRTUAL_PORT=8080 
       - VIRTUAL_HOST=web-cms-dev.xx.xx 
       - LETSENCRYPT_HOST=web-cms-dev.xx.xx 
       - LETSENCRYPT_EMAIL=xx@xx.xx
      volumes:
       - /etc/localtime:/etc/localtime
     javaee-api-dev:
      image: registry.cn-shenzhen.aliyuncs.com/xx/xx #這里填寫你的docker云倉庫項目地址
      container_name: javaee-api-dev
      environment:
       - MYSQL_USER=mysql_user
       - MYSQL_PWD=mysql_pwd
       - REDIS_PWD=redis_pwd
       - VIRTUAL_PORT=8080 
       - VIRTUAL_HOST=javaee-api-dev.xx.xx 
       - LETSENCRYPT_HOST=javaee-api-dev.xx.xx 
       - LETSENCRYPT_EMAIL=xx@xx.xx
      volumes:
       - /etc/localtime:/etc/localtime
      external_links:
       - redis:redis
       - db:mysql
    networks:
      default:
        external:
          name: nginx-proxy
    
    

gogs配置

  • gogs簡介

    • Gogs 的目標是打造一個最簡單、最快速和最輕松的方式搭建自助 Git 服務霎俩。使用 Go 語言開發(fā)使得 Gogs 能夠通過獨立的二進制分發(fā)哀军,并且支持 Go 語言支持的 所有平臺沉眶,包括 Linux、Mac OS X杉适、Windows 以及 ARM 平臺谎倔。
  • 訪問gogs:

    • url地址為docker-compose.yml中配置好的LETSENCRYPT_HOST域名地址git.xx.xx

    • 如果想要通過ip地址訪問則需要映射出3000端口到宿主機中,

      ports: #映射3000端口到宿主機的3000端口
        - 3000:3000
      
  • 首次啟動gogs

    • 數(shù)據(jù)庫主機:通過link進行容器連接可以填mysql:3306,如數(shù)據(jù)庫不通過link方式啟動填對應ip地址即可
    • 應用url和域名:填寫docker-compose 中配置的ssl證書申請地址
2019-06-20_153440.png
  • 配置webhook

    • 推送地址
      • 填上jenkin訪問地址
      • 注意project_token需要配合jenkin地址填寫
    • 密鑰文本
      • 配合jenkin填寫
    ae131d098561550b0b56e0251e8091d.png

docker云倉庫配置

b4aa4d8a3fa66973d22ec8e69be872f.png
  • 創(chuàng)建docker命名空間
c4e1e1a40293843dc01849fe64d551c.png

jenkins配置

  • jenkins介紹

    • jenkins是一款開源 CI&CD 軟件猿推,用于自動化各種任務片习,包括構(gòu)建、測試和部署軟件蹬叭。

      jenkins 支持各種運行方式藕咏,可通過系統(tǒng)包、Docker 或者通過一個獨立的 Java 程序

  • 訪問jenkins:

    • url地址為docker-compose.yml中配置好的LETSENCRYPT_HOST域名地址jenkins.xx.xx

    • 如果想要通過ip地址訪問則需要映射出8080端口到宿主機中,

      ports: #映射8080端口到宿主機的8080端口
        - 8080:8080
      
  • 首次啟動jenkins

    • 先進入容器

      $ docker exec -it jenkins /bin/bash
      
    • 查看文本內(nèi)容

      $ cat /var/jenkins_home/secrets/initialAdminPassword
      
    • 將文本內(nèi)容張貼到Administrator password 中點擊Continue

    • 退出容器

      $ exit
      
![bb4edc68989b13b6c3e4dd8c73a1b97.png](https://upload-images.jianshu.io/upload_images/13185062-d309b5585141b09d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  • 安裝插件

    • Customize Jenkins 頁面內(nèi)秽五, 您可以安裝任何數(shù)量的有用插件作為您初始步驟的一部分孽查。

      兩個選項可以設(shè)置:

      • 安裝建議的插件 - 安裝推薦的一組插件,這些插件基于最常見的用例.
      • 選擇要安裝的插件 - 選擇安裝的插件集坦喘。當你第一次訪問插件選擇頁面時盲再,默認選擇建議的插件。
    • 進入插件安裝頁面瓣铣,搜索點擊安裝即可

      • Manage Jenkins->pluginManager
    • 需要用到的jenkins插件有

      • Docker plugin- 用于進行docker構(gòu)建
      • Git -git管理
      • Gogs plugin -配合gogs使用
      • Maven Integration -maven構(gòu)建管理工具,構(gòu)建后端項目
      • NodeJS -node環(huán)境工具,構(gòu)建前端項目
      • Publish Over SSH-進行ssh連接
      • Generic Webhook Trigger Plugin-設(shè)置webhook觸發(fā)條件
  • 配置ssh

    • 進入配置頁面

      Manage Jenkins->configure system

    • 配置ssh

      bb4edc68989b13b6c3e4dd8c73a1b97.png
  • 配置云docker

    • 使用安全的TLS方式部署

      $ openssl genrsa -aes256 -out ca-key.pem 4096       # 生成CA私鑰
      #生成CA公鑰答朋,也就是證書(注意:Common Name (e.g. server FQDN or YOUR name) []:$HOST)
      $ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
      $ openssl genrsa -out server-key.pem 4096       # 生成服務器私鑰
      $ openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr  # 用私鑰生成證書請求文件
      $ echo subjectAltName = IP:$HOST,IP:127.0.0.1 > extfile.cnf
      # 將Docker守護程序密鑰的擴展使用屬性設(shè)置為僅用于服務器身份驗證:
      $ echo extendedKeyUsage = serverAuth >> extfile.cnf
      $ openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
      
  • 配置客戶端證書

    $ openssl genrsa -out key.pem 4096      # 客戶端私鑰
    $ openssl req -subj '/CN=client' -new -key key.pem -out client.csr      # 客戶端證書請求文件
    # 要使密鑰適配客戶端身份驗證,請創(chuàng)建擴展配置文件:
    $ echo extendedKeyUsage = clientAuth >> extfile.cnf
    $ openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
    # 刪除證書請求文件:
    $ rm -v client.csr server.csr
    # 默認的私鑰權(quán)限太開放了棠笑,為了更加的安全绿映,我們需要更改證書的權(quán)限,刪除寫入權(quán)限腐晾,限制閱讀權(quán)限(只有你能查看):
    $ chmod -v 0400 ca-key.pem key.pem server-key.pem
    # 證書文件刪除其寫入權(quán)限:
    $ chmod -v 0444 ca.pem server-cert.pem cert.pem
    
  • 證書部署

    # centos
    $ sudo vi /etc/sysconfig/docker
        如:OPTIONS='--selinux-enabled --log-driver=journald --tlsverify=true'
        DOCKER_CERT_PATH=/etc/docker
    $ sudo service docker restart
    
    
    # daemon.json
    $ sudo vi /etc/docker/daemon.json
    {
      "tlsverify": true,
      "tlscert": "/var/docker/server-cert.pem",
      "tlskey": "/var/docker/server-key.pem",
      "tlscacert": "/var/docker/ca.pem",
      "hosts": [
        "tcp://0.0.0.0:2376",
        "unix:///var/run/docker.sock"
      ]
    }
    # 啟動守護進程
    $ dockerd
    
  • 在系統(tǒng)管理->系統(tǒng)設(shè)置->cloud-> Docker Host UR填寫 tcp://主機ip:2376

  • 配置 Server credentials

  • 選擇類型Docker Host Certificate Authentication,將生成的證書如下圖填寫

jenkins_docker.png
  • 配置node.js環(huán)境

    • 進入配置頁面

      • Manage Jenkins->Global Tool Configuration
    • 選擇需要的node.js版本

    1ecc0bbd6ac14decf33b39f1ba3bf51.png
  • 配置git憑證

    8a35edf717261555adc68780f899b70.png
  • 配置docker倉庫登錄憑證

    • 訪問憑證可以從這里查看
    6e9042ddae0e9f725416f30c0c6b59a.png
  • 憑證配置
1388932cc6a475e0235d21449713efa.png
  • 配置項目構(gòu)建過程

    • 后端java項目配置

      • New Item->構(gòu)建一個maven項目
    d6a28f8531cffb1a61c580d11d203df.png
  • 前端vue項目配置

    • 前端vue項目和后端大同小異叉弦,有2點需要改動

    • New Item->Freestyle project

    • 選擇配置好的node.js環(huán)境


      1155cdb992a6af71b01173145a2f461.png
  • 執(zhí)行的構(gòu)建命令和后端的maven不一樣使用npm進行構(gòu)建

f2bbbd3184cbce71f7f77de6f7562ac.png
  • 其他配置按需修改即可

訪問項目

web-dev.xx.xx

web-cms-dev.xx.xx

javaee-api-dev.xx.xx

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市藻糖,隨后出現(xiàn)的幾起案子淹冰,更是在濱河造成了極大的恐慌,老刑警劉巖巨柒,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件樱拴,死亡現(xiàn)場離奇詭異,居然都是意外死亡洋满,警方通過查閱死者的電腦和手機晶乔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牺勾,“玉大人正罢,你說我怎么就攤上這事∽っ瘢” “怎么了翻具?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵履怯,是天一觀的道長。 經(jīng)常有香客問我裆泳,道長叹洲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任工禾,我火速辦了婚禮运提,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闻葵。我一直安慰自己糙捺,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布笙隙。 她就那樣靜靜地躺著,像睡著了一般坎缭。 火紅的嫁衣襯著肌膚如雪竟痰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天掏呼,我揣著相機與錄音坏快,去河邊找鬼。 笑死憎夷,一個胖子當著我的面吹牛莽鸿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拾给,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼祥得,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蒋得?” 一聲冷哼從身側(cè)響起级及,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎额衙,沒想到半個月后饮焦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡窍侧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年县踢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伟件。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡硼啤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斧账,到底是詐尸還是另有隱情丙曙,我是刑警寧澤爸业,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站亏镰,受9級特大地震影響扯旷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜索抓,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一钧忽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逼肯,春花似錦耸黑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至三椿,卻和暖如春缺菌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搜锰。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工伴郁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蛋叼。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓焊傅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親狈涮。 傳聞我的和親對象是個殘疾皇子狐胎,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容