基于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服务器,这样即节省了购买正版软件的费用,而且还能够提高服务器的安全性. 之前我们介绍 ...
随机推荐
- hdu 2844 Coins 多重背包(模板) *
Coins Time Limit: 2000/1 ...
- 《即时消息技术剖析与实战》学习笔记4——IM系统如何保证消息的可靠性
IM 系统中,保证消息的可靠投递主要体现在两方面,一是消息的不丢失,二是消息的不重复. 一.消息不丢失 消息丢失的原因 首先看一下发送消息的流程,如下图所示: 消息.可以采取"时间戳比对&q ...
- 【Spring】 AOP Base
1. AOP概述 2. AOP的术语: 3. AOP底层原理 4. Spring 中的AOP 4.1 概述 4.2 分类 4.3 Spring的传统AOP 针对所有方法的增强:(不带有切点的切面) 带 ...
- 网页去重之Simhash算法
Simhash算法是Google应用在网页去重中的一个常用算法,在开始讲解Simhash之前,先了解——什么是网页去重?为什么要进行网页去重?如何进行网页去重,其基本框架是什么? 网页去重,顾名思 ...
- 【LeetCode】33-搜索旋转排序数组
题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这 ...
- Monte-Carlo Dropout
Monte-Carlo Dropout Monte-Carlo Dropout(蒙特卡罗 dropout),简称 MC dropout. 一种从贝叶斯理论出发的 Dropout 理解方式,将 Drop ...
- Spring Cloud官方文档中文版-声明式Rest客户端:Feign
官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#spring-cloud-feign 文中例子我做了一些测试在:http ...
- Spring Boot2 系列教程(五)Spring Boot中的 yaml 配置
搞 Spring Boot 的小伙伴都知道,Spring Boot 中的配置文件有两种格式,properties 或者 yaml,一般情况下,两者可以随意使用,选择自己顺手的就行了,那么这两者完全一样 ...
- DirectX12 3D 游戏开发与实战第四章内容(上)
Direct3D的初始化(上) 学习目标 了解Direct3D在3D编程中相对于硬件所扮演的角色 理解组件对象模型COM在Direct3D中的作用 掌握基础的图像学概念,例如2D图像的存储方式,页面翻 ...
- 面试官: 聊一聊Babel
点击关注本公众号获取文档最新更新,并可以领取配套于本指南的 <前端面试手册> 以及最标准的简历模板. 前言 Babel 是现代 JavaScript 语法转换器,几乎在任何现代前端项目中都 ...