利用 Docker 部署 Shadowsocks 服务
文章目录
Docker 是一个开放源代码软件项目,让应用程序布署在软件容器下的工作可以自动化进行,借此在操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。
Docker 利用 Linux 核心中的资源分脱机制,例如 cgroups,以及 Linux 核心名字空间(name space),来创建独立的软件容器(containers)。这可以在单一 Linux 实体下运作,避免启动一个虚拟机造成的额外负担。
简单概括起来就是,Docker 是个容器,什么都能往里塞,你也可以理解为是一个轻量化的虚拟机。
使用 Docker 的好处就是对当前系统的环境没有破坏性,基本上一款镜像可以跑在任意包含了 Docker 的机器上,可以说是十分方便了。
安装并启动 Docker
操作系统内核大于等于 3.10 的都可以安装最新版 Docker,可以直接运行官方的安装脚本一键安装。
执行脚本方法如下:
1 | wget -qO- get.docker.com | bash |
安装完成后,运行下面的命令,验证是否安装成功。
1 | docker version |
允许 Docker 开机自启
1 | systemctl enable docker |
Shadowsocks-libev Docker Image
基于官方 debian:stretch 镜像制作,直接利用 apt-get
安装好 shadowsocks-libev 和 simple-obfs 即可。
该容器在启动时依赖于读取宿主机里的配置文件,因此在启动该镜像时配合不同的 config 文件,就能开启任意个 Docker ,也就是所谓的多端口。
把配置文件放在宿主机里,是基于这样的考量:随时在宿主机里修改配置的端口,密码,加密方式等信息,然后只需重启容器,无需再次创建新的容器。
支持的 Tags 及 Dockerfile
latest (Dockerfile)
alpine (Dockerfile)
拉取镜像
1 | docker pull appso/shadowsocks-libev |
或者拉取以 alpine 镜像制作的,其特点就是文件容量非常小
1 | docker pull appso/shadowsocks-libev:alpine |
创建 config 文件
比如在目录 /etc/shadowsocks-libev
下创建 config.json,完整路径也就是 /etc/shadowsocks-libev/config.json
范例内容如下:
1 | { |
如果你想同时开启 simple-obfs,那么配置文件范例如下:
1 | { |
配置文件里面所有选项的含义,可以参考这个链接。
启动容器
在上面这个范例里,定义的端口是 9000,那么在启动容器时就需要将 9000 端口映射到宿主机的对外端口上。
启动命令:
1 | docker run -d -p 9000:9000 -p 9000:9000/udp --name ss-libev -v /etc/shadowsocks-libev:/etc/shadowsocks-libev appso/shadowsocks-libev |
docker run
:开始运行一个容器。-d
参数:容器以后台运行并输出容器 ID。-p
参数:容器的 9000 端口映射到本机的 9000 端口。默认是映射 TCP,当需要映射 UDP 时,那就再追加一次 UDP 的映射。冒号前面是宿主机端口,冒号后面是容器端口,可以写成一致,也可以不一致。–name
参数:给容器分配一个识别符,方便将来的启动,停止,删除等操作。-v
参数:挂载卷(volume),冒号前面是宿主机的路径,冒号后面是容器的路径,可以写成一致,也可以不一致。appso/shadowsocks-libev
:这是拉取回来的镜像路径。
当然,这里也可以启动 Tag 为 alpine 的镜像命令:
1 | docker run -d -p 9000:9000 -p 9000:9000/udp --name ss-libev -v /etc/shadowsocks-libev:/etc/shadowsocks-libev appso/shadowsocks-libev:alpine |
注意:此处仅作为演示,不能同时执行上面的这两个启动命令,因为端口都是 9000,产生冲突了。推荐选 Tag 为 alpine 的镜像的,因为文件的体积会相对比较小。
查看容器
利用如下命令可以查看所有已创建的 Docker 容器并显示容器的大小等信息:
1 | docker ps -as |
停止容器
利用如下命令可以停止正在运行中的容器:
1 | docker stop $name |
此处的 $name
就是在启动容器那一步定义的容器的识别符,比如范例的 ss-libev
启动容器
利用如下命令可以启动已经停止的容器:
1 | docker start $name |
ShadowsocksR Docker Image
基于官方 debian:stretch 镜像制作,安装的是 Github 上目前最新的版本。
该容器在启动时依赖于读取宿主机里的配置文件,因此在启动该镜像时配合不同的 config 文件,就能开启任意个 Docker ,也就是所谓的多端口。
把配置文件放在宿主机里,是基于这样的考量:随时在宿主机里修改配置的端口,密码,加密方式等信息,然后只需重启容器,无需再次创建新的容器。
支持的 Tags 及 Dockerfile
latest (Dockerfile)
alpine (Dockerfile)
拉取镜像
1 | docker pull appso/shadowsocksr |
或者拉取基于 python:3.6-alpine 镜像制作的
1 | docker pull appso/shadowsocksr:alpine |
创建 config 文件
比如在目录 /etc/shadowsocksr
下创建 config.json,完整路径也就是 /etc/shadowsocksr/config.json
范例内容如下:
1 | { |
ShadowsocksR 协议插件文档的含义,可以参考这个链接。
启动容器
在上面这个范例里,定义的端口是 9000,那么在启动容器时就需要将 9000 端口映射到宿主机的对外端口上。
启动命令:
1 | docker run -d -p 9000:9000 -p 9000:9000/udp --name ssr -v /etc/shadowsocksr:/etc/shadowsocksr appso/shadowsocksr |
启动 Tag 为 alpine 的镜像命令:
1 | docker run -d -p 9000:9000 -p 9000:9000/udp --name ssr -v /etc/shadowsocksr:/etc/shadowsocksr appso/shadowsocksr:alpine |
注意:此处仅作为演示,不能同时执行上面的这两个启动命令,因为端口都是 9000,产生冲突了。推荐选 Tag 为 alpine 的镜像的,因为文件的体积会相对比较小。
参考链接
https://hub.docker.com/r/appso/shadowsocks-libev/
https://hub.docker.com/r/appso/shadowsocksr/