天天看點

Docker實戰 LoRaServerProject

我正在學習Docker容器技術,相關筆記彙總在Docker容器技術 學習筆記彙總

這篇文章将以我目前正在研究的 lora-server 項目為例,研究下 Docker 在具體項目的實戰應用,感受下 Docker 的魅力。

一、工程簡介

lora-server是有兩種安裝方式:

一種是正常的包安裝,需要裝資料庫、MQTT等等,并且還需要配置;

第二種方式,即Docker容器方式,比較簡單,省得各種依賴。

https://docs.loraserver.io/install/docker/

官方提供了配套了 docker-compose file。

二、docker-compose.yml 檔案分析

原檔案

version: "2"

services:
  loraserver:
    image: loraserver/loraserver
    environment:
      - DB_AUTOMIGRATE=true
      - LOG_NODE_FRAMES=true
      - NET_ID=010203
      - BAND=EU_863_870
      - REDIS_URL=redis://redis:6379
      - GW_MQTT_SERVER=tcp://mosquitto:1883
      - GW_SERVER_JWT_SECRET=verysecret
      - POSTGRES_DSN=postgres://loraserver_ns:loraserver_ns@postgresql_ns/loraserver_ns?sslmode=disable
      - AS_SERVER=appserver:8001

  appserver:
    image: loraserver/lora-app-server
    ports:
      - 8080:8080
    environment:
      - DB_AUTOMIGRATE=true
      - REDIS_URL=redis://redis:6379
      - POSTGRES_DSN=postgres://loraserver_as:loraserver_as@postgresql_as/loraserver_as?sslmode=disable
      - MQTT_SERVER=tcp://mosquitto:1883
      - NS_SERVER=loraserver:8000
      - JWT_SECRET=verysecret
      - HTTP_TLS_CERT=/etc/lora-app-server/certs/http.pem
      - HTTP_TLS_KEY=/etc/lora-app-server/certs/http-key.pem

  gatewaybridge:
    ports:
      - 1700:1700/udp
    image: loraserver/lora-gateway-bridge
    environment:
      - MQTT_SERVER=tcp://mosquitto:1883

  postgresql_ns:
    image: postgres:9.6-alpine
    ports:
      - 5432
    environment:
      - POSTGRES_PASSWORD=loraserver_ns
      - POSTGRES_USER=loraserver_ns
      - POSTGRES_DB=loraserver_ns

  postgresql_as:
    image: postgres:9.6-alpine
    ports:
      - 5432
    environment:
      - POSTGRES_PASSWORD=loraserver_as
      - POSTGRES_USER=loraserver_as
      - POSTGRES_DB=loraserver_as

  redis:
    ports:
      - 6379
    image: redis:4-alpine

  mosquitto:
    ports:
      - 1883
    image: eclipse-mosquitto           

複制

可以看到總共啟動了7個服務,每個服務是都對應1個容器:

loraserver、appserver、gatewaybridge、postgresql_ns、postgresql_as、redis、mosquitto

loraserver、appserver、gatewaybridge是該開源項目做的應用程式,後面四個是配套的資料庫和MQTT代理元件,先不管。

三、實際安裝

1.工作目錄準備

建立一個 compose-loraserver 目錄,作為項目工作目錄。

目錄下放置該 docker-compose.yml 檔案。

2.啟動

在該目錄下執行 docker-compose up 指令,會整合輸出所有容器的輸出。

up
格式為 docker-compose up [options] [SERVICE...] 。

該指令十分強大,它将嘗試自動完成包括建構鏡像,( 重新) 建立服務,啟動服務,并關聯服務相關容器的一系列操作。連結的服務都将會被自動啟動,除非已經處于運作狀态。

可以說,大部分時候都可以直接通過該指令來啟動一個項目。

預設情況, docker-compose up 啟動的容器都在前台,控制台将會同時列印所有容器的輸出資訊,可以很友善進行調試。

當通過 Ctrl-C 停止指令時,所有容器将會停止。

如果使用 docker-compose up -d ,将會在背景啟動并運作所有的容器。一般推薦生産環境下使用該選項。

預設情況,如果服務容器已經存在, docker-compose up 将會嘗試停止容器,然後重新建立( 保持使用 volumes-from 挂載的卷) ,以保證新啟動的服務比對docker-compose.yml 檔案的最新内容。如果使用者不希望容器被停止并重新建立,可以使用 docker-compose up --no-recreate 。這樣将隻會啟動處于停止狀态的容器,而忽略已經運作的服務。如果使用者隻想重新部署某個服務,可以使用docker-compose up --no-deps -d <SERVICE_NAME> 來重新建立服務并背景停止舊服務,啟動新服務,并不會影響到其所依賴的服務。

選項:
-d 在背景運作服務容器。
--no-color 不使用顔色來區分不同的服務的控制台輸出。
--no-deps 不啟動服務所連結的容器。
--force-recreate 強制重新建立容器,不能與 --no-recreate 同時使用。
--no-recreate 如果容器已經存在了,則不重新建立,不能與 --forcerecreate 同時使用。
--no-build 不自動建構缺失的服務鏡像。
-t, --timeout TIMEOUT 停止容器時候的逾時( 預設為 10 秒) 。           

複制

停止服務後,改用背景方式運作。

docker-compose up -d            

複制

這樣用 docker ps 順手檢視下,發現幾個相關的容器全都運作起來了。

3.驗證

看起來,所有的容器服務都已經跑起來了。

哇哦,一步搞定。

四、總結

通過這個例程,可以非常典型地了解到 Docker 的省時省力。以往開發人員,需要事無巨細地将每個步驟告訴給運維部署人員。有了 Docker,一個 yml 檔案丢過去,運作一條 docker 指令,立馬整套自動安裝、配置、運作。

End

iotisan 部落格專家

釋出了251 篇原創文章 · 獲贊 253 · 通路量 84萬+