本篇文章将会记录Mosquitto、Redis以及Postgresql的相关信息,使用docker部署程序。

Docker相关的流水账

可以在国外的VPS构建基础镜像,因为劫持少,网速快,基础镜像推送到国内registry;

docker镜像体积较大,需要较高的上行和下行速度,为了统一开发测试环境,可以使用同一个国内registry,注意把所有涉及运行环境的变量修改为可配置;

在构建推送完第一个版本后,后续的推送只会增加更新的部分,所以基础镜像需要包括所有不变或者较少变更的资源,这样后续每次推送的体积大小基本相当于程序的大小;

集群服务间最好是单向依赖的,减少滚动升级时出现的依赖问题;

给docker镜像加tag是个好习惯;

这次部署是直接在运行docker程序的VPS上进行的,所以对外暴露端口时,全部避免了使用程序默认端口;

设置端口映射时允许了来自任意地址的访问,因此需要添加防火墙规则,只开放允许在外网访问的端口;

选择基础镜像时也有尝试过alpine,但对它的命令还不熟悉,许多软件要靠自己编译,另外它使用的C标准库与glibc还有一定差距,最后还是选择了熟悉的Ubuntu做基础镜像;

阿里的镜像加速器是个好东西,就是在后台管理页面中找不到入口,入口在这里:开发者平台

启用镜像加速器后,会得到一个专属的https地址,修改daemon配置文件/etc/docker/daemon.json

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

MQTT

mqtt.org是负责MQTT协议规范的组织,但官网太过简洁,它的Wiki托管在GitHub上:MQTT Wiki

MQTT协议的实现已经有很多了,可以在这里找到:MQTT Software

目前Mosquito是一个成熟的MQTT服务端,已经被Eclipse收入旗下,应该不会那么容易夭折。

Mosquitto官网:mosquitto.org

官方镜像地址:Library/Eclipse-mosquitto

安装

两种安装方式,apt命令安装或者从源码编译。目前Ubuntu 16.04源中的版本为1.4.8,官网更新到了1.4.12版本,可以看下changelog,如果没有太大改变,可以直接从源安装,编译源码的例子可以参考ansi/mosquitto,在它的Dockerfile中有详细的命令,包括安装编译环境,编译,安装,添加运行用户,整个镜像的体积较大

配置

如果是对外暴露MQTT端口,建议修改默认的配置,默认的mosquitto.conf文件:mosquitto.conf.tar

端口:默认为1883端口,建议修改

用户:默认为当前用户,当前用户为root时,可以根据配置的user字段选择用户运行,Ubuntu添加用户的例子

1
adduser --system --disabled-password --disabled-login mosquitto

账号密码:账号密码需要使用mosquitto_passwd命令生成password_file,同时在配置文件中禁用匿名登录,将allow_anonymous设为false,需要注意的是,如果编译时没启用TLS的话,设置的账号密码是明文的,否则密码是Hash后存储。如果客户端使用WiFi或者有线网络,明文传输的风险是显而易见的,这里暂且不对安全性做进一步探究。

mosquitto_passwd文档:https://mosquitto.org/man/mosquitto_passwd-1.html

1
2
mosquitto_passwd -c passwordfile username //交互式,需要输入两次密码,会覆盖文件
mosquitto_passwd -b passwordfile username password //批处理方式,passwordfile需要预先创建,账号和密码会被追加进去

如果计划使用TLS,最好采用自签名证书或者有效期较长的付费证书,因为更换证书后,需要重启服务

部署

在dockerhub上已经有官方基于alpine构建的镜像,使用默认配置,相关的dockerfile在这里:https://github.com/eclipse/mosquitto/tree/master/docker

在宿主机上安装mosquitto_clients,预先生成一个passwordfile,修改一份默认的mosquitto.conf文件,禁用匿名登录,设置password_file路径,在运行镜像时挂载到对应的路径上。

Redis

Redis在内网中使用,不启用账户密码验证的机制,直接拉取官方的镜像后运行即可,默认访问端口为6739,官方镜像地址:Library/Redis

PostgreSQL

PostgreSQL同样使用官方镜像,由于需要创建一些用户和数据库,这里记录下简单的语法与相关的博客。

官方镜像地址:Library/Postgre

相关博客:PostgreSQL 9.6.0 手册PostgreSQL新手入门

直接运行镜像后,默认创建了postgres用户,使用端口5432。进入到容器中,运行:

1
psql -U postgres

然后可以参考语法做增删改查了

创建用户与数据库

1
2
create role userzero with login password 'passwordzero';
create database databasezero with owner userzero;

这里创建了一个userzero用户,登录密码为passwordzero,拥有对数据库databasezero的所有权限。

连接数据库的地址(假定服务器地址为10.0.0.1):

1
postgres://userzero:passwordzero@10.0.0.1:5432/databasezero?sslmode=disable

另附几个常用命令:

1
2
3
4
\l 列出所有数据库
\c database_name 连接指定数据库
\d 列出当前数据库的所有表
\d tableName 列出指定表结构

后续真正开始使用Postgre时,再详细记录下一些要点。