docker部署go gin框架

目录

文章目的是什么

环境介绍

[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 我在另一个文章中有详细的讲解,因为内容比较多,建议看一下另一篇文章

docker安装golang_docker golang-CSDN博客文章浏览阅读877次。最近玩 docker 比较多,试试安装 golang。第一步:先看一下镜像;第二步:下载镜像;第三步:进一步查看 golang 是不是我们指定安装的版本;第四步:运行容器_docker golanghttps://blog.csdn.net/longfeng995/article/details/131006514?spm=1001.2014.3001.5501

运行容器时因为挂载文件可能会出现的问题

上面这篇文章,针对 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 并运行

相关推荐
小诸葛的博客27 分钟前
如何使用docker启动一个gitlab
docker·容器·gitlab
爱写Bug的小孙1 小时前
docker搭建私有的仓库
java·运维·spring boot·docker·容器
iPrologue1 小时前
自己记录docker和ES集群
elasticsearch·docker·容器
小费的部落1 小时前
记 centos9 安装 docker
docker·容器·eureka
凡人的AI工具箱1 小时前
40分钟学 Go 语言高并发:【实战】并发安全的配置管理器
开发语言·网络·后端·安全·golang
三天不学习2 小时前
Docker 常用命令大全(基础、镜像、容器、数据卷)
docker·容器·eureka
knoci12 小时前
【Go】-go中的锁机制
后端·学习·golang
Mike_1887027835112 小时前
深入探索Golang的GMP调度机制:源码解析与实现原理
开发语言·后端·golang
爱学习 爱分享12 小时前
Docker 数据卷 和 挂载 的区别
docker
不7夜宵12 小时前
Golang 反射
开发语言·后端·golang