Skip to content

Tencent Tars 的Docker镜像脚本与使用

Docker Pulls Docker Automated build Docker Build Status

Click to Read English Version

本文档网站基于 https://gitlab.com/tangramor/mkdocs 生成,支持 Gitlab Pages 和 PDF 导出(含中文)。

约定

本文档假定你的工作环境为 Windows,因为Windows下的docker命令行环境会把C:盘、D:盘等盘符映射为 /c//d/ 这样的目录形式,所以在文档中会直接使用 /c/Users/ 这样的写法来描述C:盘的用户目录。

MySQL

本镜像是Tars的docker版本,未安装mysql,可以使用官方mysql镜像(5.6):

docker run --name mysql -e MYSQL_ROOT_PASSWORD=password -d -p 3306:3306 -v /c/Users/<ACCOUNT>/mysql_data:/var/lib/mysql mysql:5.6 --innodb_use_native_aio=0

注意上面的运行命令添加了 --innodb_use_native_aio=0 ,因为mysql的aio对windows文件系统不支持

如果要使用 5.7 版本的mysql,需要再添加 --sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 参数,因为不支持全零的date字段值( https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_date

docker run --name mysql -e MYSQL_ROOT_PASSWORD=password -d -p 3306:3306 -v /c/Users/<ACCOUNT>/mysql_data:/var/lib/mysql mysql:5.7 --sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION --innodb_use_native_aio=0

如果使用 8.0 版本的mysql,则直接设定 --sql_mode='',即禁止掉缺省的严格模式,(参考 https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html

docker run --name mysql -e MYSQL_ROOT_PASSWORD=password -d -p 3306:3306 -v /c/Users/<ACCOUNT>/mysql_data:/var/lib/mysql mysql:8 --sql_mode='' --innodb_use_native_aio=0

或者你也可以挂载使用一个自定义的 my.cnf 来添加上述参数。

镜像

docker镜像已经由docker hub自动构建:https://hub.docker.com/r/tarscloud/tars/https://hub.docker.com/r/tangramor/docker-tars/ ,使用下面命令即可获取(注意替换 <tag> ):

docker pull tarscloud/tars:<tag>

  • tag 为 latest 的镜像支持C++服务端,包含 CentOS7 的标准C++运行环境;
  • tag 为 php 的镜像支持PHP服务端,包含了 php 7.2 环境和 swoole、phptars 扩展;
  • tag 为 java 的镜像支持Java服务端,包含 JDK 10.0.2 以及 maven 等支持;
  • tag 为 go 的镜像支持Go语言服务端,包含 Golang 1.9.4;
  • tag 为 nodejs 的镜像支持Nodejs服务端,包含 nodejs 8.11.3;
  • tag 为 dev 的镜像包含了C++、PHP、Java、Go和Nodejs的服务端开发支持,用于开发,上述其它镜像则 不包含 make等开发工具以减小镜像体积。

tars-node 之下是只部署 tarsnode 服务的节点镜像脚本,使用下面命令即可获取:

docker pull tarscloud/tars-node:<tag>

注意:

镜像使用的是官方Tars的源码编译构建的,容器启动后,还会有一个自动化的安装过程,因为原版的Tars代码里设置是需要修改的,容器必须根据启动后获得的IP、环境变量等信息修改设置文件,所以会花费一定的时间。可以进入容器运行 ps -ef 命令查看进程信息来判断系统是否已经启动完成。

环境变量

TZ

时区设置,缺省为 Asia/Shanghai

DBIP, DBPort, DBUser, DBPassword

在运行容器时需要指定数据库的 环境变量,例如:

DBIP mysql
DBPort 3306
DBUser root
DBPassword password

DBTarsPass

因为Tars的源码里面直接设置了mysql数据库里tars用户的密码,所以为了安全起见,可以通过设定此 环境变量 DBTarsPass 来让安装脚本替换掉缺省的tars数据库用户密码。

MOUNT_DATA

如果是在 Linux 或者 Mac 上运行,可以设定 环境变量 MOUNT_DATAtrue 。此选项用于将Tars的系统进程的数据目录挂载到 /data 目录之下(一般把外部存储卷挂载为 /data 目录),这样即使重新创建容器,只要环境变量一致(数据库也没变化),那么之前的部署就不会丢失。这符合容器是无状态的原则。可惜在 Windows 下由于文件系统与虚拟机共享文件夹的权限问题,我们 不能 使用这个选项。

INET_NAME

如果想要把docker内部服务直接暴露到宿主机,可以在运行docker时使用 --net=host 选项(docker缺省使用的是bridge桥接模式),这时我们需要确定宿主机的网卡名称,如果不是 eth0,那么需要设定 环境变量 INET_NAME 的值为宿主机网卡名称,例如 --env INET_NAME=ens160。这种方式启动docker容器后,可以在宿主机使用 netstat -anop |grep '8080\|10000\|10001' |grep LISTEN 来查看端口是否被成功监听。

MASTER

节点服务器需要把自己注册到主节点master,这时候需要将tarsnode的配置修改为指向master节点IP或者hostname,此 环境变量 MASTER 用于 tars-node 镜像,在运行此镜像容器前需要确定master节点IP或主机名hostname。

run_docker_tars.sh 里的命令如下,请自己修改:

docker run -d -it --name tars --link mysql --env MOUNT_DATA=false --env DBIP=mysql --env DBPort=3306 --env DBUser=root --env DBPassword=PASS -p 8080:8080 -v /c/Users/<ACCOUNT>/tars_data:/data tarscloud/tars

框架普通基础服务

另外安装脚本把构建成功的 tarslog.tgz、tarsnotify.tgz、tarsproperty.tgz、tarsqueryproperty.tgz、tarsquerystat.tgz 和 tarsstat.tgz 都放到了 /c/Users/<ACCOUNT>/tars_data/ 目录之下,镜像本身已经自动安装了这些服务。你也可以参考Tars官方文档的 安装框架普通基础服务 来了解这些服务。

自己构建镜像

镜像构建命令:docker build -t tars .

tars-node 镜像构建,请检出 tars-node 项目后执行命令:

git clone https://github.com/TarsDocker/tars-node.git
cd tars-node
docker build -t tars-node -f Dockerfile .

开发方式

使用docker镜像进行Tars相关的开发就方便很多了,我的做法是把项目放置在被挂载到镜像 /data 目录的本地目录下,例如 /c/Users/<ACCOUNT>/tars_data 。在本地使用编辑器或IDE对项目文件进行开发,然后开启命令行:docker exec -it tars bash 进入Tars环境进行编译或测试。

举例说明:

TARS C++服务端与客户端开发

TARS PHP TCP服务端与客户端开发

TARS PHP HTTP服务端与客户端开发

TARS JAVA服务端与客户端开发

感谢

本镜像脚本根据 https://github.com/panjen/docker-tars 修改,最初版本来自 https://github.com/luocheng812/docker_tars