介绍几款 Docker 镜像

技术 秋水逸冰 200949浏览 111评论

Docker 是一个开放源代码软件项目,让应用程序布署在软件容器下的工作可以自动化进行,借此在 Linux 操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。
Docker 利用 Linux 核心中的资源分脱机制,例如 cgroups,以及 Linux 核心名字空间(name space),来创建独立的软件容器(containers)。这可以在单一 Linux 实体下运作,避免启动一个虚拟机造成的额外负担。
简单概括起来就是,Docker 是个容器,什么都能往里塞,你也可以理解为是一个轻量化的虚拟机。
使用 Docker 的好处就是对当前系统的环境没有破坏性,基本上一款镜像可以跑在任意包含了 Docker 的机器上,可以说是十分方便了。
本文主要介绍一下我在学习 Docker 的过程中制作的几款镜像,以及使用方法。

安装并启动 Docker

操作系统内核大于等于 3.10 的都可以安装最新版 Docker,可以直接运行官方的安装脚本一键安装。
执行脚本方法如下:

wget -qO- get.docker.com | bash 


安装完成后,运行下面的命令,验证是否安装成功。

docker version 


启动 Docker

systemctl start docker 


查看 Docker 启动状态

systemctl status docker


允许 Docker 开机自启

systemctl enable docker 

Shadowsocks-libev Docker Image

基于官方 alpine:latest 镜像制作,编译安装最新版 shadowsocks-libev,simple-obfs 以及 v2ray-plugin 插件。
该容器在启动时依赖于读取宿主机里的配置文件,因此在启动该镜像时配合不同的 config 文件,就能开启任意个 Docker,也就是所谓的多端口。
把配置文件放在宿主机里,是基于这样的考量:随时在宿主机里修改配置的端口,密码,加密方式等信息,然后只需重启容器,无需再次创建新的容器。

支持的 Tags 及 Dockerfile

3.3.3, latest, alpine (Dockerfile)

拉取镜像

docker pull teddysun/shadowsocks-libev


创建 config 文件

比如在目录 /etc/shadowsocks-libev 下创建 config.json,完整路径也就是 /etc/shadowsocks-libev/config.json
范例内容如下:

{
    "server":"0.0.0.0",
    "server_port":9000,
    "password":"password0",
    "timeout":300,
    "method":"aes-256-gcm",
    "fast_open":true,
    "nameserver":"8.8.8.8",
    "mode":"tcp_and_udp"
}


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

{
    "server":"0.0.0.0",
    "server_port":9000,
    "password":"password0",
    "timeout":300,
    "method":"aes-256-gcm",
    "fast_open":true,
    "nameserver":"8.8.8.8",
    "mode":"tcp_and_udp",
    "plugin":"obfs-server",
    "plugin_opts":"obfs=tls"
} 


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

{
    "server":"0.0.0.0",
    "server_port":9000,
    "password":"password0",
    "timeout":300,
    "method":"aes-256-gcm",
    "fast_open":true,
    "nameserver":"8.8.8.8",
    "mode":"tcp_and_udp",
    "plugin":"v2ray-plugin",
    "plugin_opts":"server"
} 


配置文件里面所有选项的含义,可以参考这个链接
关于 v2ray-plugin 的更多配置可以参考这个链接

启动容器
在上面这个范例里,定义的端口是 9000,那么在启动容器时就需要将 9000 端口映射到宿主机的对外端口上。
启动命令:

docker run -d -p 9000:9000 -p 9000:9000/udp --name ss-libev --restart=always -v /etc/shadowsocks-libev:/etc/shadowsocks-libev teddysun/shadowsocks-libev 


docker run:开始运行一个容器。
-d 参数:容器以后台运行并输出容器 ID。
-p 参数:容器的 9000 端口映射到本机的 9000 端口。默认是映射 TCP,当需要映射 UDP 时,那就再追加一次 UDP 的映射。冒号后面是容器端口,冒号前面是宿主机端口,可以写成一致,也可以不一致。
–name 参数:给容器分配一个识别符,方便将来的启动,停止,删除等操作。
-v 参数:挂载卷(volume),冒号后面是容器的路径,冒号前面是宿主机的路径,可以写成一致,也可以不一致。
teddysun/shadowsocks-libev:这是拉取回来的镜像路径。

查看容器运行情况
利用如下命令可以查看所有已创建的 Docker 容器并显示容器的大小等信息:

docker ps -as 


停止容器
利用如下命令可以停止正在运行中的容器:

docker stop $name


