我正在學習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萬+