GO-Gin-Example 第六部分 将Golang应用部署到Docker

文章目录

  • Docker
    • docker相关部分知识
    • docker安装
      • winddows环境
  • 本部分目标
  • 实现
    • 编写dockerfile
    • 拉取mysql镜像
    • 修改配置文件
    • 构建镜像
    • 验证镜像
    • 创建并运行容器,将golang容器和MySql容器关联
    • 挂载主机目录
    • 重新运行golang容器
    • 验证

Docker

docker相关部分知识

runoob docker教程
同站友人关于docker的相关介绍

简而言之,docker是一款轻量级的虚拟机

Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟

docker安装

winddows环境

由于Docker并非通用的容器工具,其依赖于已经存在并运行的linux内核环境

Docker 实质上是在已经运行的 Linux 下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。

因此,Docker 必须部署在 Linux 内核的系统上。如果其他系统想部署 Docker必须安装一个虚拟 Linux 环境

目前博主推荐在windows使用wsl2作为linux环境
这里再次引用同站博主的wsl安装教程

之后从docker官方下载安装docker Desktop即可

更多docker相关知识就请大家自己学习了

本部分目标

go-gin-example部署到docker

实现

编写dockerfile

在我们的项目根目录下创建dockerfile文件,写入以下内容

FROM golang:latestENV GOPROXY https://goproxy.cn,directWORKDIR $GOPATH/src/github.com/kingsill/gin-example
COPY . $GOPATH/src/github.com/kingsill/gin-example#RUN go build main.go
RUN go build .EXPOSE 8000#ENTRYPOINT ["./main"]
ENTRYPOINT ["./gin-example"]
  • FROM golang:latest

指定使用最新版的官方的Golang镜像作为基础镜像,用于构建docker容器

  • ENV GOPROXY https://goproxy.cn,direct

对创建容器的全局变量进行设置,设置go模块代理环境为国内镜像

  • WORKDIR $GOPATH/src/github.com/kingsill/gin-example

设置容器内的工作目录,如果不存在会自动创建,首次出现,为进入容器后默认的工作目录,不需要cd

  • COPY . $GOPATH/src/github.com/kingsill/gin-example

将当前目录的所有内容(.指代所有文件)复制到指定目录(刚才设置的容器内的工作目录)

  • RUN go build .

Run命令等同于在终端操作的shell命令,只在build时执行。这里即相当于在创建的容器的工作目录中编译当前文件夹内的go文件,生成的exe文件名字为根目录的名称

  • EXPOSE 8000

expose声明对外暴露的端口,可以不写,docker run -p可以指定暴露端口

  • ENTRYPOINT ["./gin-example"]

entrypoint为容器启动时执行的命令,这里即运行build生成的可执行文件,让程序随容器运行而启动

拉取mysql镜像

  1. 拉取镜像
    从Docker公共仓库下载MySql镜像(国内建议先配置镜像源)
docker pull mysql
  1. 创建、运行MySql容器
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=rootroot -d mysql

--name:指定容器名称

-p 3306:3306:指定端口映射,将容器内部的Mysql服务端口3306映射到主机的3306端口。

-e MYSQL_ROOT_PASSWORD=rootroot:设置MySql数据库的root用户密码为rootroot,实际通过环境变量MYSQL_ROOT_PASSWORD指定

-d 表示在后台运行容器,不会阻塞当前终端

修改配置文件

由于我们使用Mysql容器,我们需要对配置文件app.ini进行修改

#debug or release
RUN_MODE = debug[app]
PAGE_SIZE = 10
JWT_SECRET = 23347$040412[server]
HTTP_PORT = 8000
READ_TIMEOUT = 60
WRITE_TIMEOUT = 60[database]
TYPE = mysql# 这里的密码是创建MySql容器时我们定下的密码
USER = root
PASSWORD = rootroot#127.0.0.1:3306
#HOST = localhost:3306
HOST = mysql:3306NAME = blog
TABLE_PREFIX = blog_

构建镜像

在gin-example项目根目录下执行

docker build -t gin-blog-docker .

-t:指定名称

. :构建内容为当前上下文目录,从当前目录中寻找dockerfile文件

验证镜像

执行命令

& docker psCONTAINER ID   IMAGE             COMMAND                  CREATED       STATUS       PORTS                               NAMES
89abe529cf28   gin-blog-docker   "./gin-example"          4 hours ago   Up 4 hours   0.0.0.0:8000->8000/tcp              laughing_sammet
88606fa6bacc   mysql             "docker-entrypoint.s…"   5 hours ago   Up 5 hours   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

存在刚刚构建的两个镜像

创建并运行容器,将golang容器和MySql容器关联

