使用DockerFile構建運行GoWeb


安裝docker

# 安裝一些必要的系統工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加軟件源信息
# docker 官方源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 阿里雲源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  
# 安裝前可以先更新 yum 緩存:
sudo yum makecache fast

# CentOS7安裝 Docker-ce
yum -y install docker-ce        # CentOS 中安裝
apt-get install docker-ce       # Ubuntu 中安裝
pacman -S docker                # Arch 中安裝
emerge --ask docker             # Gentoo 中安裝

# 如果想安裝特定版本的Docker-ce版本,先列出repo中可用版本,然后選擇安裝
yum list docker-ce --showduplicates |sort -r
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror
Installed Packages
docker-ce.x86_64            3:19.03.4-3.el7                    docker-ce-stable
docker-ce.x86_64            3:19.03.4-3.el7                    @docker-ce-stable
docker-ce.x86_64            3:19.03.3-3.el7                    docker-ce-stable
docker-ce.x86_64            3:19.03.2-3.el7                    docker-ce-stable
docker-ce.x86_64            3:19.03.1-3.el7                    docker-ce-stable

yum install docker-ce-<VERSION STRING>
# 選擇安裝 docker-ce-18.06.1.ce
yum install docker-ce-18.06.1.ce

# Docker鏡像加速
# 沒有啟動/etc/docker目錄不存在,需要自己創建,docker啟動也會自己創建
# 為了期望我們的鏡像下載快一點,應該定義一個鏡像加速器,加速器在國內
mkdir /etc/docker
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}

# 啟動Docker后台服務
systemctl start docker && systemctl enable docker
systemctl daemon-reload                 # 守護進程重啟

# 通過運行hello-world鏡像,驗證是否正確安裝了docker,或者通過查看版本
docker run hello-world
docker version
Client: Docker Engine - Community
Version:           19.03.4
API version:       1.40
Go version:        go1.12.10
Git commit:        9013bf583a
Built:            Fri Oct 18 15:52:22 2019
OS/Arch:           linux/amd64
Experimental:      false
下載golang的Docker鏡像
docker pull golang:alpine
使用golang鏡像
[root@go-demo ~]# docker run -it golang bash
root@d38b34f9c603:/go# go version
go version go1.14.7 linux/amd64

首先,如果我們把文件直接寫在 Docker 容器里面的話,那么數據是無法持久化的。 即使可以使用 docker cp 命令這樣的方式把我們的文件復制到容器內部, 或者把文件從容器中復制出來,但是在操作的時候仍會有很多不方便的地方。

而且,在 golang 的鏡像中進行 build 操作的時候,程序依賴的第三方包, 會被下載到容器的 /go 目錄下面。如果每次容器都刪除, 或者每次創建新的容器的時候,都需要從網絡上拉取一次第三方包。 如果網速快的話還好,否則時間浪費的有點兒嚴重。

所以,我們要把主機的目錄映射到容器中,這樣就可以把文件進行持久化了。

我們可以使用 docker 命令的 -v 參數,把主機的目錄映射到容器中。 不過只使用 -v 參數的話,在容器內部操作目錄會有權限限制, 所以還需要增加 --privileged 參數給容器放權。

[root@go-demo golang]# pwd  # 查看當前所在的目錄
/root/golang

[root@go-demo golang]# ls -l
total 8
drwxr-xr-x 2 root root 4096 Aug  9 23:53 code
drwxr-xr-x 2 root root 4096 Aug  9 23:53 go
  
  
[root@go-demo golang]# docker run -it -v /root/golang/go:/go -v /root/golang/code:/code --privileged golang bash

docker打包gin框架並運行

編寫程序代碼
[root@go-demo go]# cat main.go 
package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run("0.0.0.0:8080") 
  // docker里面服務服務不能配置127.0.0.1,否則宿主機將無法訪問
}
docker運行容器暴露端口
[root@go-demo golang]# docker run -it -p 8080:8080 -v /root/golang/go:/go -v /root/golang/code:/code --privileged golang bash

root@e0aeee18307f:/go# go get github.com/gin-gonic/gin
root@e0aeee18307f:/go# go run main.go 
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:	export GIN_MODE=release
 - using code:	gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /ping                     --> main.main.func1 (3 handlers)

訪問容器內暴露web應用
[root@go-demo go]# curl localhost:8080/ping
{"message":"pong"}

// 查看日志
[GIN-debug] Listening and serving HTTP on 0.0.0.0:8080

[GIN] 2020/08/09 - 16:00:30 | 200 |      99.894µs |      172.17.0.1 | GET      "/ping"
DockerFile構建docker鏡像
FROM golang:alpine
MAINTAINER JiangHongJie "jhj767658181@gmail.com"
# docker中的工作目錄
WORKDIR $GOPATH/src/gin_docker
# 將當前目錄同步到docker工作目錄下,也可以只配置需要的目錄和文件(配置目錄、編譯后的程序等)
ADD . ./
# 由於所周知的原因,某些包會出現下載超時。這里在docker里也使用go module的代理服務
ENV GO111MODULE=on
ENV GOPROXY="https://goproxy.io"
# 指定編譯完成后的文件名,可以不設置使用默認的,最后一步要執行該文件名
RUN go build -o gin_docker .
EXPOSE 8080
# 這里跟編譯完的文件名一致
ENTRYPOINT  ["./gin_docker"]
構建docker鏡像
sudo docker build -t gin_docker .
啟動容器
docker run --name gin_docker -p 8080:8080 -d gin_docker


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM