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
2
3
4
5
6
7
8
9
10
{
"server":"0.0.0.0",
"server_port":9000,
"password":"password",
"timeout":300,
"method":"aes-256-gcm",
"fast_open":false,
"nameserver":"8.8.8.8",
"mode":"tcp_and_udp"
}

如果你想同时开启 simple-obfs,那么配置文件范例如下:

1
2
3
4
5
6
7
8
9
10
11
12
{
"server":"0.0.0.0",
"server_port":9000,
"password":"password",
"timeout":300,
"method":"aes-256-gcm",
"fast_open":false,
"nameserver":"8.8.8.8",
"mode":"tcp_and_udp",
"plugin":"obfs-server",
"plugin_opts":"obfs=http"
}

配置文件里面所有选项的含义,可以参考这个链接

启动容器

在上面这个范例里,定义的端口是 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"server":"0.0.0.0",
"server_ipv6":"::",
"server_port":9000,
"local_address":"127.0.0.1",
"local_port":1080,
"password":"password",
"timeout":120,
"method":"none",
"protocol":"auth_chain_b",
"protocol_param":"",
"obfs":"http_simple",
"obfs_param":"",
"redirect":"",
"dns_ipv6":false,
"fast_open":false,
"workers":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/