首页 > 其他分享 >Docker大学生看了都会系列(八、Dokcerfile部署go项目)

Docker大学生看了都会系列(八、Dokcerfile部署go项目)

时间:2024-06-09 10:33:54浏览次数:12  
标签:文件 Dockerfile Dokcerfile yaml go Docker main config

系列文章目录
第一章 Docker介绍
第二章 2.1 Mac通过Homebrew安装Docker
第二章 2.2 CentOS安装Docker
第三章 Docker常用命令
第四章 常用命令实战
第五章 Docker镜像详解
第六章 Docker容器数据卷
第七章 Dockerfile详解
第八章 Dokcerfile部署go项目

文章目录


一、前言

实践是检验真理的唯一标准,有了之前的Dockerfile基础之后,编写一个简单的go项目,并通过Dockerfile部署,Mac本机测试

二、环境

名称备注
MackBook Pro2023年
芯片Apple M2 Pro(arm64)
macOSSonoma 14.5
操作命令对象Docker 版本26.1.3
简单go项目Go 版本1.22.2

三、新建Go项目

有go基础的可以直接跳过,查看Dockerfile编写

3.1 go项目目录

新建个名为gindemo的项目,包含config.yamlmain.go2个文件

3.2 config.yaml文件

mysql:
  url: 127.0.0.1
  port: 330678

3.3 main.go文件

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"gopkg.in/yaml.v3"
	"os"
)

type Config struct {
	Mysql Mysql `json:"mysql"`
}

type Mysql struct {
	Url  string
	Port int
}

func main() {
	dataBytes, err := os.ReadFile("config.yaml")
	if err != nil {
		fmt.Println("读取文件失败:", err)
		return
	}
	config := Config{}
	err = yaml.Unmarshal(dataBytes, &config)
	if err != nil {
		fmt.Println("解析 yaml 文件失败:", err)
		return
	}

	r := gin.Default()
	r.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"Mysql": config.Mysql,
		})
	})
	r.Run(":8080")
}

3.4 本地测试运行

依次安装gindemo需要的依赖

go get -u github.com/gin-gonic/gin
go get -u gopkg.in/yaml.v3

引用项目需要的依赖增加到go.mod文件

go mod tidy

依次执行如下代码,运行服务

go build main.go
./main

新起个terminal执行如下代码

curl 127.0.0.1:8080 

当看到控制台输出如下字符串就说明gindemo项目服务跑起来了
{"Mysql":{"Url":"127.0.0.1","Port":330678}}%

四、编写Dockerfile文件

4.1 新建Dockerfile文件

gindemo工程目录下新建Dockerfile文件,只能以Dockerfile命名,开头不能小写。

编译镜像,这里main二进制文件,不需要用到,可以删除

4.2 编写Dockerfile文件

#由于我电脑是arm64的芯片所以用了1.22.4-alpine3.20的镜像
FROM golang:1.22.4-alpine3.20 AS builder

LABEL author="donkor"

#设置国内软件仓库镜像
ENV GOPROXY https://goproxy.cn,direct
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

#alpine 基础镜像中没有包含时区信息文件 所以需要安装tzdata
RUN apk update --no-cache && apk add --no-cache tzdata
#设置工作目录
WORKDIR /build
#拷贝当前所有文件到build目录
COPY . .
#安装go项目依赖
RUN go mod download
#-ldflags="-s -w" -w为去掉调试信息(无法使用gdb调试),-s为去掉符号表。 -o 编译输出的名称,代替默认的包名
RUN go build -ldflags="-s -w" -o /build/main


FROM scratch
#设置时区
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai
ENV TZ Asia/Shanghai

WORKDIR /app
#拷贝编译后的二进制文件
COPY --from=builder /build/main .
#设置数据卷
VOLUME ["/app/config.yaml"]
#暴漏的端口
EXPOSE ["8080"]
#运行程序
ENTRYPOINT ["/app/main"]

由于mac电脑芯片不同,我的是arm64,所以用到了1.22.4-alpine3.20。这里第一个From可以理解是进行编译二进制文件,第二个From是构建镜像。其他的注释写的很清晰,我就不过多赘述。

terminal中输入uname -a可以查到自己mac电脑芯片的处理器
DockerHub arm64 golang镜像地址

4.3 构建镜像

terminal中构建镜像,docker/my_gin_demo为镜像名。如果构建失败了,那你要想想是不是网络问题,或者是命令没有写对。

docker build -t docker/my_gin_demo:v1 .

成功后输出

也可以通过docker images查看镜像是否创建成功

4.4 运行容器

交互运行的方式后台启动名称为mygindemo01端口8080映射给8899,挂载容器内/app/config.yaml文件的容器

docker run -itd --name mygindemo01 -p 8899:8080 -v 你的主机目录/config.yaml:/app/config.yaml 容器id

也可以写成,一般建议用下面这种方式,如果太长了可以写个.sh文件。

