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容器构建完成,并运行成功。

相关文章
|
17天前
|
前端开发 JavaScript 安全
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第27天】本文介绍了HTTP/2和HTTPS在前端性能调优中的应用。通过多路复用、服务器推送和头部压缩等特性,HTTP/2显著提升了Web性能。同时,HTTPS确保了数据传输的安全性。文章提供了示例代码,展示了如何使用Node.js创建一个HTTP/2服务器。
30 3
|
7天前
|
人工智能 API 数据安全/隐私保护
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
NextChat 是一个可以在 GitHub 上一键免费部署的私人 ChatGPT 网页应用,支持 GPT3、GPT4 和 Gemini Pro 模型。该项目在 GitHub 上获得了 63.8k 的 star 数。部署简单,只需拉取 Docker 镜像并运行容器,设置 API Key 后即可使用。此外,NextChat 还提供了预设角色的面具功能,方便用户快速创建对话。
57 22
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
|
4天前
|
缓存 安全 网络安全
HTTP/2与HTTPS在Web加速中的应用
HTTP/2与HTTPS在Web加速中的应用
|
7天前
|
SQL 安全 前端开发
PHP与现代Web开发:构建高效的网络应用
【10月更文挑战第37天】在数字化时代,PHP作为一门强大的服务器端脚本语言,持续影响着Web开发的面貌。本文将深入探讨PHP在现代Web开发中的角色,包括其核心优势、面临的挑战以及如何利用PHP构建高效、安全的网络应用。通过具体代码示例和最佳实践的分享,旨在为开发者提供实用指南,帮助他们在不断变化的技术环境中保持竞争力。
|
8天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
9天前
|
Go 数据处理 API
Go语言在微服务架构中的应用与优势
本文摘要采用问答形式,以期提供更直接的信息获取方式。 Q1: 为什么选择Go语言进行微服务开发? A1: Go语言的并发模型、简洁的语法和高效的编译速度使其成为微服务架构的理想选择。 Q2: Go语言在微服务架构中有哪些优势? A2: 主要优势包括高性能、高并发处理能力、简洁的代码和强大的标准库。 Q3: 文章将如何展示Go语言在微服务中的应用? A3: 通过对比其他语言和展示Go语言在实际项目中的应用案例,来说明其在微服务架构中的优势。
|
7天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
7天前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
|
9天前
|
运维 开发者 Docker
Docker Compose:简化容器化应用的部署与管理
Docker Compose:简化容器化应用的部署与管理
|
15天前
|
JavaScript 持续交付 Docker
解锁新技能:Docker容器化部署在微服务架构中的应用
【10月更文挑战第29天】在数字化转型中,微服务架构因灵活性和可扩展性成为企业首选。Docker容器化技术为微服务的部署和管理带来革命性变化。本文探讨Docker在微服务架构中的应用,包括隔离性、可移植性、扩展性、版本控制等方面,并提供代码示例。
52 1