MongoDB + Rails + SQLite3 API 项目快速部署方案
准备 MongoDB 应用
mkdir -p context/mongodb5
# https://www.mongodb.com/try/download/community
MAIN_PKG=mongodb-linux-x86_64-debian10-5.0.9
wget https://fastdl.mongodb.org/linux/$MAIN_PKG.tgz
tar -zxf $MAIN_PKG.tgz
mv $MAIN_PKG/bin context/mongodb5
# https://www.mongodb.com/try/download/database-tools
TOOL_PKG=mongodb-database-tools-debian10-x86_64-100.5.3
wget https://fastdl.mongodb.org/tools/db/$TOOL_PKG.tgz
tar -zxf $TOOL_PKG.tgz
mv $TOOL_PKG/bin/* context/mongodb5
mongodb5 包含了 MongoDB 的 client,server 和 cmd tools:
准备 Dockerfile
cd context && touch Dockerfile
Dockerfile 文件内容如下:
FROM ruby:2.7.0
COPY mongodb5/* /usr/local/bin/
RUN mkdir -p /app/src \
&& mkdir -p /app/tasks \
&& mkdir -p /app/temp \
&& mkdir -p /var/lib/mongo \
&& mkdir -p /var/log/mongodb \
# Install sqlite3
&& apt-get update \
&& apt-get install -y sqlite3 \
&& rm -rf /var/lib/apt/lists/* \
# Install rails
&& gem install rails:6.1.6 \
&& gem install bundler:2.3.7 \
# else
&& echo "alias startdb='mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork'" >> /root/.bashrc \
&& echo "alias startapp='cd /app/src && nohup rails server -e production 2>&1 &'" >> /root/.bashrc \
&& echo "alias ll='ls -lh'" >> /root/.bashrc
WORKDIR /app/src
EXPOSE 3000
EXPOSE 27017
构建镜像主要做这几个事:
- 将 MongoDB 的几个程序复制到系统路径中
- 将项目的所有代码和数据放到 /app 目录下:src 放代码,temp 用来从宿主机传递一些数据到容器,tasks 存放任务结果
- 设置 MongoDB 数据库和日志的保存位置
- 安装 sqlite3 依赖
- 安装 Rails 和 Bundler
- 设置几个 alias 用来启动数据库
- 设置进入容器时的工作目录为项目代码根目录
- 容器应该暴露 API 服务端口 3000 和数据库端口 27017
写好 Dockerfile 后构建镜像:
docker build -t myproject:local .
启动容器
找个地方存放项目代码,这个目录将被挂载到容器的 /app/src 上:
cd ~/containers/myproject
git clone xxxxxxxxxxxxxxxxxxxx app
启动容器:
CONTAINER=$HOME/containers/myproject
docker run -itd \
--name myproject \
-p 3004:3000 \
# 后端代码
-v $CONTAINER/src:/app/src \
# 后端结果
-v $CONTAINER/tasks:/app/tasks \
# 数据库数据
-v $CONTAINER/db:/var/lib/mongo \
# 其他数据
-v $CONTAINER/temp:/app/temp \
myproject:local
启动项目:
docker exec -it myproject bash
bundle install
startdb
rails server --environment=production
评论区