我正在学习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.验证

看起来,所有的容器服务都已经跑起来了。那使用浏览器,登录 app-server (https://localhost:8080/) 看看。

哇哦,一步搞定。

四、总结

通过这个例程,可以非常典型地了解到 Docker 的省时省力。以往开发人员,需要事无巨细地将每个步骤告诉给运维部署人员。有了 Docker,一个 yml 文件丢过去,运行一条 docker 命令,立马整套自动安装、配置、运行。

End


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