在树莓派用Docker部署<SS>服务器

非敏感词版本: https://outgoing-muenster-d9f.notion.site/Docker-6a46bbd360594eb893972abf774b515a

近日折腾了了一下在树莓派上用Docker部署<SS>服务器,踩了一些坑,也记录一下解决办法,希望能帮助有需要的朋友。

安装Docker

由于我的树莓派用的是自带的Raspbian系统,属于Debian系列,因此要安装Docker并不复杂,只需要按照官方文档操作。

https://docs.docker.com/engine/install/debian/

文档提到了几种方法,最简单的也是我采用的是Install using the repository,其中分成两个步骤:

1. Set up the repository

按官方文档依次运行以下命令即可:

sudo apt-get update
sudo apt-get install \
   ca-certificates \
   curl \
   gnupg \
   lsb-release
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

这一步的目的是生成/etc/apt/sources.list.d/docker.list,为之后的apt-get命令提供仓库地址。

由于我之前瞎折腾,不小心用了ubuntu的版本,因此之后一直报错显示找不到docker-ce这个package。解决方法是删掉/etc/apt/sources.list.d/docker.list重新生成一次即可。

2. Install Docker Engine

只需要用apt-get安装docker相关的软件即可,命令行如下:

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

3. 验证

安装完成后可以运行以下命令验证是否成功:

sudo docker run hello-world

成功的话应该能输出“Hello from Docker!” 和一些其他说明(不重要)。

部署<SS>

<SS>有几个不同的版本,分别是不同的语言实现的。这里有一个个版本的比较

https://github.com/<SS>/<SS>/wiki/Feature-Comparison-across-Different-Versions

这里我选择的是libev版本,Git仓库地址:https://github.com/<SS>/<SS>-libev

官方文档提供了几种安装方式,其中包含使用Docker:https://github.com/<SS>/<SS>-libev#docker

但由于树莓派的系统架构属于/linux/arm/v7,libev官方Docker镜像只有linux/amd64和linux/arm64,因此直接pull官方镜像下来并不能运行,我们需要自己build一个镜像。

首先我们把libev镜像拉取到本地:

git clone https://github.com/<SS>/<SS>-libev.git

虽然libev在路径./docker/alpine/里提供了Dockerfile,但直接编译会遇到错误(其中ss-libev是自己起的镜像名):

sudo docker build -f ./docker/alpine/Dockerfile -t ss-libev .
+ apk add --no-cache --virtual .build-deps autoconf automake build-base c-ares-dev libcap libev-dev libtool libsodium-dev linux-headers mbedtls-dev pcre-dev
fetch https://dl-cdn.alpinelinux.org/alpine/v3.15/main/armv7/APKINDEX.tar.gz
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.15/main: temporary error (try again later)
fetch https://dl-cdn.alpinelinux.org/alpine/v3.15/community/armv7/APKINDEX.tar.gz
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.15/community: temporary error (try again later)
ERROR: unable to select packages:
  autoconf (no such package):
    required by: .build-deps-19700101.000000[autoconf]
  automake (no such package):
    required by: .build-deps-19700101.000000[automake]
  build-base (no such package):
    required by: .build-deps-19700101.000000[build-base]
  c-ares-dev (no such package):
    required by: .build-deps-19700101.000000[c-ares-dev]
  libcap (no such package):
    required by: .build-deps-19700101.000000[libcap]
  libev-dev (no such package):
    required by: .build-deps-19700101.000000[libev-dev]
  libtool (no such package):
    required by: .build-deps-19700101.000000[libtool]
  libsodium-dev (no such package):
    required by: .build-deps-19700101.000000[libsodium-dev]
  linux-headers (no such package):
    required by: .build-deps-19700101.000000[linux-headers]
  mbedtls-dev (no such package):
    required by: .build-deps-19700101.000000[mbedtls-dev]
  pcre-dev (no such package):
    required by: .build-deps-19700101.000000[pcre-dev]
The command '/bin/sh -c set -ex  && apk add --no-cache --virtual .build-deps       autoconf       automake       build-base       c-ares-dev       libcap       libev-dev       libtool       libsodium-dev       linux-headers       mbedtls-dev       pcre-dev  && cd /tmp/repo  && ./autogen.sh  && ./configure --prefix=/usr --disable-documentation  && make install  && ls /usr/bin/ss-* | xargs -n1 setcap cap_net_bind_service+ep  && apk del .build-deps  && apk add --no-cache       ca-certificates       rng-tools       tzdata       $(scanelf --needed --nobanner /usr/bin/ss-*       | awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }'       | sort -u)  && rm -rf /tmp/repo' returned a non-zero code: 12

这个错误是因为alpine3.13及以后的版本在树莓派上有莫名其妙的bug,表现为没有网络连接,且系统时间是乱的。可以看这里了解详细内容。

要解决这个问题,只需要在Dockerfile里指定一下alpine为3.12版本,把"FROM alpine"改为:

FROM alpine:3.12

保存之后重新build一下镜像:

sudo docker build -f ./docker/alpine/Dockerfile -t ss-libev .

成功之后我们可以查看一下镜像:

pi@raspberrypi:~/repo/<SS>-libev $ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
ss-libev     latest    ed5bde0531e6   5 minutes ago   30.9MB
alpine       3.12      ad303560139e   12 days ago     3.78MB

一切顺利的话我们就可以把服务器起起来了:

docker run -e PASSWORD=test -p 8388:8388 -p 8388:8388/udp -d --restart always ss-libev:latest

注意默认的加密算法是aes-256-gcm。更多的用法可以在docker/alpine/README.md找到。

posted @ 2022-04-17 11:39  Seraph2012  阅读(477)  评论(0编辑  收藏  举报