我购买了一个最低配的阿里云ECS服务器,并安装好了git和docker,而后在本地实现Dockerfile和golang源代码,并将源码上传到github,而后再到ECS服务器经过git下载代码,并生成docker镜像,最后启动docker容器,场景图示以下:
git
总而言之,我要本身造一次轮子。github
golang的http包让搭建Web服务器比写一个hello world还简单:golang
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", home) http.ListenAndServe(":80", nil) } func home(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "welcome to yanzi travel") }
除去包声明、import语句以及函数头,这个Web服务器的实现实际只有3行代码。web
http.HandleFunc("/", home)
docker
这行语句的做用是未来自相似http://127.0.0.1:80/的请求路由到home函数。固然,你还能够注册其它的路由,好比:数据库
http.HandleFunc("/login", login)
apache
将http://127.0.0.1:80/login的请求路由到login函数。home和login函数的原型是:centos
func(ResponseWriter, *Request)
浏览器
第一个参数为Web服务器返回给客户端的数据,第二个参数则是来自客户端的请求数据。服务器
func home(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "welcome to yanzi travel") }
每次接收到http客户端的请求后,该函数简单地向客户端返回一行语句就当即退出。
http.ListenAndServe(":80", nil)
忽略地址意思是监听全部地址上的80端口,第二个参数一般为nil,http包会给它指定默认值DefaultServeMux。通过以上三步处理,一个最简单的Web服务器就搭建成功了,若是不须要在容器内运行,使用go build命令编译获得可执行文件server.bin:
go build -o server.bin main.go
而后启动server.bin,在浏览器内输入http://127.0.0.1:80就能够获得服务器返回的结果:
可是,咱们的目的是在docker容器内启动这个Web服务器,那要怎么作?请继续往下看。
实际上,若是只是为了单次部署,能够经过启动并进入docker容器,而后搭建相应的服务,最后保存到自定义镜像里便可。可是如今生成的镜像不可重现,由于单从镜像文件启动的容器信息很难反推当初本身作过什么环境搭建和服务部署了。Dcokerfile的好处是让这些过程变得透明,由于其中描述了镜像生成的全过程,以及容器启动的入口等。
FROM centos:7 MAINTAINER pirlo san <pirlo_san@163.com>
咱们会基于官方的centos7镜像搭建golang开发环境,而后使用golang实现一个Web服务器,并在容器内启动该服务。
MAINTAINER语句是指定这个镜像的做者。
# install gcc # -y means saying yes to all questions RUN yum install -y gcc # install golang RUN yum install -y go
由于golang可能依赖于gcc,所以须要先安装gcc
# config GOROOT ENV GOROOT /usr/lib/golang ENV PATH=$PATH:/usr/lib/golang/bin # config GOPATH RUN mkdir -p /root/gopath RUN mkdir -p /root/gopath/src RUN mkdir -p /root/gopath/pkg RUN mkdir -p /root/gopath/bin ENV GOPATH /root/gopath
GOROOT是golang的安装路径,GOPATH则是golang的开发包路径,其中包括src/pkg/bin三个子目录,分别用于存储golang源代码、golang编译生成的包,以及编译生成的可执行文件。除了设置GOROOT和GOPATH以外,还须要在操做系统的PATH变量内加入$GOROOT/bin,以让go工具能够被操做系统找到。
# copy source files RUN mkdir -p /root/gopath/src/server COPY src/* /root/gopath/src/server/
在GOPATH的src目录内建立server目录,并将本地src目录内的源文件所有拷贝进去。
# build the server WORKDIR /root/gopath/src/server RUN go build -o server.bin main.go
WORKDIR将容器的工做目录切换到server目录,而后执行go build编译获得可执行文件server.bin。
# startup the server CMD /root/gopath/src/server/server.bin
CMD指定容器启动后默认执行的程序,也就是咱们刚刚生成的Web服务器。
Dockerfile生成之后,就能够在Dockerfile所在目录执行以下命令生成最终镜像了,镜像名称为server,版本号为v0.1(注意最后的点哦):
docker build -t server:v0.1 .
终于到了启动容器的时候了,还有点小激动呢。
docker run -d -p 80:80 server:v0.1
-p参数的意思是将容器的80端口映射到本机的80端口,启动完成后使用docker ps能够看到咱们的容器被启动了:
[root@iZuf69cwe60vsy9pmo1e9iZ ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ae80a0b54134 server:v0.1 "/bin/sh -c /root/gop" About an hour ago Up About an hour 0.0.0.0:80->80/tcp compassionate_heisenberg
个人阿里云ECS服务器公网地址是101.132.163.20,在浏览器地址输入 http://101.132.163.20便可验证咱们的部署结果啦: