使用docker部署pomelo游戏服务器

游戏服务器部署的痛点

在部署新的游戏服务器的时候,很麻烦的一个地方就是要重新安装各种服务,redis数据库,mongodb数据库和NGINX服务等等。如果是自己手动去安装的,在不同的服务器环境中总会出现各种各样的问题,安装路径不同,启动程序不同,或者配置文件有些微的区别等,甚至敲命令出错了。最后的结果是每一次部署一个新的服务器都需要花费大量的时间。docker可以把整一套游戏服务器的软件环境代码打包成镜像,在新的vps上只需要把镜像同步过来,然后运行起来,整一套游戏服务器工程就可以跑起来了,再也不用一步步的配置服务器代码的运行环境,非常方便。

这篇博文主要记录使用docker-compose,部署redis数据库,MongoDB数据库、Nginx服务,node.js代码。

关于docker 和docker-compose 的使用,参考官方文档https://docs.docker.com/.

redis 服务部署

在工程的根目录新建一个docker目录,在docker目录下再新建一个redis目录,在redis目录下放置redis数据库的配置文件redis.conf。docker启动时,使用这个配置文件作为redis数据的配置。
配置文件可以到redis的官方网站下载。修改属性bind 和requirepass 为 ‘bind 0.0.0.0’ , ‘requirepass 密码’。开启Redis的远程连接和密码验证,更多配置可以参考官方文档。

在docker目录新建文件docker-compose.yml,在文件里面配置redis的启动参数。

version: '3'
services:   
  redis:
    container_name: "redis_aoteman"  #容器名称
    image: "redis"                   #使用官方镜像
    ports:
       - "4901:6379"                #端口映射 使用4901 作为外部端口号码
    volumes:
       - "$PWD/redis/redis.conf:/etc/redis/redis.conf" #把上面的配置文件挂到Redis
       - "$PWD/redis/data:/data"      # 挂载redis数据文件
    command: ["redis-server", "/etc/redis/redis.conf"]

mongodb 部署

在docker目录下新建一个mongo目录,在mongo目录下新建mongodb.conf配置文件。配置文件的基本配置如下。 需要配置数据库文件路径,log文件路劲,开启远程访问,设端口号码。还需要设置是否开启安全验证auth。

# mongodb.conf

# Where to store the data.
dbpath=/data/db

#where to log
logpath=/log/mongodb.log

logappend=true

bind_ip = 0.0.0.0
port = 4900

# Enable journaling, http://www.mongodb.org/display/DOCS/Journaling
journal=true

# Enables periodic logging of CPU utilization and I/O wait
#cpu = true

# Turn on/off security.  Off is currently the default
#noauth = true
auth = false

profile = 1
slowms  = 100

然后需要在docker-compose.yml 中配置mongodb的容器启动配置。

version: '3'
services:   
  mongo:
    container_name: "mongodb"
    image: "mongo"
    ports:
      - "4900:4900"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin  #管理员账号
      MONGO_INITDB_ROOT_PASSWORD: password #管理员密码
    volumes:
      - "$PWD/mongo/mongodb.conf:/etc/mongo/mongod.conf" #挂配置文件
      - "$PWD/mongo/data/db:/data/db" #挂数据文件
      - "$PWD/mongo/log:/log"         #挂log文件
    command: ["-f", "/etc/mongo/mongod.conf"]

注意,根据上面的配置,需要在mongo目录下新建一个data目录和一个log目录,还需要在log目录下新建一个mongodb.log 的空白文件,否则docker会报找不到文件的错误。

需要注意的是,mongodb数据库容器需要在node.js 代码运行前设置好数据库的账号密码。

  1. cd 到docker目录,执行 docker-compse up -d 命令启动MongoDB容器。
  2. 然后执行命令docker exec -it mongodb /bin/bash , (mongodb是容器名称),进入到容器内部。 执行mongo -host ip -port portNum, ip和portNum 的本机的内网IP地址和容器服务的端口号码,启动mongodb的客户端。
  3. use admin,切换到admid数据库,db.auth(“admin”,”password”) 使用管理员账号登录数据库。
  4. use aotmen,切换到你自己的数据库,然后需要执行下面的命令新建该数据的用户。
