山东大学学期中项目实训记录 (第一周)

Docker 容器化部署尝试

1. 背景浅谈

作为山东大学软件学院学期中的项目实训,我们打算做一个基于 web 的 LaTex 编辑工具。为了方便环境的配置以及服务的分离,选用Docker 进行环境的搭建。初始想法是基于一个 Nginx + MongoDB + Tornado + xeLaTex 的基本架构,至少使用4个容器满足基本的需求,作为第一周的主要任务是构建基本框架,细化技术路线。下面是一些简单的记录。

2. Dockerfile 自定义容器

该项目分为四个部分,对于数据库,可以直接使用 dockerhub 中的Mongodb。不需要额外的定制,直接pull 最新版即可:

docker pull mongo:latest

对于 Nginx, 也可以直接使用官方的版本,只是添加了一些需要额外挂载的目录:

# Define mountable directories.
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]

对于 Tornado 服务端,暂时先拟定一个最为简单的Demo,对于以后的版本再进行迭代:

# Base ENV
FROM python:3.7-slim

# set workdir to /app
WORKDIR /app

# Copy the current directory contents at /app
COPY . /app

# Install needed package
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this contaner
EXPOSE 8888

# Define environment variable
ENV NAME World

# Run app.py when it lanches
CMD ["python", "app.py"]

当然需要在当前目录下,添加requirements.txt app.py分别用于安装所必须的库,以及待执行的脚本。这三个文件会被复制到新建的容器中。

LaTex容器使用一个较为精简的配置,以后再进行扩充:

FROM ubuntu:xenial
MAINTAINER Inno Jia
ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update -q --fix-missing \
    && apt-get install -qy build-essential wget libfontconfig1 \
    && rm -rf /var/lib/apt/lists/*

# Install TexLive with scheme-basic
RUN wget http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz; \
	mkdir /install-tl-unx; \
	tar -xvf install-tl-unx.tar.gz -C /install-tl-unx --strip-components=1; \
    echo "selected_scheme scheme-basic" >> /install-tl-unx/texlive.profile; \
	/install-tl-unx/install-tl -profile /install-tl-unx/texlive.profile; \
    rm -r /install-tl-unx; \
	rm install-tl-unx.tar.gz

# install Chinese support
RUN apt-get install latex-cjk-all \
	apt-get install texlive-lang-chinese
    

ENV PATH="/usr/local/texlive/2017/bin/x86_64-linux:${PATH}"

ENV HOME /data
WORKDIR /data

# Install latex packages
RUN tlmgr install latexmk

VOLUME ["/data"]

2. 多容器的通信

为了进行多容器间的通信,可以在创建容器时,添加--link参数,指定需要通信的对象:

 # 通过link指令建立连接
 $ docker run --name <Name> -d -p <path1>:<path2> --link <containerName>:<alias> <containerName:tag/imageID>
--link 后跟需要进行通信的容器
:     用于为容器设置别名,可以在主动建立连接的容器使用该别名

为了检查是否已经成功简历连接,可以在一个容器中使用env查看环境变量,或者使用curl <alias>

2.1 数据库auth

首先需要简历数据库容器,并且进行auth认证。MongoDB默认端口开放在 27017,可以将其映射到本地的端口,本地端口在前,使用连接。除此之外,还可以使用-v操作,于本地建立文件共享。

docker run --name latex-mongo -d -p 27017:27017 mongo:latest --auth

–auth 指令开启了mongo的连接身份校验 开启校验

然后进入容器,创建数据库的管理员:

$ docker exec -it mock-mongo /bin/bash
$ mongo admin     # enter the admin db
$ db.createUser({user: "admin-name", pwd: "admin-pwd", roles: [{role: "userAdminAnyDataBase", db: "admin"}])   
$ db.auth("admin-name", "admin-pwd")

然后退出容器,建立需要使用的数据库,并且设置独立的用户:

docker exec latex-mongo mongo db_name

$ db.createUser({user: "name", pwd: "pwd", roles: [{role: "readWrite", db: "db1"}, {...}])

为一个用户赋予对于不同数据库的权限,另其单独管理。

2.2 构建Tornado容器并建立连接

我们可以实现约定好Mongo容器的别名,端口,以及账号,需要连接的数据库:

  • alias: db
  • port: 27017
  • account: admin-pwd : admin-name
  • DB: db_name

所以可以使用一下的url对于数据库进行连接:

url: 'mongodb://admin-pwd:admin-name@db:27017/db_name'

我们的Tornado服务默认在8888端口,所以再运行时需要映射到本地:

docker run -d -p 8888:8888 --name latex-server1 --link latex-mongo:db tornado:latest 

2.3 构建Nginx容器,与Tornado,Mongo连接

docker run -d -p 95:80 --name latex-nginx --link latex-server1:tornado --link latex-mongo:db nginx:latest

使用env:

DB_PORT=tcp://172.17.0.2:27017
TORNADO_ENV_GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D
HOSTNAME=e98f5db2f429
NJS_VERSION=1.15.9.0.2.8-1~stretch
TORNADO_ENV_PYTHON_VERSION=3.7.2
TORNADO_PORT=tcp://172.17.0.3:8888
NGINX_VERSION=1.15.9-1~stretch
TORNADO_ENV_NAME=World
TORNADO_ENV_LANG=C.UTF-8
TORNADO_ENV_PYTHON_PIP_VERSION=19.0.3
DB_PORT_27017_TCP_PORT=27017
DB_PORT_27017_TCP_ADDR=172.17.0.2
PWD=/
HOME=/root
DB_PORT_27017_TCP=tcp://172.17.0.2:27017
DB_ENV_MONGO_VERSION=4.0.7
DB_ENV_MONGO_PACKAGE=mongodb-org
TORNADO_PORT_8888_TCP=tcp://172.17.0.3:8888
DB_ENV_GPG_KEYS=9DA31620334BD75D9DCB49F368818C72E52529D4
TERM=xterm
TORNADO_PORT_8888_TCP_PORT=8888
DB_ENV_MONGO_REPO=repo.mongodb.org
DB_ENV_MONGO_MAJOR=4.0
TORNADO_PORT_8888_TCP_ADDR=172.17.0.3
DB_ENV_JSYAML_VERSION=3.10.0
SHLVL=1
DB_NAME=/latex-nginx1/db
DB_PORT_27017_TCP_PROTO=tcp
TORNADO_NAME=/latex-nginx1/tornado
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
DB_ENV_GOSU_VERSION=1.10
TORNADO_PORT_8888_TCP_PROTO=tcp
_=/usr/bin/env

可以看到DB_PORT, TORNADO_PORT已成功映射到别名,建立连接成功。关于Latex的配置与之类似,不再赘述。详情见我的GitPages

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值