最近在准备一个 SaaS 系统的调研、基础技术准备,遇到了环境搭建的问题,可预见的开发阶段不会使用远程公用数据库,需要做本地开发,每个人都本地配置 MySql 数据库和 Redis,是很麻烦的事情,所以想到使用 Docker 来配置开发环境。
准备
- Mac 系统
- 安装 Docker(教程很多)
- 基本的 Docker 使用知识
开发环境需求
为了方便开发,保证程序的质量,我们决定使用熟悉的 Node 开发,Typescript 作为基础语法检查,并且开发时,保存文件后程序自动重载,所以依赖了几项
- typescript
- ts-node
- nodemon
经过测试发现,在 docker container 中跑 nodemon 的效率是很低的,重载一次需要十多秒(3.5GHz CPU,32G 内存的 iMac),所以为了快速重载,node 进程不在 docker container 中运行。docker container 只提供 MySql 和 Redis 服务。
Docker MySql command
执行以下命令将自动拉去对应 tag 的 mysql 镜像到本地,并且运行镜像。
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
查看正在运行的 docker containers
docker ps
查看该容器的 log
docker logs some-mysql
进入该容器的可执行进程
docker exec -it some-mysql -uroot -p
需要输入的 password
就是上面的 my-secret-pw
通过 Docker 使用 MySql 服务就成功了,比从官网下载 MySql 便捷的多。但是这个只是开始,我们需要与正在开发的应用连接起来。
docker-compose.yml
在 node 项目的根目录中创建 docker-compose.yml
,这是用来描述 Docker 服务集合的描述文件,yaml 格式。
version: "3"
services:
# 由于尝试了在 docker container 中运行 node 程序效率很低,所以暂时不使用
# dev:
# image: node:12.6
# volumes:
# - ./:/home/node-web-server/app
# working_dir: /home/node-web-server/app
# depends_on:
# - db
# environment:
# NODE_ENV: development
# ports:
# - 5566:5566
# command: "yarn start"
db:
image: mysql:8.0.17
# 由于 Node 的 mysql 库太旧了,不支持新的用户验证算法,所以通过这个命令让 mysql 的验证算法回退到旧版
command: --default-authentication-plugin=mysql_native_password
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=test
- MYSQL_USER=test
- MYSQL_PASSWORD=test
ports:
- "3306:3306"
volumes:
- ./.data/db:/usr/local/mysql/data
运行起来
docker-compose up
运行稳定后可以通过 docker ps
命令查看,这样通过 Docker 提供 mysql 数据库服务的环境就搭建完成,同理可以把 Redis 和更多需要的服务通过在 docker-compose.yml 描述得到。不得不说 Docker
是个了不起的技术。
与程序结合
- 使用 node mysql 手动连接数据库
- 使用 typeORM 连接
我们使用了 typeORM 来作为数据库连接、数据建模等操作。
具体参考项目 https://github.com/SANGET/node-web-server(只有基本架构,不涉及具体业务)
部署
以后到部署环节再详细记录。