此处的 $name 就是在启动容器那一步定义的容器的识别符,比如范例演示的 ss-libev

删除容器
容器停止后,可以利用如下命令删除容器:

docker rm $name


此处的 $name 就是在启动容器那一步定义的容器的识别符,比如范例的 ss-libev

启动容器
利用如下命令可以启动已经停止的容器:

docker start $name


此处的 $name 就是在启动容器那一步定义的容器的识别符,比如范例的 ss-libev

ShadowsocksR Docker Image

基于 python:3.7-alpine 镜像制作,安装的是 Github 上目前最新的版本
该容器在启动时依赖于读取宿主机里的配置文件,因此在启动该镜像时配合不同的 config 文件,就能开启任意个 Docker ,也就是所谓的多端口。
把配置文件放在宿主机里,是基于这样的考量:随时在宿主机里修改配置的端口,密码,加密方式等信息,然后只需重启容器,无需再次创建新的容器。

支持的 Tags 及 Dockerfile

3.2.2, alpine, latest (Dockerfile)

拉取镜像

docker pull teddysun/shadowsocks-r


创建 config 文件

比如在目录 /etc/shadowsocks-r 下创建 config.json,完整路径也就是 /etc/shadowsocks-r/config.json
范例内容如下:

{
    "server":"0.0.0.0",
    "server_ipv6":"::",
    "server_port":9000,
    "local_address":"127.0.0.1",
    "local_port":1080,
    "password":"password0",
    "timeout":120,
    "method":"aes-256-cfb",
    "protocol":"origin",
    "protocol_param":"",
    "obfs":"plain",
    "obfs_param":"",
    "redirect":"",
    "dns_ipv6":false,
    "fast_open":true,
    "workers":1
} 


ShadowsocksR 协议插件文档的含义,可以参考这个链接

启动容器

在上面这个范例里,定义的端口是 9000,那么在启动容器时就需要将 9000 端口映射到宿主机的对外端口上。
启动命令:

docker run -d -p 9000:9000 -p 9000:9000/udp --name ssr --restart=always -v /etc/shadowsocks-r:/etc/shadowsocks-r teddysun/shadowsocks-r 

L2TP/IPsec VPN Server Docker Image

本镜像支持 L2TP/IPsec PSK 和 IPSec Xauth PSK 两种连接方式。
基于 alpine:latest 镜像制作,使用了 alpine 自带的 libreswan-3.29 和 xl2tpd-1.3.15;
注意1:Android 版本小于或等于 7 时,建议选择 IPSec Xauth PSK (Cisco IPsec) 模式连接。如下图所示:

注意2:同一个 NAT 下多用户连接,请选择 IPSec Xauth PSK (Cisco IPsec) 模式连接。

该镜像在启动之前,需事先定义环境变量文件 /etc/l2tp.env,其内容具体参考以下的说明。
同时,该镜像具备自主管理用户的特点,一个简单命令即可增删改查用户账号。

支持的 Tags 及 Dockerfile

latest, alpine (Dockerfile)

拉取镜像

docker pull teddysun/l2tp


创建启动环境参数文件

比如是 /etc/l2tp.env,该文件内的各个变量定义如下:

VPN_IPSEC_PSK=teddysun.com
VPN_USER=vpnuser
VPN_PASSWORD=vpnpassword
VPN_PUBLIC_IP=
VPN_L2TP_NET=
VPN_L2TP_LOCAL=
VPN_L2TP_REMOTE=
VPN_XAUTH_NET=
VPN_XAUTH_REMOTE=
VPN_DNS1=
VPN_DNS2=
VPN_SHA2_TRUNCBUG=


VPN_IPSEC_PSK:预共享密钥
VPN_USER:默认的登录用户名
VPN_PASSWORD:默认的登录用户密码
VPN_PUBLIC_IP:指定公网 IP 地址,当你的 VPS 有多个公网 IP 时,可能需要手动指定一下
VPN_L2TP_NET:内网 L2TP 网段范围,默认为 192.168.18.0/24,一般此处留空即可
VPN_L2TP_LOCAL:内网 L2TP 网关 IP,默认为 192.168.18.1,一般此处留空即可
VPN_L2TP_REMOTE:内网 L2TP 网段分配给连接的 IP 段,默认为 192.168.18.10-192.168.18.250,一般此处留空即可
VPN_XAUTH_NET:内网 XAUTH 网段范围,默认为 192.168.20.0/24,一般此处留空即可
VPN_XAUTH_REMOTE:内网 XAUTH 网段分配给连接的 IP 段,默认为 192.168.20.10-192.168.20.250,一般此处留空即可
VPN_DNS1:默认 DNS 服务器,8.8.8.8,一般此处留空即可
VPN_DNS2:默认 DNS 服务器,8.8.4.4,一般此处留空即可
Android 6 和 7 用户:如果你遇到连接问题,请尝试在 /etc/ipsec.conf 中设置 sha2-truncbug=yes(默认为 no),你可以在 /etc/l2tp.env 文件中添加 VPN_SHA2_TRUNCBUG=yes,然后重新创建 Docker 容器。

