Skip to content

Dockerizing nodejs/react application #76

Description

@nonocast

背景:早先我们再怎么搞,总是需要将服务端和前端生成zip,同时修改目标服务器的nginx来做反向代理。通过docker解决几个问题:

  1. 开发可以在windows/macos上更容易还原linux环境,也不需要污染自己的机器,直接将代码动态挂到container中运行
  2. CI/CD可以通过pull git repo自动化生成docker
  3. 部署通过docker-compose一站式解决nginx和程序独立的问题
  4. 更重要如果是集群,手动会很麻烦

我们以一个最简单的应用为例,后端采用nodejs/koa,数据库采用mongodb, 前端采用react,需要部署到同域下, 前端地址为http://domain, 后端地址为http://dmain/api。

思路:

  • 容器单一进程原则:便于scaling, logging, profiling等
  • 后端nodejs通过webpack build后生成docker image,通过pm2-runtime开启多核,docker默认是占用host所有机能
  • 前端react通过build后生成docker image,通过nginx http serve
  • 然后通过docker-compose将docker形成一个bridge network, 通过traefik来做2个container的reverse proxy
  • mongodb可以选择直接用host的connection, 即mongodb://host.docker.internal, 也可以用mongodb container,然后将volume映射出来/data/db,都差不多
  • 无CI/CD的workflow可以这样: 开发者在本地直接docker push image到registry,然后ssh到远程测试或者生产服务器docker pull下来更新运行,当然也可以用一个简单的script
  • 如果是一个小团队,避免代码冲突,可以独立写一个script,运行后将代码git clone下来然后build docker,不建议在test, production服务器上去docker build,避免泄露源代码,docker image其实是一个的非常好的隔离点
  • 如果有CI/CD, 比如Jenkins, Drone,就可以webhook到git commit,然后通过pipeline来实现build, testing, deploy工作

差不多就这样。

参考阅读:

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions