1. 程式人生 > >Docker執行Golang Web服務

Docker執行Golang Web服務

Golang程式碼

import (
	"net/http"
	"io"
)

func main() {
	http.HandleFunc("/",helloHandle)
	http.ListenAndServe(":80",nil)
}

func helloHandle(rw http.ResponseWriter,r *http.Request)  {
	io.WriteString(rw,"hello world!")
}

簡單的提供三種方式

1.golang映象中提供編譯和執行環境,所以映象特別的大,直接將go工程的所有程式碼和資源打包複製到容器中,在容器中編譯執行

Dockerfile內容如下:

# 得到最新的 golang docker 映象
FROM golang:latest
# 在容器內部建立一個目錄來儲存我們的 web 應用
RUN mkdir -p /go/src/go_web
#接著使它成為工作目錄。
WORKDIR /go/src/go_web/
# 複製 go_web 目錄到容器中
COPY . /go/src/go_web/
#編譯,編譯成可執行檔案
RUN go build /go/src/go_web/main.go
# 設定 PORT 環境變數
ENV PORT 80
# 給主機暴露 80 埠,這樣外部網路可以訪問你的應用
EXPOSE 80
# 告訴 Docker 啟動容器執行的命令
CMD /go/src/go_web/main

構建映象

#docker build -t main .

執行容器

#docker run -d -p 80:80 main  //後臺執行
或
#docker run -it -p 80:80 main  //提供互動式shell
如果工程服務中訪問了Host的MySql則使用如下命令執行
#docker run -d --net=host -p 80:80 main

2.在容器中直接執行可執行檔案,還可以在容器中做一些sh操作,還是依賴於golang映象

Dockerfile內容如下:

# 得到最新的 golang docker 映象
FROM golang:latest
# 在容器內部建立一個目錄來儲存我們的 web 應用,接著使它成為工作目錄。
RUN mkdir -p /go_web
WORKDIR /go_web/
# 複製 web-app 目錄到容器中
COPY goweb /go_web/
# 設定檔案許可權
RUN chmod 777 goweb
# 告訴 Docker 啟動容器執行的命令
CMD ["/go_web/goweb"]

構建映象

#docker build -t go_web .

執行容器

#docker run -it -p 80:80 go_web 
如果 docker run 指定了其他命令,CMD 指定的預設命令將被忽略。
#docker run -it -p 80:80 go_web /go_web/goweb

3.在容器中直接執行可執行檔案,依賴scratch映象,這個映象是空的,裡面沒有sh工具,所以只能簡單的執行可執行檔案,不能進行其他操作,連最基本的 /bin,/usr, /lib, /dev 都沒有

Dockerfile內容如下:

# 得到最新的 scratch docker 映象
FROM scratch
# 複製 main 目錄到容器中
COPY main /
# 告訴 Docker 啟動容器執行的命令
CMD ["/main"]

構建映象

#docker build -t main .

執行容器

#docker run -it -p 80:80 main