Docker 部署Go Web应用

简介: 随着Go的逐渐流行,基于性能、高效及稳定部署,越来越多的企业开始将其应用框架移植至Go平台。本文主要基于Goland开发平台和Docker容器环境运行,简要介绍Go语言开发的Web项目的容器化部署相关操作。

      随着Go的逐渐流行,基于性能、高效及稳定部署,越来越多的企业开始将其应用框架移植至Go平台。本文主要基于Goland开发平台和Docker容器环境运行,简要介绍Go语言开发的Web项目的容器化部署相关操作。

      以下Demo主要简单实现登陆、注册等相关功能,具体如下:

      部分源码如下:


package main
import (
  "crypto/md5"
  "database/sql"
  "encoding/json"
  "fmt"
  _"github.com/go-sql-driver/mysql"
  "io"
  "net/http"
)
func main() {
  mux := http.NewServeMux()
  mux.HandleFunc("/login", login)
  mux.HandleFunc("/register", register)
  http.ListenAndServe(":9090", mux) //监听9090端口
}
type result struct { //定义返回数据格式
  Code int
  Msg  string
  Data []string
}
func login(w http.ResponseWriter, r *http.Request) { //登陆
  w.Header().Set("Access-Control-Allow-Origin", "*") //允许跨域
  r.ParseForm()
  username, found1 := r.Form["username"]
  password, found2 := r.Form["password"]
  if !(found1 && found2) {
    io.WriteString(w, "请勿非法访问")
    return
  }
  db, err := sql.Open("mysql", "root@tcp(192.168.1.1:3306)/demo?charset=utf8") //登陆msyql
  if err != nil {
    fmt.Println(err)
  }
  defer db.Close()
  var post_data PostData
  post_data.user_name = username[0]
  post_data.pass_word = password[0]
  var filter_data FilterData = post_data
  post_data = filter_data.formatData()
  var row *sql.Row
  row = db.QueryRow("select * from users where username = ? and password = ?", post_data.user_name, post_data.pass_word)
  var user_name, pass_word string
  var id int
  err = row.Scan(&id, &user_name, &pass_word) //遍历结果
  if err != nil {
    arr := &result{
      500,
      "登陆失败",
      []string{},
    }
    b, json_err := json.Marshal(arr) //json化结果集
    if json_err != nil {
      fmt.Println("encoding faild")
    } else {
      io.WriteString(w, string(b)) //返回结果
    }
  } else {
    arr := &result{
      200,
      "登陆成功",
      []string{},
    }
    b, json_err := json.Marshal(arr) //json化结果集
    if json_err != nil {
      fmt.Println("encoding faild")
    } else {
      io.WriteString(w, string(b)) //返回结果
    }
  }
}
func register(w http.ResponseWriter, r *http.Request) { //注册
  w.Header().Set("Access-Control-Allow-Origin", "*") //允许跨域
  r.ParseForm()
  username, found1 := r.Form["username"]
  password, found2 := r.Form["password"]
  if !(found1 && found2) {
    io.WriteString(w, "请勿非法访问")
    return
  }
  db, err := sql.Open("mysql", "root@tcp(192.168.1.1:3306)/demo?charset=utf8")
  if err != nil {
    io.WriteString(w, "连接数据库失败")
    return
  }
  defer db.Close() //在返回前关闭资源(延迟)
  var post_data PostData
  post_data.user_name = username[0]
  post_data.pass_word = password[0]
  var filter_data FilterData = post_data
  post_data = filter_data.formatData()
  _, err = db.Exec("insert into users(username, password) values(?,?)", post_data.user_name, post_data.pass_word) //插入数据
  if err != nil {
    arr := &result{
      500,
      "注册失败",
      []string{},
    }
    b, json_err := json.Marshal(arr) //json化结果集
    if json_err != nil {
      fmt.Println("encoding faild")
    } else {
      io.WriteString(w, string(b)) //返回结果
    }
  } else {
    arr := &result{
      200,
      "注册成功",
      []string{},
    }
    b, json_err := json.Marshal(arr) //json化结果集
    if json_err != nil {
      fmt.Println("encoding faild")
    } else {
      io.WriteString(w, string(b)) //返回结果
    }
  }
}
type FilterData interface { //定义数据接口
  formatData() PostData
}
type PostData struct { //定义传递数据结构体
  user_name string
  pass_word string
}
func (post_data PostData) formatData() PostData { //格式化数据
  post_data.pass_word = mdFormat(post_data.pass_word)
  return post_data
}
func mdFormat(data string) string { //对字符串进行md5加密
  t := md5.New()
  io.WriteString(t, data)
  return fmt.Sprintf("%x", t.Sum(nil))
}

      程序运行结果:

      至此,一个简单的Go Web程序开发完成,现在我们将其进行容器化部署。

      编写Dockerfile文件,具体内容如下所示:


