基於Docker和Golang搭建Web伺服器

2021-09-11 02:02:57 字數 3887 閱讀 8959

總而言之,我要自己造一次輪子。

golang的http包讓搭建web伺服器比寫乙個hello world還簡單:

除去包宣告、import語句以及函式頭,這個web伺服器的實現實際只有3行**。

這行語句的作用是將來自類似的請求路由到home函式。當然,你還可以註冊其它的路由,比如:

將login的請求路由到login函式。home和login函式的原型是:

func(responsewriter, *request)

第乙個引數為web伺服器返回給客戶端的資料,第二個引數則是來自客戶端的請求資料。

每次接收到http客戶端的請求後,該函式簡單地向客戶端返回一行語句就立即退出。

忽略位址意思是監聽所有位址上的80埠,第二個引數通常為nil,http包會給它指定預設值defaultservemux。經過以上三步處理,乙個最簡單的web伺服器就搭建成功了,如果不需要在容器內執行,使用go build命令編譯得到可執行檔案server.bin:

go build -o server.bin main.go

然後啟動server.bin,在瀏覽器內輸入就可以得到伺服器返回的結果:

但是,我們的目的是在docker容器內啟動這個web伺服器,那要怎麼做?請繼續往下看。

實際上,如果只是為了單次部署,可以通過啟動並進入docker容器,然後搭建相應的服務,最後儲存到自定義映象裡即可。但是如此生成的映象不可重現,因為單從映象檔案啟動的容器資訊很難反推當初自己做過什麼環境搭建和服務部署了。dcokerfile的好處是讓這些過程變得透明,因為其中描述了映象生成的全過程,以及容器啟動的入口等。

from centos:7

maintainer pirlo san

我們會基於官方的centos7映象搭建golang開發環境,然後使用golang實現乙個web伺服器,並在容器內啟動該服務。 

maintainer語句是指定這個映象的作者。

# install gcc

# -y means saying yes to all questions

run yum install -y gcc

# install golang

run yum install -ygo

因為golang可能依賴於gcc,因此需要先安裝gcc

# 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工具可以被作業系統找到。

# copy source files

run mkdir -p /root/gopath/src/server

copy src/* /root/gopath/src/server/

在gopath的src目錄內建立server目錄,並將本地src目錄內的原始檔全部拷貝進去。

# build the server

workdir /root/gopath/src/server

rungobuild -o server.bin main.go

workdir將容器的工作目錄切換到server目錄,然後執行go build編譯得到可執行檔案server.bin。

# startup the server

cmd /root/gopath/src/server/server.bin

cmd指定容器啟動後預設執行的程式,也就是我們剛剛生成的web伺服器。

dockerfile生成以後,就可以在dockerfile所在目錄執行如下命令生成最終映象了,映象名稱為server,版本號為v0.1(注意最後的點哦):

docker build -t server:v0.1 .

終於到了啟動容器的時候了,還有點小激動呢。

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

我的阿里雲ecs伺服器公網位址是101.132.163.20,在瀏覽器位址輸入 即可驗證我們的部署結果啦:

Docker中部署Golang專案

參考 1.安裝docker 參考 2.預設你已經有乙個可以正常執行的golang專案了 比如叫project 啟動方式 go run main.go 參考 3.cd project touch dockerfile 4.dockerfile寫入 from golang 1.13 maintainer...

Docker 簡單部署Golang專案

1.安裝docker 2.mkdir mydocker 3.cd mydocker touch dockerfile 4.dockerfile寫入 將golang環境作為父映象 from golang maintainer razil zc6496359 workdir gopath src god...

docker的安裝和使用(基於centos 7)

1 docker的安裝 yum install docker2 查詢鏡象 docker search 鏡象名3 拉取鏡象 docker pull centos latest4 檢視本地鏡象 docker images5 建立乙個centos容器 docker run i t d name test1...