docker run --link mysql:mysql -p 8000:8000 gin-blog-docker
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.2024/03/18 06:36:18 Error 1049 (42000): Unknown database 'blog'- using env:   export GIN_MODE=release- using code:  gin.SetMode(gin.ReleaseMode)[GIN-debug] GET    /swagger/*any             --> github.com/swaggo/gin-swagger.CustomWrapHandler.func1 (3 handlers)
[GIN-debug] GET    /auth                     --> github.com/kingsill/gin-example/routers/api.GetAuth (3 handlers)
[GIN-debug] GET    /api/v1/tags              --> github.com/kingsill/gin-example/routers/api/v1.GetTags (4 handlers)
[GIN-debug] POST   /api/v1/tags              --> github.com/kingsill/gin-example/routers/api/v1.AddTag (4 handlers)
[GIN-debug] PUT    /api/v1/tags/:id          --> github.com/kingsill/gin-example/routers/api/v1.EditTag (4 handlers)
[GIN-debug] DELETE /api/v1/tags/:id          --> github.com/kingsill/gin-example/routers/api/v1.DeleteTag (4 handlers)
[GIN-debug] GET    /api/v1/articles          --> github.com/kingsill/gin-example/routers/api/v1.GetArticles (4 handlers)
[GIN-debug] GET    /api/v1/articles/:id      --> github.com/kingsill/gin-example/routers/api/v1.GetArticle (4 handlers)
[GIN-debug] POST   /api/v1/articles          --> github.com/kingsill/gin-example/routers/api/v1.AddArticle (4 handlers)
[GIN-debug] PUT    /api/v1/articles/:id      --> github.com/kingsill/gin-example/routers/api/v1.EditArticle (4 handlers)
[GIN-debug] DELETE /api/v1/articles/:id      --> github.com/kingsill/gin-example/routers/api/v1.DeleteArticle (4 handlers)
2024/03/18 06:58:38 Actual pid is 1

--link:可以在容器内直接使用其关联的容器别名进行访问,而不是通过ip
但是--link只能解决单机容器间的关联
在分布式多机的情况下,需要通过别的方式进行连接

当然,现在依旧是由问题的,我们可以看到这一句2024/03/18 06:36:18 Error 1049 (42000): Unknown database 'blog'
这说明在我们现在的MySql容器中没有我们之前创建的数据库和表

如果只是在当前容器内使用,可以直接在MySql容器内进行表格等建立即可

当然如果想要数据持久化,并且不随容器删除而删除,多个容器使用,就需要用到挂载数据卷

挂载主机目录

docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=rootroot -v /home/wang2/docker_rep:/var/lib/mysql mysql

-v /home/wang2/docker_rep:/var/lib/mysql:这里多出的一句是将宿主机的目录/home/wang2/docker_rep,挂载到容器的/var/lib/mysql,即mysql默认存储数据的位置,完成数据持久化

当然,也可以选择将我们之前的mysql数据直接复制到这里,这一种方法大家可以自己尝试

之后我们可以直接在容器中再进行数据库内容的初始化即可,我们第一部分的数据初始化部分

重新运行golang容器

docker run --link mysql:mysql -p 8000:8000 gin-blog-docker

验证

访问http://127.0.0.1:8000/auth?username=test&password=test123456
得到结果如下:

{"code": 200,"data": {"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InRlc3QiLCJwYXNzd29yZCI6InRlc3QxMjM0NTYiLCJleHAiOjE3MTA3NTU5MzQsImlzcyI6Imdpbi1ibG9nIn0.UO686FMYrBT-pXkkIEcNr7g8l-7kqEpjsd_Gim2bRWE"},"msg": "ok"
}

该项目部署到docker成功

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visual Studio 2013 - 调试模式下查看监视窗口

Visual Studio 2013 - 调试模式下查看监视窗口 1. 监视窗口References 1. 监视窗口 Ctrl Alt W,1-4:监视窗口 (数字键不能使用小键盘) or 调试 -> 窗口 -> 监视 -> 监视 1-4 调试状态下使用: 在窗口中点击空白行,…

如何在 Ubuntu 14.04 VPS 上添加和删除用户

简介 在新的 Linux 服务器上,你应该知道如何添加和删除用户是最基本的任务之一。当你创建一个新的服务器时,默认情况下只会给你 root 账户。 虽然这给了你很大的权力和灵活性,但也很危险,可能会造成破坏。通常最好的做法是添加一…

目标检测——PP-PicoDet算法解读

PP-YOLO系列,均是基于百度自研PaddlePaddle深度学习框架发布的算法,2020年基于YOLOv3改进发布PP-YOLO,2021年发布PP-YOLOv2和移动端检测算法PP-PicoDet,2022年发布PP-YOLOE和PP-YOLOE-R。由于均是一个系列,所以放一起解…

Java八股文(RabbitMQ)

Java八股文のRabbitMQ RabbitMQ RabbitMQ RabbitMQ 是什么?它解决了哪些问题? RabbitMQ 是一个开源的消息代理中间件,用于在应用程序之间进行可靠的异步消息传递。 它解决了应用程序间解耦、消息传递、负载均衡、故障恢复等问题。 RabbitMQ …

长安链智能合约标准协议第二草案——BNS与DID协议邀请社区用户评审

长安链智能合约标准协议 在智能合约编写过程中,不同的产品及开发人员对业务理解和编程习惯不同,即使同一业务所编写的合约在具体实现上也可能有很大差异,在运维或业务对接中面临较大的学习和理解成本,现有公链合约协议规范又不能完…

软件测试 -- Selenium常用API(java)

写在前面 // 如果文章有问题的地方, 欢迎评论区或者私信指正 目录 什么是Selenium 一个简单的用例 元素定位 id定位 xpath定位 name定位 tag name 定位和class name 定位 操作元素 click send_keys submit text getAttribute 1. 获取元素的 class 属性 2. 获取元素…

Word为图表设置图注并在图表清单中自动生成

1如果需要自动插入题注,请不要自己为文件增加新的标题样式或删除自带的标题1样式 2章节大标题最好是标题1,2,3而不要设置标题一、二、三,否则图例在自动生成时会显示 图一 -1,调整起来会非常不方便 若实在要使用大写中文标题&…

系统资源耗尽对服务器的影响有什么?

在当今数字化时代,服务器作为核心计算设备,为企业和组织的业务连续性提供了重要保障。然而,随着业务的增长和复杂性的提升,服务器也面临着越来越多的挑战。其中,系统资源耗尽是服务器面临的一个重要问题。今天德迅云安…

1、初识JVM

一、JVM是什么? JVM的英文全称是 Java Virtual Machine,其中文译名为Java虚拟机。它在本质上就是是一个运行在计算机上的程序,他的职责是运行Java字节码文件。 JVM执行流程如下 二、JVM有哪些功能? 2.1 解释和运行 对字节码文…

将html网页展示的图表,下载到PPT文档内,以图片的形式展示在PPT内

使用到的工具有: 开发工具:IDEA 报表开发工具:帆软10.0.19 1、针对帆软报表[普通报表]的设置 1.1首先选中在帆软里制作好的报表,选择模板web属性 1.2.选择数据分析模式,添加一个事件设置,该事件应该设置“…

【滑动窗口、矩阵】算法例题

目录 三、滑动窗口 30. 长度最小的子数组 ② 31. 无重复字符的最长子串 ② 32. 串联所有单词的子串 ③ 33. 最小覆盖子串 ③ 四、矩阵 34. 有效的数独 ② 35. 螺旋矩阵 ② 36. 旋转图像 ② 37. 矩阵置零 ② 38. 生命游戏 ② 三、滑动窗口 30. 长度最小的子数组 ② 给…

Pillow教程:翻转图像

在Pillow(PIL的一个分支)库中,Image.transpose() 方法用于翻转或旋转图像。这个方法接受一个参数,该参数是翻转或旋转操作的类型,以预定义的常量来表示。以下是一些可用的常量及其描述: 1.翻转图像&#x…

Android Studio配置buildTypes{}后,gradle中Tasks列表不显示assembleRelease。

打开Files → Settings → Experimental 取消选中 "Do not build Gradle task list during Grafle sync"

CentOS 7.9 常用环境配置

文章目录 环境准备安装docker安装Java安装maven安装git安装MYSQL安装Redis安装RabbitMq安装minio 环境准备 操作系统版本为centos 7.9,内核版本需要在3.10以上 sudo uname -rsudo cat /etc/redhat-release1.确认环境好后,安装工具包并设置仓库 sudo yum…

SpringBoot通过拦截器和JWT令牌实现登录验证

1. Jwt 工具类 引入依赖 <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>4.4.0</version> </dependency>JwtUtil 类包含了两个静态方法&#xff1a;generateToken() 用于生成 JWT&…

图书馆管理系统 2.后台系统管理模块编写

后端 1.实体类编写 用户实体类 package jkw.pojo;import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data;import java.io.Serializable; import java.util.List;/*** 用户*/ Data public class …