启动容器

在这个范例里,需要将 500 和 4500 端口的 UDP 映射到宿主机的对外端口上。

启动命令:

docker run -d --privileged -p 500:500/udp -p 4500:4500/udp --name l2tp --restart=always --env-file /etc/l2tp.env -v /lib/modules:/lib/modules teddysun/l2tp


查看启动日志

docker logs l2tp

此处的 l2tp,是指在启动时定义的容器识别符,–name 参数后的名字。
输出的日志参考如下:

L2TP/IPsec VPN Server with the Username and Password is below: 
Server IP: Your Server public IP
IPSec PSK: IPSec PSK (pre-shared key)
Username : VPN username
Password : VPN password 
Redirecting to: /etc/init.d/ipsec start
Starting pluto IKE daemon for IPsec: Initializing NSS database 
xl2tpd[1]: Not looking for kernel SAref support.
xl2tpd[1]: Using l2tp kernel support.
xl2tpd[1]: xl2tpd version xl2tpd-1.3.15 started on 1d20eaecd9f2 PID:1
xl2tpd[1]: Written by Mark Spencer, Copyright (C) 1998, Adtran, Inc.
xl2tpd[1]: Forked by Scott Balmos and David Stipp, (C) 2001
xl2tpd[1]: Inherited by Jeff McAdams, (C) 2002
xl2tpd[1]: Forked again by Xelerance (www.xelerance.com) (C) 2006-2016
xl2tpd[1]: Listening on IP address 0.0.0.0, port 1701 


当然,你也可以查看一下 ipsec status 命令的输出,命令如下:

docker exec -it l2tp ipsec status

此处的 l2tp,是指在启动时定义的容器识别符,–name 参数后的名字。

管理 VPN 用户

列出全部用户及其密码

docker exec -it l2tp l2tpctl -l


新增一个用户

docker exec -it l2tp l2tpctl -a


删除一个用户

docker exec -it l2tp l2tpctl -d


修改一个用户的密码

docker exec -it l2tp l2tpctl -m


打印容器里 libreswan 和 xl2tpd 的版本信息

docker exec -it l2tp l2tpctl -v 


打印控制脚本 l2tpctl 的帮助信息

docker exec -it l2tp l2tpctl -h 


需要注意的是,容器一旦被删除重建,或者停止后重新启动,都会导致 VPN 用户信息的丢失,需要通过以上的命令再次创建。

Windows 10 下连接 L2TP VPN

首先,参考下图的设置,将 VPN 的连接信息稍微修改一下。

修改 VPN 属性,如图所示。

一般我们都是连接到家用路由器上的,也就是说,我们的网络一般都是处于 NAT 状态下,因此还需要改一下注册表,根据这个链接,修改注册表的信息,修改完成后,重启 Windows 即可。

参考链接

https://hub.docker.com/r/teddysun/shadowsocks-libev/
https://hub.docker.com/r/teddysun/shadowsocks-r/
https://hub.docker.com/r/teddysun/l2tp/

转载请注明:秋水逸冰 » 介绍几款 Docker 镜像

发表我的评论
取消评论