db.createUser({user:"yourName",pwd:"your_password",
           roles[{"role":"readWrite","db":"aoteman"}],
           mechanisms:["SCRAM-SHA-1"] })
  1. 然后就可以执行exit,退出客户端、退出容器了。

部署NGINX

这里NGINX主要用来处理服务器后台管理页面,开发的时候使用前后端分离,后端提供http接口,前端使用vue.js实现页面UI,然后需要使用NGINX作为前端的web服务器。

部署NGINX也是需要准备好NGINX的配置文件,然后挂载到docker的容器上。在docker目录下新建nginx目录,在nignx目录下新建nginx.conf配置文件,和conf.d目录。在conf.d目录里放置具体的配置文件fileserver.conf。

nginx.conf文件使用安装包默认的配置内容,在fileserver.conf配置自己的web服务器。
fileserver.conf内容。

server {
    listen  80;
    server_name  localhost;
    charset utf-8; # 避免中文乱码
    root /content; # 存放文件的目录
    location / {
        autoindex on; # 索引
        autoindex_exact_size on; # 显示文件大小
        autoindex_localtime on; # 显示文件时间
    }
}

在docker-compose.yml文件中使用官方的docker镜像启动容器。需要在两个配置文件中修改内容文件夹的路径。

version: '3'
services:   
  nginx:
    container_name: "nginx_aoteman"
    image: "nginx"
    ports:
      - "4902:80"
    volumes:
      - "$PWD/../web/dist:/content"  #nginx 服务内容文件夹
      - "$PWD/nginx/nginx.conf:/etc/nginx/nginx.conf:ro" # 主配置文件
      - "$PWD/nginx/conf.d:/etc/nginx/conf.d" #文件服务器的配置在里面

部署pomelo工程代码

制作pomelo 代码镜像

在node.js工程的根目录新建文件Dockerfile,用于制作本工程的的镜像。

FROM node:6.12.0
RUN mkdir /game-server
WORKDIR /game-server
RUN npm install -g cnpm --registry=https://registry.npm.taobao.org
RUN cnpm install -g pm2
RUN cnpm install -g pomelo
CMD pomelo start

这里使用了淘宝的的npm源,全局安装pm2和pomelo,使用pm2作为node.js的进程管理,pm2的配置参考http://blog.superzhan.cn/shi-yong-pm2bu-shu-pomelofu-wu-qi/

本镜像并没有把源代码复制到镜像里面,主要是为了把源码目录挂载到容器外部的硬盘上,方便之后的代码更新。挂载的路径在docker-compose.yml 文件中配置。

docker容器启动只能执行一条命令,所有有必要把pomelo的启动命令写到一个启动shell脚本中。每次启动都会检查安装依赖库,生成配置文件,然后启动。

#/bin/bash
cnpm install -d    #安装依赖库
node generatePm2Config.js  #使用pm2来做进程管理,生成进程配置文件
pm2-runtime  pomeloPm2Start.json #pm2 启动游戏服务器

docker-compose.yml 启动配置

配置文件中使用build命令调用上面的Dockerfile文件,构建一个新的镜像,然后用这个镜像启动容器。使用command命令启动上写的启动脚本。在volumes 中配置源代码的挂载路径。

version: '3'
services:
    game-server:
        container_name: "aoteman_game_server"
        build: ../game-server
        depends_on:
          - "mongo"
          - "redis"
        volumes:
          - "$PWD/../game-server:/game-server"
        ports:
          - "4000:4000"
          - "4001:4001"
          - "4002:4002"
          - "4003:4003"
          - "4004:4004"
          - "4045:4045"
          - "4910:4910"

        command: sh ./startGameServer.sh #使用 shell脚本启动游戏服务器

The End

全部配置文件的集合可以参考https://pan.baidu.com/s/1I7_Th8gitfs8UeEDT6MH8g

最后部署到生产环境就比较简单了,把代码和docker的全部配置都放入到git版本库。到目标vps主机上,把全部的文件pull下来,到docker目录执行docker-compose up -d 命令就可以启动了。

如果数据库需要提前配置好账号密码,就需要分两次来。第一次不启动pomelo容器,先启动MongoDB容器,按照上面的步骤设置好数据库、账号、密码。第二次再把全部容器都启动就可以了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注