docker部署go gin框架 Windows环境

目录

文章目的是什么

环境介绍

Windows 环境下 docker 部署 go gin 详细步骤

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

直接部署gin(跳过运行容器时因为挂载文件可能会出现的问题)


文章目的是什么

假设我们学习了 go 语言,在 Windows(本地) 上安装了 go 相关的程序,也能直接运行,使用以下命令:

go run main.go

假如代码是这样的:

package main

import "fmt"

func main() {
	fmt.Println("Hello World")
}

就会输出:

Hello World

但现在我们想要使用 docker 来部署,可能就有一些不同,复杂度肯定会比上面多一些。

所以本文的目的是:

使用 docker 部署 go,且可以运行 gin 框架的基础代码

环境介绍

我们开发时,基本上都是在自己电脑上,大多数应该都是 Windows,而我们项目发布上线时,一般又是使用的是 Linux,本文讲解的是 Windows 环境。

Windows:

版本:Windows 11

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 下,可能会有一个细节问题

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 命令:

docker images

能看到 golang 这个镜像

然后我们就运行容器

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" 目录,我们做一个实验

然后我们进入容器内部看看

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 下改个名试试:

所以,这挂载文件是错误了的。

我们果断删除 容器,重新处理

运行下面这段代码即可

$ 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 的配置,并且要修改两个:

go env -w GO111MODULE=on
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct

GO111MODULE=on  go 命令行会使用 modules

GOPROXY 是设置为阿里云的代理

设置完成后,我们就可以返回 Windows 环境,找到我们的项目 demo 目录

创建一个 main.go 文件,内容为:

package main

import "fmt"

func main() {
	fmt.Println("Hello World")
}

然后我们进入容器看看

文件存在,并且输出内容看一下

内容是一致的,我们就可以在容器内部,运行程序试试

go run main.go

结果也是符合我们的预期。

直接部署gin(跳过运行容器时因为挂载文件可能会出现的问题)

我们进入容器,第一步是要先初始化 mod,运行:

go mod init demo

能看到创建成功,我们可以切回 Windows 下看看

因为挂载的关系,在容器里创建了文件、目录,在 Windows 环境里,也会创建,反之也是一样的。

接着我们继续在容器内执行命令,下载并安装 gin:

go get -u github.com/gin-gonic/gin

执行以上操作时,可能会出现错误,提示:"go: zip: not a valid zip file" 之类的错误。

我这边整理是说代理的问题,我上面使用的是阿里云代理,也很奇怪,有时候可以,有时候却会出现问题。

所以我切换成 七牛云代理。

go env -w GOPROXY=https://goproxy.cn,direct

然后我们再重新 下载安装gin 就可以了。

进入 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() // listen and serve on 0.0.0.0:8080
}

然后我们进入 docker 容器,运行 go

go run main.go

可以看到,程序成功执行,端口默认的是 8080

当请求后,我们可以进入容器,查看请求记录

以上,就完成了在 Windows 环境下使用 docker 部署 go gin 并运行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/247763.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 简单使用qsort 比较结构体字符串大小

1.先简单调用C语言封装好的冒泡排序 #include<stdio.h> #include<stdlib.h> #include<string.h> //qsort C语言封装好的冒泡排序 可比较任何类型 struct stu{char name[20];int age; }; //用户自己写的函数。函数名字也作为函数指针使用。是qsort函数的第四…

代码随想录第三十三天(一刷C语言)|斐波那契数爬楼梯使用最小花费爬楼梯

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 动态规划步骤&#xff1a; 确定dp数组以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 一、斐波那契数 思路&#xff1a;参考carl文档 1、dp[i]的定义为&#xff…

PDI/Kettle-9.2.0.0-R(对应jdk1.8)源码编译问题记录及源码结构简介

目录 &#x1f4da;第一章 前言&#x1f4d7;背景&#x1f4d7;目的&#x1f4d7;总体方向 &#x1f4da;第二章 代码结构初识基本结构&#x1f4d7;代码模块详情 ⁉️问题记录❓问题一&#xff1a;代码分支哪些是发布版本❗答&#xff1a;后缀-R的版本 ❓问题二&#xff1a;50…

猫粮哪个牌子质量好性价比高?盘点十款主食冻干猫粮品牌排行榜!

在过去的100多年里&#xff0c;猫咪主食市场一直被膨化猫粮主导。然而&#xff0c;随着猫咪频频出现猝死、失明、发育不良以及营养不良等问题&#xff0c;猫主人们开始质疑膨化粮是否最适合猫咪。于是&#xff0c;从上世纪90年代开始&#xff0c;出现了生骨肉喂养。生骨肉确实是…

[算法总结] 十大排序算法

[算法总结] 十大排序算法 简介&#xff1a; 本文首发于我的个人博客&#xff1a;尾尾部落排序算法是最经典的算法知识。因为其实现代码短&#xff0c;应该广&#xff0c;在面试中经常会问到排序算法及其相关的问题。一般在面试中最常考的是快速排序和归并排序等基本的排序算法…

代码随想录算法训练营 | day48 动态规划 198.打家劫舍,213.打家劫舍Ⅱ,337.打家劫舍Ⅲ

刷题 198.打家劫舍 题目链接 | 文章讲解 | 视频讲解 题目&#xff1a;你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被…

c YUV 转 JPEG(准备霍夫曼编码)

