使用docker和ubuntu服务器开发在线测试平台

要求:首先你必要有一台Ubuntu服务器,熟悉Ubuntu的基本明亮行。了解docker容器的基本概念和原理,以及使用方法

#正式部署说明

以下均是在 Ubuntu 14.04 64位系统上进行的测试。由于内核版本和Python版本等问题,建议不要使用更低的系统版本,如12.04。

首先选择一下安装目录,我选择的是 /home/ 下,下面的操作不加特殊说明的话,都是相对这个目录的。如果需要更改,请自行替换所有的路径。

如果不是 root 用户,下面的命令需要的自行添加 sudo。

以下的安装需要gitcurlpipvim,如果提示没有安装,请运行apt-get update && apt-get install -y git curl python-pip vim

##下载源代码

git clone https://github.com/QingdaoU/OnlineJudge.git /home/OnlineJudge

##安装 Docker 和 docker-compose

因为国内特殊网络环境,Docker 的安装和使用并不方便,我们使用 DaoCloud 的安装镜像。但是有时候也会出现添加 key 失败的问题,这时候可以使用官方的安装方案。

curl -sSL https://get.daocloud.io/docker | sh

安装 docker-compose

pip install docker-compose

##配置目录映射

Docker 在运行的时候,如果没有配置目录映射,数据都是保存在 Docker 容器里面的,如果 Docker 容器被删除,数据就会丢失,所以需要将容器内的数据映射到服务器上存储。

我们使用下面的文件夹进行映射

  • /home/data/mysql MySQL 的数据文件
  • /home/data/redis Redis 的持久化文件
  • /home/test_case 上传的测试用例
  • /home/log 各种日志
  • /home/upload 上传的图片等

请自行创建相关的文件夹。命令参考mkdir -p /home/data/mysql /home/data/redis /home/test_case /home/log /home/upload

##pull 需要的镜像(目前只提供阿里云镜像一种方式)

docker pull registry.aliyuncs.com/v-image/redis
docker tag registry.aliyuncs.com/v-image/redis redis
docker pull registry.aliyuncs.com/v-image/mysql
docker tag registry.aliyuncs.com/v-image/mysql mysql
docker pull registry.aliyuncs.com/v-image/nginx
docker tag registry.aliyuncs.com/v-image/nginx nginx
docker pull registry.aliyuncs.com/v-image/oj_web_server
docker pull registry.aliyuncs.com/v-image/judger
docker tag registry.aliyuncs.com/v-image/oj_web_server qduoj/oj_web_server
docker tag registry.aliyuncs.com/v-image/judger qduoj/judger

注意:

  • 在服务器上运行 MySQL 至少需要1G内存,否则很容易出现异常退出的问题。
  • 专业用户可以自己使用Dockerfile build需要的镜像

运行 docker images 就能看到所有的镜像了。

##配置 docker-compose

Docker Compose 是在使用 Docker 容器部署分布式应用时的工具,可以定义哪个容器运行哪个应用。使用Compose,你只需定义一个多容器应用的 yml 文件,然后使用一条命令即可部署运行所有容器。

在 dockerfiles/oj_web_serverdockerfiles/judger分别有一个 docker-compose.example.yml。请复制一份为docker-compose.yml。不要删除docker-compose.example.yml文件。

在 dockerfiles/oj_web_server 下面还有一个docker-compose-nginx.exmaple.yml,请复制一份为docker-compose-nginx.yml。复制oj.example.confoj.conf

先解释下文件中的部分参数

  • image 使用的镜像
  • volumes 目录映射,将冒号前面的服务器上的映射到冒号后面容器内的路径
  • env 容器内环境变量
  • link 两个容器的连接
  • ports 端口映射

如果你配置的映射目录或者端口有变化,修改对应的行就行。里面值为{YOUR_PASSWORD}注意从这开始,下文所有的{XXX}都是代表一个变量,使用时请去除大括号)是需要自己修改或者配置的密码。

##启动oj_web_server需要的容器

机器上已经安装有nginx的,请先阅读这里。

oj_web_server目录中运行 docker-compose -f docker-compose.yml -f docker-compose-nginx.yml up -d

docker ps -a可以看到所有的容器的运行状态。如果都是up的状态,说明成功启动了。如果有exited的状态,请先查看 CONTAINER ID,然后运行docker logs {CONTAINER_ID}查看错误提示。还可以去log文件夹看日志,修复了问题之后,docker-compose up -d重启容器。

##创建数据表

需要进入 oj_web_server 容器,docker ps -a 可以看到这个容器是 running,然后复制 CONTAINER ID

运行

docker exec -i -t {CONTAINER ID} /bin/bash

然后容器中运行

python tools/create_db.py
python manage.py migrate
python manage.py migrate --database=submission
python manage.py initadmin

其中最后一个命令是创建了超级管理员用户,密码是随机生成的,请妥善保管。如果忘记超级管理员root密码,也可以使用 initadmin 命令。

然后运行 python tools/release_static.py,以生成压缩版的js,此过程较慢,请耐心等候。(必须运行)

然后 exit 退出 docker 容器,docker restart {CONTAINER ID}重启。

##server安装成功 如果可以访问了,请在 {server_ip}/login/ 处登录 root 用户,然后访问{server_ip}/admin/ 添加一道题目试试吧。但是现在还不能判题。

##配置判题 同上,在 dockerfiles/judger 文件夹也有一个 docker-compose.example.yml 文件,请先复制一份为docker-compose.yml。其中 {YOUR_PASSWORD} 自行修改,后面会用到。

然后运行 docker-compose up -d

  • 如果判题和web服务器在同一台服务器上,请运行 docker inspect --format='{{json .NetworkSettings.Networks}}' {JUDGER_CONTAINER_ID}(container_id的获取方法见上文),查看它分配的ip地址,端口为8080,名字任意,密码即是刚才docker-compose.yml里配置{YOUR_PASSWORD}
  • 如果判题和web服务器不在同一台服务器上,ip为judger服务器的公网ip,端口为8085。

在 admin 界面 判题服务器 tab 里面,填写ip、端口和密码,创建一个判题服务器就可以了。

如果出现invalid-token的情况,请检查admin里面判题服务器密码和docker-compose.yml中的rpc_token是否一致。docker-compose.yml中的大括号是为了区分变量,修改的时候请去掉。

##网站名称和smtp密码

请自行修改oj/custom_settings.py文件

部署效果 ;www.hgacm.com


你可能感兴趣的:(Docker)