基于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服务器,这样即节省了购买正版软件的费用,而且还能够提高服务器的安全性. 之前我们介绍 ...
随机推荐
- 基于.net EF6 MVC5+WEB Api 的Web系统框架总结(3)-项目依赖注入
简介 依赖注入主要是一种结构性的模式,注重的是类与类之间的结构,它要达到的目的就是设计原则中最少知道和合成复用的原则,减少内部依赖,履行单一职责,最终就是强解耦.依赖注入目前最好的实现就是依赖注入容器 ...
- 5分钟理解 SpringBoot 响应式的核心-Reactor
目录 一.前言 二. Mono 与 Flux 构造器 三. 流计算 1. 缓冲 2. 过滤/提取 3. 转换 4. 合并 5. 合流 6. 累积 四.异常处理 五.线程调度 小结 参考阅读 一.前言 ...
- Go第三方日志库logrus
日志是程序中必不可少的一个环节,由于Go语言内置的日志库功能比较简洁,我们在实际开发中通常会选择使用第三方的日志库来进行开发.本文介绍了logrus这个日志库的基本使用. logrus介绍 Logru ...
- 049 模块6-wordcloud库的使用
目录 一.wordcloud库基本介绍 1.1 wordcloud库概述 1.2 wordcloud库的安装 二.wordcloud库使用说明 2.1 wordcloud库基本使用 2.2 wordc ...
- Java的初始化块及执行过程详解
问题:Java对象初始化方式主要有哪几种?分别是什么?针对上面的问题,想必大家脑海中首先浮现出的答案是构造器,没错,构造器是Java中常用的对象初始化方式. 还有一种与构造器作用非常相似的是初始化块, ...
- Net基础篇_学习笔记_第十一天_面向对象(构造函数)
VS封装字段快捷键: 提取方法 Ctrl+R,M 封装字段 Ctrl+R,E 提取接口 Ctrl+R,I. 构成函数: public Student() { Con ...
- SSM整合activiti框架
一:WorkFlow简介 1:什么是工作流工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”.是对工作流程及其各操作步骤之间业务规则的抽象.概括描述.在计算机中,工作流属 ...
- Servlet接口的实现
Servlet接口对Servlet进行了规范,定义了方法的主要范围. 1.public void init(ServletConfig servletConfig) (初始化) 参数的作用: (1)调 ...
- go语言 链表练习
package main import "fmt" //定义节点 type Node struct { Data int Next *Node } /* * 返回第一个节点 * h ...
- Vue学习之todolist删除功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...