基于Docker和Golang搭建Web服务器
1 场景描述
- 基于centos7的docker镜像搭建golang开发环境
- 在docker容器内,使用golang实现一个Web服务器
- 启动docker容器,并在容器内启动Web服务器
我购买了一个最低配的阿里云ECS服务器,并安装好了git和docker,然后在本地实现Dockerfile和golang源代码,并将源码上传到github,然后再到ECS服务器通过git下载代码,并生成docker镜像,最后启动docker容器,场景图示如下:
2 你可能会问
- 为什么不直接使用apache或其它http镜像搭建Web服务器,而是自己实现Web服务?
因为我要自己使用golang实现一个Web服务器,搭建服务器不是目的,练习golang和docker才是目的。 - 为什么不直接使用golang镜像,而是自己搭建golang开发环境 ?
因为我要部署自己的Web服务器,除了golang,我可能还需要其它操作系统服务,比如数据库等。
总而言之,我要自己造一次轮子。
3 搭建过程
3.1 使用golang实现一个简易Web服务器
golang的http包让搭建Web服务器比写一个hello world还简单:
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行代码。
3.1.1 注册路由
http.HandleFunc("/", home)
这行语句的作用是将来自类似http://127.0.0.1:80/的请求路由到home函数。当然,你还可以注册其它的路由,比如:
http.HandleFunc("/login", login)
将http://127.0.0.1:80/login的请求路由到login函数。home和login函数的原型是:
func(ResponseWriter, *Request)
第一个参数为Web服务器返回给客户端的数据,第二个参数则是来自客户端的请求数据。
3.1.2 实现handler
func home(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "welcome to yanzi travel")
}
每次接收到http客户端的请求后,该函数简单地向客户端返回一行语句就立即退出。
3.1.3 监听80端口
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服务器,那要怎么做?请继续往下看。
3.2 编写Dockerfile
实际上,如果只是为了单次部署,可以通过启动并进入docker容器,然后搭建相应的服务,最后保存到自定义镜像里即可。但是如此生成的镜像不可重现,因为单从镜像文件启动的容器信息很难反推当初自己做过什么环境搭建和服务部署了。Dcokerfile的好处是让这些过程变得透明,因为其中描述了镜像生成的全过程,以及容器启动的入口等。
3.2.1 指定基础镜像
FROM centos:7 MAINTAINER pirlo san <pirlo_san@163.com>
我们会基于官方的centos7镜像搭建golang开发环境,然后使用golang实现一个Web服务器,并在容器内启动该服务。
MAINTAINER语句是指定这个镜像的作者。
3.2.2 安装goalng开发环境
# install gcc
# -y means saying yes to all questions
RUN yum install -y gcc # install golang
RUN yum install -y go
因为golang可能依赖于gcc,因此需要先安装gcc
3.2.3 配置golang环境变量
# 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工具可以被操作系统找到。
3.2.4 拷贝golang源代码
# copy source files
RUN mkdir -p /root/gopath/src/server
COPY src/* /root/gopath/src/server/
在GOPATH的src目录内创建server目录,并将本地src目录内的源文件全部拷贝进去。
3.2.5 编译Web服务器
# build the server
WORKDIR /root/gopath/src/server
RUN go build -o server.bin main.go
WORKDIR将容器的工作目录切换到server目录,然后执行go build编译得到可执行文件server.bin。
3.2.6 指定容器入口
# startup the server
CMD /root/gopath/src/server/server.bin
CMD指定容器启动后默认执行的程序,也就是我们刚刚生成的Web服务器。
3.3 生成镜像
Dockerfile生成以后,就可以在Dockerfile所在目录执行如下命令生成最终镜像了,镜像名称为server,版本号为v0.1(注意最后的点哦):
docker build -t server:v0.1 .
3.4 启动容器
终于到了启动容器的时候了,还有点小激动呢。
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
4 客户端访问
我的阿里云ECS服务器公网地址是101.132.163.20,在浏览器地址输入 http://101.132.163.20即可验证我们的部署结果啦:
基于Docker和Golang搭建Web服务器的更多相关文章
- golang搭建web服务器
一个最简单的golang web服务器 package main import ( "net/http" "fmt" ) func sayHelloWorld( ...
- 轻松使用Nginx搭建web服务器
如果读者以前做过web开发的话,就应该知道如何去搭建一个web服务器来跑你的web站点,在windows下你可能会选择去用IIS,十分的快捷,在linux下,你可能首先会想到apache,“一哥”( ...
- Android手机用KSWEB搭建Web服务器成功安装WordPress
之前部落分享的几个免费Web服务器软件都是用来安装在本地电脑上,搭建Apache.PhpMyAdmin.MySQL等网站运行环境,然后我们就可以在电脑上测试运行Wordpress.Discuz! 论坛 ...
- centos7 搭建WEB服务器
centos7 搭建WEB服务器 2017年09月17日 09:44:50 逝然1994 阅读数:18321 标签: centosapacheweb服务器 更多 个人分类: centos服务器简单配置 ...
- 记录一些服务端术语和搭建web服务器
菜单快捷导航 服务端常用术语 搭建web服务器和配置虚拟主机 记录一些服务端方面的常用术语 1.CS架构和BS架构 1.1 CS架构 CS(Client/Server),基于安装包类型的桌面或手机软件 ...
- 在Win7系统中搭建Web服务器
局 域网Web服务器的主要功能是实现资源共享,同时借助于局域网服务器访问页面可有效的实现信息的同步.利用Web服务器,我们随时随地都可以将自己的信息 上传到服务器端,让其它关注你的用户能在第一时间内了 ...
- 用tomcat搭建web服务器
链接地址:http://www.blogjava.net/qingshow/archive/2010/01/17/309846.html qingshow “不积跬步无以至千里,不积小流无以成江海”. ...
- NodeMCU入门(4):搭建Web服务器,配置网络连接
准备工作 1.NodeMCU模块 2.ESPlorer v0.2.0-rc6 3.NodeMCU-HTTP-Server 搭建web服务器 下载https://github.com/wangzexi/ ...
- CentOS 6.2下搭建Web服务器
1Centos 6.2下搭建web服务器 如今,Linux在Web应用越来越广,许多企业都采用Linux来搭建Web服务器,这样即节省了购买正版软件的费用,而且还能够提高服务器的安全性. 之前我们介绍 ...
随机推荐
- codeforces 735C. Tennis Championship(贪心)
题目链接 http://codeforces.com/contest/735/problem/C 题意:给你一个数n表示有几个人比赛问最多能赢几局,要求两个比赛的人得分不能相差超过1即得分为2的只能和 ...
- CSU 1803 2016 湖南省2016省赛
1803: 2016 Submit Page Summary Time Limit: 5 Sec Memory Limit: 128 Mb Submitted: 1416 ...
- codeforces 486 D. Valid Sets(树形dp)
题目链接:http://codeforces.com/contest/486/problem/D 题意:给出n个点,还有n-1条边的信息,问这些点共能构成几棵满足要求的树,构成树的条件是. 1)首先这 ...
- C#开发BIMFACE系列24 服务端API之获取模型数据9:获取单个房间信息
系列目录 [已更新最新开发文章,点击查看详细] 大厦建筑模型中,基本上包含多个楼层,每个楼层包含多个房间等信息.在<C#开发BIMFACE系列21 服务端API之获取模型数据6:获取单模 ...
- hbase读取快照数据-lzo压缩遇到的问题
1.读取hbase快照数据时报UnsatisfiedLinkError: no gplcompression in java.library.path错: 2019-09-04 17:36:07,44 ...
- fastjson使用-- @JSONField使用(转)
@JSONField可以配置到字段和方法上,那不同的配置有什么不同呢?下面我们就来看看具体配置到不同的方法上. 我们在创建实体类的时候,都要求属性必须创建get和set方法,否则fastjson将不会 ...
- Net基础篇_学习笔记_第十一天_面向对象(构造函数)
VS封装字段快捷键: 提取方法 Ctrl+R,M 封装字段 Ctrl+R,E 提取接口 Ctrl+R,I. 构成函数: public Student() { Con ...
- 使用JAVA API获取hadoop集群的FileSystem
所需要配置的参数: Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs ...
- python+selenium十:selenium的二次封装
python+selenium十:基于原生selenium的二次封装 from selenium import webdriverfrom selenium.webdriver.support.w ...
- Phpstudy被暴存在隐藏后门-检查方法
Phpstudy被暴存在隐藏后门-检查方法 一.事件背景 Phpstudy软件是国内的一款免费的PHP调试环境的程序集成包,通过集成Apache.PHP.MySQL.phpMyAdmin.ZendOp ...