目录
[Windows 环境下 docker 部署 go gin 详细步骤](#Windows 环境下 docker 部署 go gin 详细步骤)
直接部署gin(跳过运行容器时因为挂载文件可能会出现的问题)
文章目的是什么
假设我们学习了 go 语言,在 Windows(本地) 上安装了 go 相关的程序,也能直接运行,使用以下命令:
bash
go run main.go
假如代码是这样的:
Go
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
就会输出:
bash
Hello World
但现在我们想要使用 docker 来部署,可能就有一些不同,复杂度肯定会比上面多一些。
所以本文的目的是:
使用 docker 部署 go,且可以运行 gin 框架的基础代码
环境介绍
我们开发时,基本上都是在自己电脑上,大多数应该都是 Windows,而我们项目发布上线时,一般又是使用的是 Linux,本文讲解的是 Windows 环境。
bash
Windows:
版本:Windows 11
[Windows 环境下 docker 部署 go gin 详细步骤](#Windows 环境下 docker 部署 go gin 详细步骤)
docker安装golang 我在另一个文章中有详细的讲解,因为内容比较多,建议看一下另一篇文章
运行容器时因为挂载文件可能会出现的问题
上面这篇文章,针对 Linux 环境,是没有问题的,但是在 Windows 下,可能会有一个细节问题
bash
docker run -itd -p 8081:8080 -v /docker/go/demo:/go --name localhost-go golang:1.18.9
-v /docker/go/demo
上面这一段,是挂载文件路径,要注意一点的是,/docker 这是根目录下 docker 目录。首先我们是 Windows 环境,是没有这个目录的,需要切换成我们自己的目录。
假设像我电脑上,我是存放到 D盘 docker 目录下 ...
那么就要修改为:/d/docker/...
但是按照上面这样运行 最终会出现错误的,我们接着细看。
我们能看到,在 终端 ,显示的目录位置是:/d/docker
并且我们输入 pwd 命令打印位置,也是如此
但如果我们拿这样的目录使用,就会出现错误。我这边示范一下:
先看我们的 docker 镜像
输入 docker 命令:
bash
docker images
能看到 golang 这个镜像
然后我们就运行容器
bash
docker run -itd -p 8080:8080 -v /d/docker/www/go:/go --name localhost-go fffd0d9a59da
运行之后,会打印出生成的 容器ID
我们去 Docker Desktop 客户端界面看一下
容器已经生成,并且运行着 没有问题。
而上面,我们一直在强调 挂载文件 -v /docker/go/demo
我们生成容器的命令里,使用的是 -v /d/docker/www/go:/go
就说明,我们的 /d/docker/www/go 目录,是跟容器内的**/go** 目录进行了绑定
然后我们来看看我们 Windows 环境下,目录是如何的
而为了校验是否真的 挂载到了这个 "go;D" 目录,我们做一个实验
然后我们进入容器内部看看
bash
winpty docker exec -it 627d777141e6 bash
winpty 是因为是 Windows 环境,所以需要加,如果是 Linux 则可以忽略,否则会出现错误
the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'
以上,我们进入了容器内部,默认是进入的 /go 目录,然后我们 ls 输出,发现是没有 我们 Windows 环境下的 "demo" 目录,以及 "我是一个文本..." 的文件
所以,可以证明一点,我们的挂载是失败了的。
那么会有一个问题,这挂载跑哪去了呢?
当我返回根目录下,我发现了一个奇怪的目录,如下:
这个 **'\Git\go'**就显得格外耀眼了,然后我很好奇的进入该目录,发现:
文件名乱码了,我想到可能是因为中文的原因,所以我们在 Windows 下改个名试试:
所以,这挂载文件是错误了的。
我们果断删除 容器,重新处理
运行下面这段代码即可
bash
$ docker run -itd -p 8080:8080 -v D:/docker/www/go:/go --name localhost-go fffd0d9a59da
-v /d/docker/www/go:/go我们修改为了:-v D:/docker/www/go:/go
然后我们重新进入容器,就能看到
和我们 Windows 下绑定的环境一模一样了
并且返回根目录,也不会再看到奇怪的 'Git\go' 什么的了。
好了,以上 容器我们部署好了,现在就开始运行 go
首先,我们检查 go env 的配置,并且要修改两个:
bash
go env -w GO111MODULE=on
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
GO111MODULE=on go 命令行会使用 modules
GOPROXY 是设置为阿里云的代理
设置完成后,我们就可以返回 Windows 环境,找到我们的项目 demo 目录
创建一个 main.go 文件,内容为:
bash
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
然后我们进入容器看看
文件存在,并且输出内容看一下
内容是一致的,我们就可以在容器内部,运行程序试试
bash
go run main.go
结果也是符合我们的预期。
直接部署gin(跳过运行容器时因为挂载文件可能会出现的问题)
我们进入容器,第一步是要先初始化 mod,运行:
bash
go mod init demo
能看到创建成功,我们可以切回 Windows 下看看
因为挂载的关系,在容器里创建了文件、目录,在 Windows 环境里,也会创建,反之也是一样的。
接着我们继续在容器内执行命令,下载并安装 gin:
bash
go get -u github.com/gin-gonic/gin
执行以上操作时,可能会出现错误,提示:"go: zip: not a valid zip file" 之类的错误。
我这边整理是说代理的问题,我上面使用的是阿里云代理,也很奇怪,有时候可以,有时候却会出现问题。
所以我切换成 七牛云代理。
bash
go env -w GOPROXY=https://goproxy.cn,direct
然后我们再重新 下载安装gin 就可以了。
进入 main.go 文件,粘贴以下代码
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() // listen and serve on 0.0.0.0:8080
}
然后我们进入 docker 容器,运行 go
bash
go run main.go
可以看到,程序成功执行,端口默认的是 8080
当请求后,我们可以进入容器,查看请求记录
以上,就完成了在 Windows 环境下使用 docker 部署 go gin 并运行