第一次接触 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-docker 和 bazingaterry/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 的免费服务。
把时间花在更有价值的事情上。