Citypos專案的docker化部署實踐

晦若晨曦發表於2019-04-10

緣由

為簡化部署操作,統一線上環境。在近期遷移伺服器時將CityPos專案的服務端使用docker進行了部署。

使用的docker版本:ce 18.09

使用docker部署有以下優點:

  • 便於規範化環境,同樣的部署指令碼可以在多個專案中充分重複利用
  • 有利於資源的安全,多個依賴元件之間使用docker內網通訊,不對外暴露。
  • 有利於對外的安全:docker內部對宿主機的影響較少。
  • 重啟方便:docker-compose restart一鍵重啟
  • 環境統一:不會因為環境差異導致專案無法啟動(尤其對系統環境依賴較多的Python/c之類的專案)
  • 相對獨立:不會影響宿主機上已經存在的專案
  • 宿主機環境較為乾淨。

部署指令碼

部署的配置使用docker-compose進行編排。主要包括以下映象:

  • redis 快取服務,配置有密碼
  • tomcat:8.5.38-jre8 web服務,將webapps和logs資料夾對映到本地磁碟便於更新及檢視日誌,並對外對映8080埠以供訪問。
  • opencv-python-flask 這個是本地自己使用dockerfile建立的映象,提供python3, opencv3.3和flask環境。從本地對映服務的python指令碼並執行。

其中opencv-python-flask的 映象指令碼如下:

FROM jjanzic/docker-python3-opencv:contrib-opencv-3.4.1
MAINTAINER Nature szd <zzbkszd@163.com>

RUN pip install flask
複製程式碼

可以看到非常簡單,在別人的基礎上安裝了一個flask框架即可。

各個服務均在citypos網路下,互相之間直接使用container_name:port即可直接訪問。理論上講可以達到不用管理線上/測試等服務環境問題的目標。

docker-compose.yml檔案如下:

# 基礎docker環境搭建

version: '3'
services:
  # redis 資料庫服務
  redis:
    container_name: citypos-redis
    image: redis
    restart: always
    volumes:
      - ./redis.conf:/usr/local/etc/redis/redis.conf
    command:
      redis-server --requirepass ******
    networks:
      - citypos
  # tomcat web服務
  tomcat:
    container_name: citypos-tomcat
    image: tomcat:8.5.38-jre8
    restart: always
    networks:
      - citypos
    volumes:
      - ./webapps:/usr/local/tomcat/webapps
      - ./tomcatlog:/usr/local/tomcat/logs
    ports:
      - 8080:8080
    links:
      - redis:citypos-redis
  # 圖片對比服務
  imagesearch:
    container_name: image-search
    image: opencv-python-flask:latest
    restart: always
    volumes:
      - /root/compose/imagesearch:/mnt/
    networks:
      - citypos
    command:
      python /mnt/imgsearch.py   
networks:
  citypos:
複製程式碼

運維相關

程式碼更新:

伺服器上有拉取maven映象,因為本地上傳較慢,故直接在伺服器從git拉取程式碼並通過docker使用maven編譯、複製到webapps目錄下進行部署。

使用docker編譯指令如下:

docker run -it --rm --name my-maven-project -v "/root/src/citypos-api":/usr/src/mymaven -v "/root/src/m2":/root/.m2 -w /usr/src/mymaven maven:3.3-jdk-8 mvn clean compile package spring-boot:repackage

以上步驟可以使用自動化指令碼實現。

服務管理

服務管理的命令就是使用docker-compose命令。

docker-compose up 啟動新的容器

docker-compose down 關閉並刪除容器

docker-compose start 啟動容器,必須已經新建過

docker-compose stop 關閉容器並不刪除。

docker-compose restart 以上兩個命令二連,重啟容器

可以看到運維難度大幅度簡化了。

相關文章