问题导读:
1.什么Golang语言?
2.如何使用 Golang 编写一个简单的 HTTP 代理?
Golang语言简介
官网地址
Go语言是由Google开发的一个开源项目,具体语言特征就不细说了,可以查看一下文档。 学习使用了几天,想起了一句广告语: 简约而不简单。
一、前言:
使用 Golang 编写一个简单的 HTTP 代理goproxy 是一个轻量级的 HTTP 代理库,可以很容易的编写一个仅供 Docker 使用的代理程序 。 packagemain import ( "github.com/elazarl/goproxy" "net/http""regexp" ) func main() { proxy := goproxy.NewProxyHttpServer()proxy.OnRequest().DoFunc( func(r *http.Request, ctx *goproxy.ProxyCtx)(*http.Request, *http.Response) { match, _ :=regexp.MatchString("^*.docker.io$", r.URL.Host
二、使用 Golang 编写一个简单的 HTTP 代理
goproxy 是一个轻量级的 HTTP 代理库,可以很容易的编写一个仅供 Docker 使用的代理程序 。
- package main
-
- import (
- "github.com/elazarl/goproxy"
- "net/http"
- "regexp"
- )
-
- func main() {
- proxy := goproxy.NewProxyHttpServer()
- proxy.OnRequest().DoFunc(
- func(r *http.Request, ctx *goproxy.ProxyCtx) (*http.Request, *http.Response) {
- match, _ := regexp.MatchString("^*.docker.io[ DISCUZ_CODE_0 ]quot;, r.URL.Host)
- if match == false {
- return r, goproxy.NewResponse(r, goproxy.ContentTypeText, http.StatusForbidden,
- "The proxy is used exclusively to download docker image, please don't abuse it for any purpose.")
- } else {
- return r, nil
- }
- })
- proxy.Verbose = false
- http.ListenAndServe(":8384", proxy)
- }
复制代码
程序在每次 HTTP 的请求过程中都检测目标地址的 URL,如果不是 docker.io 或子站会返回一个错误信息。这为了避免使用代理访问其它的网站,致使服务器被墙。
三、编写 Ubuntu init.d 的启动脚本 为了保证服务在后台运行,编写 Ubuntu init.d 的启动脚本管理 Proxy 服务。 - #!/bin/sh
-
- ### BEGIN INIT INFO
- # Provides: dockboard.org
- # Required-Start: $syslog $remote_fs
- # Required-Stop: $syslog $remote_fs
- # Default-Start: 2 3 4 5
- # Default-Stop: 0 1 6
- # Short-Description: Create lightweight http proxy for Docker daemon.
- # Description:
- # Author: Meaglith Ma
- # Email: genedna@gmail.com
- # Website: http://www.dockboard.org
- ### END INIT INFO
-
- BASE=$(basename $0)
-
- DOCKER_PROXY=/usr/bin/$BASE
- DOCKER_PROXY_PIDFILE=/var/run/$BASE.pid
- DOCKER_PROXY_OPTS=
-
- PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
-
- # Check docker is present
- if [ ! -x $DOCKER_PROXY ]; then
- exit 1
- fi
-
- fail_unless_root() {
- if [ "$(id -u)" != '0' ]; then
- exit 1
- fi
- }
-
- case "$1" in
- start)
- fail_unless_root
- start-stop-daemon --start --background \
- --exec "$DOCKER_PROXY" \
- --pidfile "$DOCKER_PROXY_PIDFILE" \
- -- -d -p "$DOCKER_PROXY_PIDFILE" \
- $DOCKER_PROXY_OPTS
- ;;
-
- stop)
- fail_unless_root
- start-stop-daemon --stop \
- --pidfile "$DOCKER_PROXY_PIDFILE"
- log_end_msg $?
- ;;
-
- restart)
- fail_unless_root
- docker_pid=`cat "$DOCKER_PROXY_PIDFILE" 2>/dev/null`
- [ -n "$docker_pid" ] \
- && ps -p $docker_pid > /dev/null 2>&1 \
- && $0 stop
- $0 start
- ;;
-
- force-reload)
- fail_unless_root
- $0 restart
- ;;
-
- status)
- status_of_proc -p "$DOCKER_PROXY_PIDFILE" "$DOCKER" docker
- ;;
-
- *)
- echo "Usage: $0 {start|stop|restart|status}"
- exit 1
- ;;
- esac
-
- exit 0
复制代码
四、Ubuntu 中修改 Docker 的配置文件使用 HTTPProxy 修改 /etc/init/docker.conf 加入 http proxy 的环境变量。 - description "Docker daemon"
-
- start on filesystem and started lxc-net
- stop on runlevel [!2345]
-
- respawn
-
- env HTTP_PROXY="http://192.241.209.203:8384"
-
- script
- DOCKER=/usr/bin/$UPSTART_JOB
- DOCKER_OPTS=
- if [ -f /etc/default/$UPSTART_JOB ]; then
- . /etc/default/$UPSTART_JOB
- fi
- "$DOCKER" -d $DOCKER_OPTS
- end script
复制代码
或者是修改 /etc/default/docker 文件,取消注释 http_proxy 的部分。 - # If you need Docker to use an HTTP proxy, it can also be specified here.
- export http_proxy=http://192.241.209.203:8384/
复制代码
重启 Docker 的服务后下载 images 就会通过 192.241.209.203:8384 这个代理进行访问。
五、可用的代理地址如下: http://192.241.209.203:8384
目前 dockboard 为了方便国内用户使用和学习 docker 技术,使用 DigitalOcean 的 VPS 架设了一个代理。
六、更多内容:
1、《学习 go语言》 中文版
2、《go 编程导读》
3、golang windows 上安装
4、读者,还可以参考这里:Docker 中文社区
|