[administrator@JavaLangOutOfMemory go-Pro ]% vi Dockerfile
FROM golang:latest
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64
WORKDIR /build
COPY . .
RUN go build -o appDemo .
WORKDIR /dist
RUN cp /build/appDemo .
EXPOSE 9090
CMD ["/dist/appDemo"]

      在项目目录下,执行下面的命令创建镜像,并指定镜像名称为:go-web-appdemo,具体如下所示:


[administrator@JavaLangOutOfMemory go-Pro ]% docker build . -t go-web-appdemo      
Sending build context to Docker daemon  22.36MB
Step 1/9 : FROM golang:latest
 ---> 1463476d8605
Step 2/9 : ENV GO111MODULE=on     CGO_ENABLED=0     GOOS=linux     GOARCH=amd64
 ---> Using cache
 ---> ffaaa4db652f
Step 3/9 : WORKDIR /build
 ---> Using cache
 ---> d540d5215e29
Step 4/9 : COPY . .
 ---> 2ce72619b717
Step 5/9 : RUN go build -o appDemo .
 ---> Running in d6541a17758c
 ... ...
Successfully built 2ce72619b717
Successfully tagged go-web-appdemo:latest

       此时,go-web-appdemo容器镜像已构建完成,启动容器,如下所示:


[administrator@JavaLangOutOfMemory go-Pro ]% docker run -itd -p 9090:9090 --name luga-go-web-appdemo go-web-appdem

       再次通过浏览器访问,结果如下:

       至此,一个简单的Go Web容器构建完成,并运行成功。

相关文章
kde
|
1月前
|
应用服务中间件 网络安全 nginx
手把手教你使用 Docker 部署 Nginx 教程
本文详解Nginx核心功能与Docker部署优势,涵盖镜像拉取、容器化部署(快速、挂载、Compose)、HTTPS配置及常见问题处理,助力高效搭建稳定Web服务。
kde
696 4
|
1月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
215 4
|
1月前
|
应用服务中间件 Linux nginx
在虚拟机Docker环境下部署Nginx的步骤。
以上就是在Docker环境下部署Nginx的步骤。需要注意,Docker和Nginix都有很多高级用法和细节需要掌握,以上只是一个基础入门级别的教程。如果你想要更深入地学习和使用它们,请参考官方文档或者其他专业书籍。
109 5
|
1月前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
|
2月前
|
存储 Docker Python
docker 部署 sftp
本文介绍SFTP服务的部署与配置,包括users.conf用户配置规则、Docker容器运行命令及上传目录权限说明,重点解析atmoz/sftp镜像的chroot机制与子目录映射,确保用户登录后正确访问/upload目录,并提供Python脚本实现文件上传示例。
209 12
docker 部署 sftp
|
2月前
|
运维 Linux 数据库
基于 Docker 部署 n8n 指南,新手一看就会
本教程详解如何通过 Docker 快速部署开源自动化工具 n8n,适合新手快速上手。内容涵盖官方部署步骤、常见难点及第三方一键部署方案,助你高效搭建自动化工作流平台。
1017 6
kde
|
1月前
|
存储 NoSQL Redis
手把手教你用 Docker 部署 Redis
Redis是高性能内存数据库,支持多种数据结构,适用于缓存、消息队列等场景。本文介绍如何通过Docker快速拉取轩辕镜像并部署Redis,涵盖快速启动、持久化存储及docker-compose配置,助力开发者高效搭建稳定服务。
kde
624 7
kde
|
1月前
|
存储 搜索推荐 数据库
🚀 RAGFlow Docker 部署全流程教程
RAGFlow是开源的下一代RAG系统,融合向量数据库与大模型,支持全文检索、插件化引擎切换,适用于企业知识库、智能客服等场景。支持Docker一键部署,提供轻量与完整版本,助力高效搭建私有化AI问答平台。
kde
1621 8
|
1月前
|
开发框架 前端开发 Go
【GoGin】(0)基于Go的WEB开发框架,GO Gin是什么?怎么启动?本文给你答案
Gin:Go语言编写的Web框架,以更好的性能实现类似Martini框架的APInet/http、Beego:开源的高性能Go语言Web框架、Iris:最快的Go语言Web框架,完备的MVC支持。
336 1
下一篇
oss云网关配置