请输入正确答案后提交评论 *超出时限。 请再次填写验证码。

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (111)

  1. 补充:我在用的是Ubuntu 14 LTS。个人电脑上安装的,带gnome。
    发财5年前(2019-03-23)回复
  2. 请问秋水大佬,在ubuntu上docker是否有可视化的操作管理软件?(比如群晖上,可以通过可视化的程序搜索镜像,添加容器,编辑容器参数,启动/关闭容器。)不知道在Ubuntu上是否有类似的工具?
    发财5年前(2019-03-23)回复
  3. centos 7 更新后,ss-libev 镜像无法使用了,可否更新修复一下镜像?
    rainy5年前(2019-03-19)回复
    • 你只需要重新启动一下容器即可。 假设你的容器起名为 ss-libev,那么执行以下命令启动容器: docker start ss-libev
      秋水逸冰5年前(2019-03-21)回复
  4. 2019-02-03 20:25:11 INFO: UDP relay enabled 2019-02-03 20:25:11 INFO: initializing ciphers... chacha20 2019-02-03 20:25:11 INFO: This system doesn't provide enough entropy to quickly generate high-quality random numbers. Installing the rng-utils/rng-tools, jitterentropy or haveged packages may help. On virtualized Linux environments, also consider using virtio-rng. The service will not start until enough entropy has been collected. 2019-02-03 20:25:11 INFO: using nameserver: 8.8.8.8 2019-02-03 20:25:11 INFO: tcp server listening at 0.0.0.0:434 2019-02-03 20:25:11 INFO: udp server listening at 0.0.0.0:434 2019-02-03 20:25:11 ERROR: Could not change supplementary groups for user 'nobody'. 2019-02-03 20:25:11 ERROR: failed to switch user 版本 Client: Version: 18.09.1 API version: 1.39 Go version: go1.10.6 Git commit: 4c52b90 Built: Wed Jan 9 19:35:01 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 18.09.1 API version: 1.39 (minimum version 1.12) Go version: go1.10.6 Git commit: 4c52b90 Built: Wed Jan 9 19:06:30 2019 OS/Arch: linux/amd64 Experimental: false
    刘洋同学5年前(2019-02-04)回复
  5. 为了确保docker容器在异常退出或VPS开机之后自动重启,建议改成以如下方式启动容器(xxx为创建的容器名): docker create --restart=always --name xxx ... docker start xxx
    lalala5年前(2019-01-10)回复
  6. 这个好,把docker保存下来就可以完全离线安装了
    万年风暴5年前(2019-01-03)回复
  7. 大佬,我的是使用hyper-v搭建的虚拟机,虚拟机的IP是NAT,所在的宿主服务器有公网IP。请问用您的方法需要映射哪几个端口呢?(现在是几个镜像都安装成功,不过都是使用不了。从脚本那里跟过来的了…
    乐子5年前(2018-12-21)回复
  8. 最新版的teddysun/shadowsocks-libev启用AEAD加密连接ss-server异常退出 (255),同样的配置文件teddysun/shadowsocks-libev:alpine无此问题。
    lalala5年前(2018-12-17)回复
    • 同样的,teddysun/shadowsocks-r加密方式选择xchacha20连接ssserver异常退出(1),同样的配置文件teddysun/shadowsocks-r:alpine无此问题。
      lalala5年前(2018-12-18)回复
  9. docker update --restart=always 5583f861b586 操作后,才会重启VPS不会Docker不启动;建议增加此启动命令。另外目前测试开启443端口,只有docker pull teddysun/shadowsocks-libev可以实现翻墙,其余的都有问题,要么端口绑定失败,要么无法ping通端口。
    MxCen5年前(2018-12-11)回复
  10. docker pull teddysun/shadowsocks-libev 就只有这个设置为:443端口后可以实现,其余版本,设置443看着提示启动成功,但是扫描443端口为关闭状态,无法实现代理。且重启后不能自动启动,需要docker update --restart=always xxx后才可以实现重启VPS自动启动容器~需要大大更新修复下!
    MxCen5年前(2018-12-10)回复
  11. 请问vultr的$3.5刀的机器的性能足够使用这个docker吗?还是需要使用传统的方法安装?
    roger5年前(2018-12-04)回复
  12. 请问大佬,虽然已经允许 Docker 开机自启,但每次 vps(Debian9) 重启后,ss-libev并没有启动,要手动 docker start ss-libev,要如何解决呢?谢谢
    Jimmy5年前(2018-11-28)回复
  13. 我在用google的gcp上的cos(container-optimized os)跑这些docker,感觉还行。
    四点5年前(2018-11-27)回复
  14. 拉取镜像 docker pull teddysun/l2tp , 这个命令执行后报错:Error response from daemon: pull access denied for teddysun/12tp, repository does not exist or may require 'docker login' 怎么解决?不是很懂,可以相告吗?感谢@秋水逸冰
    Joss5年前(2018-11-26)回复
    • 试试ping google.io通不通
      万年风暴5年前(2019-01-03)回复
  15. 请问大佬,shadowsocks.log在哪里看呢?
    Jose5年前(2018-11-19)回复
    • Docker 镜像默认是不会记录 log 的,因此也就没有 shadowsocks.log 一说了。
      秋水逸冰5年前(2018-11-23)回复
    • docker logs 你的DOCKER名
      万年风暴5年前(2019-01-03)回复