Redis高频八股文与解决策略

什么是Redis&#xff1f; Redis是一个高性能的非关系型的键值对数据库&#xff0c;使用C编写实现的。与传统的数据库不同的是Redis是存在内存中的&#xff0c;所以读写速度非常快&#xff0c;每秒可以处理超过10万次的读写操作&#xff0c;这也是Redis常常被用作缓存的原因。 什…

Unity Toggle处理状态变化事件

Toggle处理状态变化事件&#xff0c;有两个方法。 法一、通过Inspector面板设置 实现步骤&#xff1a; 在Inspector面板中找到Toggle组件的"On Value Changed"事件。单击""按钮添加一个新的监听器。拖动一个目标对象到"None (Object)"字段&am…

研究人员发现 OpenAI ChatGPT、Google Gemini 的漏洞

自 OpenAI 推出 ChatGPT 以来&#xff0c;生成式 AI 聊天机器人的数量及其在企业中的采用率在一年多时间里呈爆炸式增长&#xff0c;但网络安全专业人士的担忧也随之增加&#xff0c;他们不仅担心威胁组织对新兴技术的使用&#xff0c;还担心大型网络的安全性及模型&#xff08…

点云预处理——滤波、旋转和平移等处理

目录 一、环境配置 二、步骤 一、环境配置 安装好ubuntu系统和ROS环境 操作系统: Ubuntu 20.04 wget http://fishros.com/install -O fishros && . fishros 二、步骤 打开终端&#xff0c;并在终端命令行输入以下指令: git clone https://gitee.com/wccworld/…