将部分项目 Docker 化

Build, Ship, and Run Any App, Anywhere

第一次接触 Docker 是在本科二年级的时候,给 Maxcell 晚会部署弹幕系统,后端就是一个 Docker 项目部署在 DaoCloud 的免费主机上,如今 DaoCloud 已经不提供免费的额度了。当时觉得 Docker 就类似 Vagrant 一样,只是一个基于描述文件的虚拟机,也对 Linux 理解不深,对于 namespace 一类的概念一窍不通。

后来有多次尝试把自己的项目往 Docker 上迁移,但都是无疾而终。

最近听了《内核恐慌》(Kernel Panic) 的7. 软件包管理8. 「集装箱化」与运维管理关于 DevOps 和 Docker 的讨论,才趁着最近有空,认真读了 Docker 的文档,把之前的一部分项目做了 Docker 支持。

之前用 Tornado 写了一个让 shadowsocks-libev 支持 Mu API 的中间件,实际上部署之后有三个组件,Redis,shadowsocks-munager 和 ss-manager。按照 Docker 的理念,每一个部件都应该放在不同的容器,于是在 Docker Hub 上发布了 bazingaterry/shadowsocks-dockerbazingaterry/shadowsocks-munager,分别是运行 ss-manager 和 shadowsocks-munager 的容器。

将服务跑起来还需要用 Docker Compose 编排三个 Docker Image 的关系,编写类似下面的一个 docker-compose.yml 文件,在新机器上运行一句 docker-compose up -d 就可以将服务跑起来了。

version: '3.4'

services:
  redis:
    image: 'redis'
    restart: 'always'
    network_mode: 'host'

  ss-manager:
    image: 'bazingaterry/shadowsocks-docker'
    restart: 'always'
    network_mode: 'host'
    environment:
      - 'LISTEN=-s 0.0.0.0 -s ::'

  shadowmanager:
    image: 'bazingaterry/shadowsocks-munager'
    restart: 'always'
    stop_signal: 'SIGINT'
    network_mode: 'host'
    depends_on:
      - 'redis'
      - 'ss-manager'
    environment:
      - 'manager_host=127.0.0.1'
      - 'redis_host=127.0.0.1'
      - 'sspanel_url=https://api.example.com'

Docker 的监控服务暂时使用的是 DaoCloud 的免费服务。

把时间花在更有价值的事情上。