Docker实战之Shadowsocks构建
本文假设你的系统里面 docker-engine 已经装好,具体安装过程请参考这一篇:Docker安装备忘。
下面仍然以 shadowsocks-go1 为例,看怎么写 Dockerfile 来快速构建运行环境。
𝟙 撰写 Dockerfile
FROM buildpack-deps:jessie-scm
# gcc for cgo
RUN apt-get update && apt-get install -y \
gcc libc6-dev make \
--no-install-recommends \
&& rm -rf /var/lib/apt/lists/*
ENV GOLANG_VERSION 1.5.1
ENV GOLANG_DOWNLOAD_URL https://golang.org/dl/go$GOLANG_VERSION.linux-amd64.tar.gz
ENV GOLANG_DOWNLOAD_SHA1 46eecd290d8803887dec718c691cc243f2175fe0
RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz \
&& echo "$GOLANG_DOWNLOAD_SHA1 golang.tar.gz" | sha1sum -c - \
&& tar -C /usr/local -xzf golang.tar.gz \
&& rm golang.tar.gz
ENV GOPATH /go
ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH
RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH"
WORKDIR $GOPATH
COPY go-wrapper /usr/local/bin/
RUN go get -u -v github.com/shadowsocks/shadowsocks-go/cmd/shadowsocks-server
- Dockerfile 必须从 FROM 开始,表示基于的镜像名称,本例中为构建 golang 的安装依赖。
- RUN 指令指明了在当前镜像上执行指令,并提交为新的镜像;ENV 指令则用于设置镜像的环境变量。上面做的事情就其实很简单了:安装编译 go 必须的基础依赖 ➙ 设置 go 环境变量➙ 下载解压 ➙ 设定
GOPATH
。 - WORKDIR 指令为其他指令指定工作目录,COPY 指令会把本机文件(夹)拷贝到镜像指定位置,这里做的事情就是把工作目录切换到
GOPATH
,并拷贝go-wrapper
2 脚本到/usr/local/bin
目录下。 - 运行 go get 获取 shadowsocks-server。
𝟚 构建镜像
Dockerfile 写好以后,就可以 build 它了,假设 Dockerfile 放在目录 ssgo 下:
$ sudo docker build ssgo
构建成功以后,看一下:
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
<none> <none> acab4cbd1432 51 seconds ago 663.8 MB
buildpack-deps jessie-scm 20b348f4d568 2 days ago 291.8 MB
给你新构建的镜像打一个 tag:
$ docker tag acab4cbd1432 zturn/ssgo:latest
下面就可以检查一下镜像里面的 go 是否正常了:
$ docker run zturn/ssgo go version
go version go1.5.1 linux/amd64
go 正常了,那么通过 go get 安装的 shadowsocks-server 也应该是正常的:
$ docker run zturn/ssgo shadowsocks-server -h
Usage of shadowsocks-server:
-c string
specify config file (default "config.json")
-core int
maximum number of CPU cores to use, default is determinied by Go runtime
-d print debug message
-k string
password
-m string
encryption method, default: aes-256-cfb
-p int
server port
-t int
timeout in seconds (default 300)
-version
print version
𝟛 推送到 DockerHub
$ docker login --username={your_name} --password={your_password} --email={your_email}
正常登录以后,就可以
$ docker push zturn/ssgo
等它推送成功就可以了。
𝟜 在 VPS 上启用基于 docker 的 shadowsocks-server
上面三步都可以在本机操作,server 则必然在 vps 上启动的:
$ docker pull zturn/ssgo
成功以后,用 docker 启动 shadowsocks-server:
$ docker run -p 8089:8089 zturn/ssgo shadowsocks-server -d -k {your_ss_server_passwd} -m aes-128-cfb -p 8089
在这里一定要注意这一点: docker run -p 参数指定容器的端口映射。
这条命令可以拆开成两部分看:
- shadowsocks-server -d -k {your_ss_server_passwd} -m aes-128-cfb -p 8089
- docker run -p 8089:8089 zturn/ssgo {docker_container_env_cmd}
命令 1 中是指明了在 docker 容器里面使用 shadowsocks-server 在容器内端口 8089 提供服务; 命令 2 则是告诉 docker 在运行时,将容器的8089端口映射到本机实际的8089端口对外提供服务
这些都做好以后,你的 shadowsocks client 就可以通过连接你的这个 vps_ip:8089 来进行安全上网了。
我的这个镜像已经放到了 DockerHub 上(zturn/ssgo),有兴趣的朋友可以自行尝试 :)
-
之所以选择 shadowsocks 作例子,还是因为“安全”上网,你懂得。。。 ↩