docker run -itd --name mygindemo01 \
-p 8899:8080 \
-v 你的主机目录/config.yaml:/app/config.yaml \
容器id

4.5 本地测试运行

通过docker ps查看容器是否创建运行成功

在terminal执行如下代码

curl 127.0.0.1:8899 

当看到控制台输出如下字符串就说明gindemo项目服务跑起来了
{"Mysql":{"Url":"127.0.0.1","Port":330678}}%
修改本机config.yaml文件

mysql:
  url: 127.0.0.1
  port: 3306

通过重启容器docker restart 容器ID,在terminal再次执行curl 127.0.0.1:8899 ,本机文件挂载容器成功。

五、总结

今天周六端午节第一天,祝大家端午节安康。

标签:文件,Dockerfile,Dokcerfile,yaml,go,Docker,main,config
From: https://blog.csdn.net/donkor_/article/details/139545822

相关文章

  • 【四种语言一网打尽(C\C++\Python\Golang)】L1-005 考试座位号
    L1-005考试座位号每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着......
  • Docker 的基本概念和优势,以及在应用程序开发中的实际应用
    Docker是一种容器化平台,它可以帮助开发人员将应用程序及其所有依赖项打包到一个可移植的容器中。这个容器可以在不同的操作系统和环境中运行,而无需重新配置或安装依赖项。以下是Docker的基本概念和优势:基本概念:1.镜像(Image):一个Docker镜像包含了一个完整的、可运行的应用程序......
  • Dragon Boat Festival
    TodayisJune6th,theDragonBoatFestivaliscoming.TheoreignofthefestivalistomemorizeQuYuan,afamouspatrioticpoet.Asthetimewentby,plentyofactivitiesgraduallycameintobeingsuchaswrappingzongzi,racingdragonboatsandsoon.Nowa......
  • 【NAS】绿联NAS UGOS PRO 使用natfrp(Sakura Frp)内网穿透访问Docker应用
    配置加速https://registry.cn-hongkong.aliyuncs.com下载镜像创建容器【容器】-【创建】-【手动创建】-选择你下载的镜像即可在日志中查看密码访问容器以HTTPS方式访问容器输入从日志中得到的密码。然后去官网查看访问密钥(不知道官网的就去看截图上的URL)将得到的密......
  • Rockmongo详解:高效管理MongoDB的图形化利器
    Rockmongo是一个开源的MongoDB管理工具,提供了图形用户界面(GUI),便于用户对MongoDB数据库进行管理和操作。通过Rockmongo,可以直观地浏览和操作MongoDB数据库,适合不熟悉命令行操作的用户。基本语法Rockmongo不涉及特定的编程语法,但它提供了许多GUI功能来执行Mongo......
  • 通过 Docker 启动的 .NET Core 解决方案无法找到本地 Microsoft SQL Server
    我遇到的问题是,当我使用Docker启动.NETCore项目时,无法找到在本地(而不是作为容器)运行的MicrosoftSQLServer。SwaggerUI的响应如下所示。TypeError:NetworkErrorwhenattemptingtofetchresource.这是我的连接。这是我的连接字符串......
  • Spring Boot、MongoDB、Vue 2和Nginx实现一个小说网站
    在本篇文章中,我们将带你逐步实现一个完备的小说网站项目,技术栈包括SpringBoot、MongoDB、Vue2和Nginx。1.项目概述我们将实现一个基本的小说网站,包含以下主要部分:后端API:使用SpringBoot实现,负责处理数据和业务逻辑。数据库:使用MongoDB存储小说数据。前端页面:使用Vue2实......
  • 2024-06-08:用go语言,给定三个正整数 n、x和y, 表示城市中的房屋数量以及编号为x和y的两
    2024-06-08:用go语言,给定三个正整数n、x和y,表示城市中的房屋数量以及编号为x和y的两个特殊房屋。在这座城市中,房屋通过街道相连。对于每个编号i(1<=i<n),存在一条连接第i个房屋与第(i+1)个房屋的街道。此外,还有一条特殊街道连接编号为x的房屋与编号为y的房屋。对于每个k(1<=......
  • Docker与银河麒麟的兼容性问题
    Docker与银河麒麟的兼容性问题背景大过节的出差.客户想迁移环境,优先使用银河麒麟的系统.有一个需要使用容器docker运行nginx的的需求结果发现被坑的很惨.所以记录一下问题以及解决方案安装完docker后发现dockerrun提示没有权限.docker:Errorresponsefr......
  • 关于继承djangon内置模型AbstractUser用户认证authenticate一直返回None
    为了想要使用django内置的auth_user表字段,但是有些字段没有,想要定制于是我们可以:首先导入:fromdjango.contrib.auth.modelsimportUser,AbstractUserfromdjango.dbimportmodels然后这么写:classUserInfo(AbstractUser):"""用户信息"""nid=m......