先取yuv 文件中一个168的块&#xff0c;跑通全流程 理解与思路&#xff1a; 1.块分割 YUV 文件分为&#xff1a;YUV444 YUV 422 YUV420。444:就是&#xff1a;12个char 有4个Y&#xff0c;4个U&#xff0c;4个 U&#xff0c;422&#xff1a;8个char 中有4个Y &#x…

Oracle MongoDB

听课的时候第一次碰到&#xff0c;可以了解一下吧&#xff0c;就直接开了墨者学院的靶场 #oracle数据库 Oracle数据库注入全方位利用 - 先知社区 这篇写的真的很好 1.判断注入点 当时找了半天没找到 看样子是找到了&#xff0c;测试一下看看 id1 and 11 时没有报错 2.判断字段…

开发人员必须掌握的几个高级命令

xargs命令 在平时的使用中,我认为 xargs 这个命令还是较为重要和方便的。我们可以通过使用这个命令,将命令输出的结果作为参数传递给另一个命令。 比如说我们想找出某个路径下以 .conf 结尾的文件,并将这些文件进行分类,那么普通的做法就是先将以 .conf 结尾的文件先找出…

linux(centos7)mysql8.0主从集群搭建(两台机器)

docker安装:&#xff08;转载&#xff09;centos7安装Docker详细步骤&#xff08;无坑版教程&#xff09;-CSDN博客 环境信息 主数据库服务器&#xff1a;192.168.1.10 从数据库服务器&#xff1a;192.168.1.11 1. mysql8.0镜像下载 docker pull mysql:8.0.23 2.创建docke…

SaaS 电商设计 (五) 私有化部署-实现 binlog 中间件适配

一、 背景 具体的中间件私有化背景在上文 SaaS 电商设计 (二) 私有化部署-缓存中间件适配 已有做相关介绍.这里具体讨论的场景是通过解析mysql binlog 来实现mysql到其他数据源的同步.具体比如:在电商的解决方案业务流中经常有 ES 的使用场景,用以解决一些复杂的查询和搜索商品…

17--异常处理

1、异常概述 1.1 什么是异常 异常&#xff1a;指的是程序在执行过程中&#xff0c;出现的非正常情况&#xff0c;如果不处理最终会导致JVM的非正常停止。 异常指的并不是语法错误和逻辑错误。语法错了&#xff0c;编译不通过&#xff0c;不会产生字节码文件&#xff0c;根本运…

01.前言

前言 1.什么是前端开发 前端开发是创建 Web 页面或 app 等前端界面呈现给用户的过程核心技术&#xff1a;HTML&#xff0c;CSS&#xff0c;JavaScript 以及衍生出的各种技术&#xff0c;框架等 2.前端开发应用场景 3.前端职业路线 4.什么是CS架构与BS架构 介绍 应用软件&a…

SuperMap iClient3D for Cesium 实现鼠标移动选中模型并显示模型对应字段

SuperMap iClient3D for cesium 实现鼠标移动选中模型并显示模型对应字段 一、实现思路二、数据制作1. 计算出模型中心点并保存到属性表中2. 计算出模型顶部高程3. 模型数据切缓存4. 发布三维服务. 三、代码编写 作者&#xff1a;xkf 一、实现思路 将模型属性数据存储到前端&a…

c++面经总结

C基础语法 C和c的区别 c中new和delete是对内存分配的运算符&#xff0c;取代了c中的malloc和free 标准c中的字符串类取代了标准c函数库头文件中的字符数组处理函数(c中没有字符串类型). 在c中&#xff0c;允许有相同的函数名&#xff0c;不过他们的参数类型不能完全相同&…

JAVA:深入探讨Java 8 Stream的强大功能与用法

1、简述 Java 8引入了Stream API&#xff0c;为处理集合数据提供了一种更为强大和灵活的方式。Stream是一种抽象的数据结构&#xff0c;它允许你以一种声明性的方式处理数据集合。与传统的集合操作不同&#xff0c;Stream并不是一个存储数据的数据结构&#xff0c;而是在源数据…

Leetcode—78.子集【中等】

2023每日刷题&#xff08;五十九&#xff09; Leetcode—78.子集 算法思想 实现代码 class Solution { public:vector<vector<int>> subsets(vector<int>& nums) {int len nums.size();vector<int> path;vector<vector<int>> ans;f…

20231215给AIO-3399J适配Rockchip的原始Andoroid10的挖掘机开发板01

20231215给AIO-3399J适配Rockchip的原始Andoroid10的挖掘机开发板01 2023/12/15 10:49 【请严重注意&#xff1a;】如果刷不适配的SDK&#xff0c;可能会引起您的开发板【硬件发生物理】损坏&#xff01; 如果您按照本步骤刷机引起的一切后果&#xff0c;请自行承担责任&#x…

状态的一致性和FlinkSQL

状态一致性 一致性其实就是结果的正确性。精确一次是指数据有可能被处理多次&#xff0c;但是结果只有一个。 三个级别&#xff1a; 最多一次&#xff1a;1次或0次&#xff0c;有可能丢数据至少一次&#xff1a;1次或n次&#xff0c;出错可能会重试 输入端只要可以做到数据重…

vue3 添加编辑页使用 cron 表达式生成

示例效果图 1、添加组件 <template><div class"v3c"><ul class"v3c-tab"><li class"v3c-tab-item" :class"{ v3c-active: tabActive 1 }" click"onHandleTab(1)">秒</li><li class&qu…