我正在学习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 命令,立马整套自动安装、配置、运行。