拉取alpine3.22镜像,进入容器终端,或使用虚拟机安装alpine3.22。
1. 前置操作
#更换国内镜像源
sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
#安装ssh服务端
apk add --no-cache openssh-server
#切换到ssh目录
cd /etc/ssh
#编辑设置允许root登录
vi sshd_config
找到 PermitRootLogin 取消注释,改为 PermitRootLogin yes,保存
#生成密钥
ssh-keygen -A
#启动ssh
/usr/sbin/sshd
完成后就可以使用root登录到ssh了。
如果你使用的是容器终端,则无须安装ssh,更换国内源即可。
2. 安装环境依赖。
apk add go cmake make
go env -w GOPROXY=https://goproxy.cn,direct
3. 下载源码,编译。
git clone sb源码。
cd到源码目录,直接执行make即可收获二进制文件。
如果使用的是容器,请先下载源码到宿主机,然后在宿主机终端使用 docker cp 源码路径 容器名称:容器路径,将源码拷贝到容器后再执行make
过程中出现请根据错误提示排查。
提取出编译好的二进制文件。
4. 制作dockerfile文件。(这一步开始可以使用任意linux系统,只需安装好docker即可。)
FROM alpine:3.22
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositoriesRUN mkdir /root/singbox
COPY alpine-sing-box /root/singbox/
WORKDIR /root/singbox
RUN chmod +x /root/singbox/alpine-sing-box
EXPOSE 10984/tcp 10984/udp
EXPOSE 10985/tcp 10985/udp
EXPOSE 9099/tcp
ENTRYPOINT ["/root/singbox/alpine-sing-box", "run", "-c", "/root/singbox/config/config.json"]
可以直接使用我这个dockerfile。
将编译出来的sb二进制文件与dockerfile文件放在同一目录。
5. 构建docker镜像。
进入终端,执行:docker build . -t 镜像名:tag。
如:docker build . -t sb:1.0
过程中报错请自行检查,使用上方提供的dockerfile按步骤来不会报错。
6. docker镜像打标上传到仓库。
- docker login #登录自己的docker账户,输入用户名与密码,提示successful即可。
- docker images #查看刚刚构建的镜像TAG ID,复制。
- docker tag TAGID 用户名/仓库名:tag #这一步需要先到docker上自己的仓库里创建一个新仓库,tag可以根据自己喜欢设置。执行完后会出新一个新的镜像。
- docker push 用户名/仓库名:tag #这一步需要根据上一步创建的填写正确,不清除可以再使用docker images查看。
等待执行完毕镜像就上传到自己的仓库里了。
后续拉取镜像可以使用 docker pull 用户名/仓库名:tag
7. 使用docker-compose.yml运行镜像
任意目录新建 docker-compose.yml 编辑,粘贴如下内容:
services:
sb:
container_name: s-b
image: 用户名/仓库名:tag
# build: .
hostname: sb-host
ports:
- "10984:10984"
- "10985:10985"
- "9099:9099"
volumes:
- /etc/sbconfig:/root/singbox/config
networks:
- sb
restart: 'unless-stopped'
networks:
sb:
driver: bridge
name: sb-network
volumes需要注意,/etc/sbconfig改为你sb配置文件所在目录的路径。
修改完毕后保存,执行 docker compose up -d 容器就在后台启动了。
如果你不想用alpine来当镜像而是使用debian或者ubuntu等其他镜像请忽略第一步,然后第四步第一行代码改为对应系统,第二步需要更改命令为对应系统。