基于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服务器,这样即节省了购买正版软件的费用,而且还能够提高服务器的安全性. 之前我们介绍 ...
随机推荐
- 接口请求失败处理,重新请求并限制请求次数.自己封装搞定retry函数
最近开发一款小程序的时候想到一个问题,如果接口突然挂掉怎么办呢,于是乎想到一个解决办法.接口请求重试功能.并限制请求次数 用最新的async函数语法实现.代码简洁明了. 测试代码如下: functio ...
- JSP内置对象(一)
一.out对象out对象是JspWriter类的实例,是向客户端输出内容常用的对象1.void println() out的println()方法,向客户端打印字符串 2. void clear() ...
- CSS3 03. 3D变换、坐标系、透视perspective、transformZ、transform-style添加3D效果、backface-visibility元素背面可见、动画animation、@keyfarmes、多列布局
1.左手坐标系 伸出左手,让拇指和食指成“L”形,大拇指向右,食指向上,中指指向前方.这样我们就建立了一个左手坐标系,拇指.食指和中指分别代表X.Y.Z轴的正方向.如下图 CSS中的3D坐标系 CSS ...
- mybatis转义
SELECT * FROM test WHERE 1 = 1 AND start_date <= CURRENT_DATE AND end_date >= CURRENT_DATE 在执行 ...
- Django+Nginx概念安装和使用–使用Django建立你的第一个网站
一 前记 最近在使用Django倒腾属于自己的网站,由于以前没有接触过多少这类信息,所以,很多东西都是从零开始学习的.在参考网上的资料时候,发现很多对这方面记录的,很多人都写的不是很清楚,也许我这个新 ...
- java多线程之创建线程的4种方式及Future
Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例.Java可以用四种方式来创建线程: 继承Thread创建线程 实现Runnable接口创建线程 实现callab ...
- [Vue 牛刀小试]:第十七章 - 优化 Vue CLI 3 构建的前端项目模板(1)- 基础项目模板介绍
一.前言 在上一章中,我们开始通过 Vue CLI 去搭建属于自己的前端 Vue 项目模板,就像我们 .NET 程序员在使用 asp.net core 时一样,我们更多的会在框架基础上按照自己的开发习 ...
- GO 语言学习笔记--数组切片篇
1.对于make 数组切片,长度和容量需要理解清楚: 容量表示底层数组的大小,长度是你可以使用的大小: 容量的用处在哪?在与当你用 appen d扩展长度时,如果新的长度小于容量,不会更换底层数组,否 ...
- Java中的java.lang.Class API 详解
且将新火试新茶,诗酒趁年华. 概述 Class是一个位于java.lang包下面的一个类,在Java中每个类实例都有对应的Class对象.类对象是由Java虚拟机(JVM)自动构造的. Class类的 ...
- .Net基础篇_学习笔记_第五天_流程控制do-while循环
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...