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

前言

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

服務器基本信息

  • 操作系統:Centos 7.4

部署概要圖

部署概要圖.png

環境搭建

docker

  • 安裝docker

    • 安裝所需依賴

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

      $ 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
      
    • 設置開機啟動

      $ 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
      
    • 賦予可執行文件權限

      $ 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啟動鏡像

    • 分別創建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 #設置redis連接密碼
          ports: #映射6379端口到宿主機的6379端口
           - 6379:6379
          volumes: #掛載數據到宿主機中做數據持久化
           - /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: #設置mysql連接密碼
           MYSQL_ROOT_PASSWORD: mysql_pwd 
          volumes: #掛載數據到宿主機中做數據持久化
           - /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填寫的內容一致)
           - VIRTUAL_PORT=3000 #轉發端口
           - VIRTUAL_HOST=git.xx.xx #域名轉發(填上自己的域名)
           - LETSENCRYPT_HOST=git.xx.xx #ssl證書申請域名(填上自己的域名)
           - LETSENCRYPT_EMAIL=xx@xx.xx #ssl證書到期通知郵箱(填上自己的郵箱)
          volumes: #掛載數據到宿主機中做數據持久化
           - /etc/localtime:/etc/localtime
           - /web/data/gogs:/data/git/gogs-repositories
          expose: #對宿內部docker網絡開放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: #掛載數據到宿主機中做數據持久化
           - /etc/localtime:/etc/localtime
           - /web/data/jenkins:/var/jenkins_home
        networks: # 設置內部網絡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內部數據卷掛載html
           - dhparam:/etc/nginx/dhparam #docker內部數據卷掛載dhparam
           - vhost:/etc/nginx/vhost.d #docker內部數據卷掛載vhost
           - certs:/etc/nginx/certs:ro #docker內部數據卷掛載certs
           - /var/run/docker.sock:/tmp/docker.sock:ro #掛載宿主機docker.sock用于監聽容器啟動情況
          labels: # 設置一個標簽
           - "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: #設置數據卷
          certs:
          html:
          vhost:
          dhparam:
        networks: #設置內部網絡nginx-proxy
          default:
            external:
              name: nginx-proxy
        
      • project中的docker-compse.yml文件稍后結合項目再配置

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

      • 掛載目錄授權

        $ 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內容如下

      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的環境配置
      
  • 前端項目配置

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

      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 語言開發使得 Gogs 能夠通過獨立的二進制分發,并且支持 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

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

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

docker云倉庫配置

b4aa4d8a3fa66973d22ec8e69be872f.png
  • 創建docker命名空間
c4e1e1a40293843dc01849fe64d551c.png

jenkins配置

  • jenkins介紹

    • jenkins是一款開源 CI&CD 軟件,用于自動化各種任務,包括構建、測試和部署軟件。

      jenkins 支持各種運行方式,可通過系統包、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
      
    • 查看文本內容

      $ cat /var/jenkins_home/secrets/initialAdminPassword
      
    • 將文本內容張貼到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 頁面內, 您可以安裝任何數量的有用插件作為您初始步驟的一部分。

      兩個選項可以設置:

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

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

      • Docker plugin- 用于進行docker構建
      • Git -git管理
      • Gogs plugin -配合gogs使用
      • Maven Integration -maven構建管理工具,構建后端項目
      • NodeJS -node環境工具,構建前端項目
      • Publish Over SSH-進行ssh連接
      • Generic Webhook Trigger Plugin-設置webhook觸發條件
  • 配置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守護程序密鑰的擴展使用屬性設置為僅用于服務器身份驗證:
      $ 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      # 客戶端證書請求文件
    # 要使密鑰適配客戶端身份驗證,請創建擴展配置文件:
    $ 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
    # 默認的私鑰權限太開放了,為了更加的安全,我們需要更改證書的權限,刪除寫入權限,限制閱讀權限(只有你能查看):
    $ chmod -v 0400 ca-key.pem key.pem server-key.pem
    # 證書文件刪除其寫入權限:
    $ 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
    
  • 在系統管理->系統設置->cloud-> Docker Host UR填寫 tcp://主機ip:2376

  • 配置 Server credentials

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

jenkins_docker.png
  • 配置node.js環境

    • 進入配置頁面

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

    1ecc0bbd6ac14decf33b39f1ba3bf51.png
  • 配置git憑證

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

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

    • 后端java項目配置

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

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

    • New Item->Freestyle project

    • 選擇配置好的node.js環境


      1155cdb992a6af71b01173145a2f461.png
  • 執行的構建命令和后端的maven不一樣使用npm進行構建

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

訪問項目

web-dev.xx.xx

web-cms-dev.xx.xx

javaee-api-dev.xx.xx

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容