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服务器的更多相关文章

  1. golang搭建web服务器

    一个最简单的golang web服务器 package main import ( "net/http" "fmt" ) func sayHelloWorld( ...

  2. 轻松使用Nginx搭建web服务器

    如果读者以前做过web开发的话,就应该知道如何去搭建一个web服务器来跑你的web站点,在windows下你可能会选择去用IIS,十分的快捷,在linux下,你可能首先会想到apache,“一哥”( ...

  3. Android手机用KSWEB搭建Web服务器成功安装WordPress

    之前部落分享的几个免费Web服务器软件都是用来安装在本地电脑上,搭建Apache.PhpMyAdmin.MySQL等网站运行环境,然后我们就可以在电脑上测试运行Wordpress.Discuz! 论坛 ...

  4. centos7 搭建WEB服务器

    centos7 搭建WEB服务器 2017年09月17日 09:44:50 逝然1994 阅读数:18321 标签: centosapacheweb服务器 更多 个人分类: centos服务器简单配置 ...

  5. 记录一些服务端术语和搭建web服务器

    菜单快捷导航 服务端常用术语 搭建web服务器和配置虚拟主机 记录一些服务端方面的常用术语 1.CS架构和BS架构 1.1 CS架构 CS(Client/Server),基于安装包类型的桌面或手机软件 ...

  6. 在Win7系统中搭建Web服务器

    局 域网Web服务器的主要功能是实现资源共享,同时借助于局域网服务器访问页面可有效的实现信息的同步.利用Web服务器,我们随时随地都可以将自己的信息 上传到服务器端,让其它关注你的用户能在第一时间内了 ...

  7. 用tomcat搭建web服务器

    链接地址:http://www.blogjava.net/qingshow/archive/2010/01/17/309846.html qingshow “不积跬步无以至千里,不积小流无以成江海”. ...

  8. NodeMCU入门(4):搭建Web服务器,配置网络连接

    准备工作 1.NodeMCU模块 2.ESPlorer v0.2.0-rc6 3.NodeMCU-HTTP-Server 搭建web服务器 下载https://github.com/wangzexi/ ...

  9. CentOS 6.2下搭建Web服务器

    1Centos 6.2下搭建web服务器 如今,Linux在Web应用越来越广,许多企业都采用Linux来搭建Web服务器,这样即节省了购买正版软件的费用,而且还能够提高服务器的安全性. 之前我们介绍 ...

随机推荐

  1. CF - 652F Ants on a Circle

    题目传送门 题解: 先观察蚂蚁相撞, 可以发现, 如果我们将相撞的2个蚂蚁互换位置的话,蚂蚁相当于没有碰撞体积,直接穿过去了.所以我们可以直接计算出最终哪些位置上会有蚂蚁. 接下来就需要知道蚂蚁们的最 ...

  2. Photon Server 服务端编程

    Photon Server 和 Unity3D 数据交互: Photon Server 服务端编程 Unity3D 客户端编程 VS2017 之 MYSQL实体数据模 一:Photon Server的 ...

  3. asp.net core系列 72 Exceptionless使用介绍

    一.Exceptionless介绍 Exceptionless专注于.net平台提供实时错误和日志报告.主要包括:错误通知.智能分组异常.详细错误报告堆栈跟踪.支持离线.UI查看重要错误和确定优先级. ...

  4. JavaScript new的运行过程

    参考 MDN网站的运算符 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new new 运算符 ...

  5. Spring 两大核心 IOC 和 AOP

    如果你的简历上写着Spring (请详述一下spring的两大核心)这个问题一定会被问到. 一.什么叫IOC 1. IOC 全称(Inversion of Control)-- 控制反转. IOC 只 ...

  6. WordCount2.2

    说明: 合作者:201631062507  201631062526(学号) 代码地址:https://gitee.com/WordCountMC/WordCountTeam 本次作业链接:https ...

  7. Windows10 系统更新之后找不到输入法

    是因为 , 系统更新之后 , 系统自带的输入法没有更新好 , 过个一两天,系统会自动修复. 简单解决办法是 , Ctrl+Alt+delete 打开任务管理器, 在进程中,按CPU大小排序,找到输入法 ...

  8. Null is your firend, not a mistake

    原文作者: Roman Elizarov 原文地址: Null is your firend, not a mistake 译者:秉心说 Kotlin Island from Wikimedia by ...

  9. Tomcat类加载器体系结构

    <深入理解java虚拟机>——Tomcat类加载器体系结构 标签: java / 虚拟机 / tomcat Tomcat 等主流Web服务器为了实现下面的基本功能,都实现了不止一个自定义的 ...

  10. java反射机制,以及对反射机制的了解

    反射是什么?反射有什么用?我相信大家在开始学的时候都会有疑惑,直到如今我学的还不够深入只能简单的说说反射的作用,理论的我也听得很迷糊,接下来我就以几个例子来 写写反射的用处: 494696003群,有 ...