使用docker线上部署项目

使用docker部署go项目

创建go项目

mkdir test_docker
cd test_docker
code .

初始化一下项目

go mod init test_docker

创建一个gin项目

创建一个gin项目,这里以gin为例,其他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": "golang-tech-stack.com",
		})
	})
	r.Run() // listen and serve on 0.0.0.0:8080
}

创建Dockerfile

FROM golang:1.18-alpine

# 为我们的镜像设置必要的环境变量
ENV GO111MODULE=on \
    GOPROXY=https://goproxy.cn,direct \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64
 
WORKDIR /project/go-docker/
 
# COPY go.mod, go.sum and download the dependencies
COPY go.* ./
RUN go mod download
 
# COPY All things inside the project and build
COPY . .
RUN go build -o /project/go-docker/build/myapp .
 
EXPOSE 8080
ENTRYPOINT [ "/project/go-docker/build/myapp" ]
  • FROM golang:1.16-alpine: 将golang:1.16-alpine用作此 Docker 构建的基础镜像。
  • ENV: 环境配置,配置代理,编译环境。
  • WORKDIR:工作目录路径。
  • COPY go.* ./:从项目复制go.mod&go.sum文件到工作目录。
  • RUN go mod download :从 go modules 下载项目依赖。
  • COPY . . :将我们项目中的所有内容复制到工作目录中。
  • RUN go build -o /project/go-docker/build/myapp .: 在工作目录中构建我们的项目并将其project/go-docker/build/myapp作为二进制文件输出。
  • EXPOSE 8080:告诉 docker 我们的代码将暴露端口8080。
  • ENTRYPOINT ["/project/go-docker/build/myapp"] ,当我们运行这个镜像的容器时,它将从我们的构建可执行文件开始执行。

运行docker命令

docker build -f Dockerfile -t test-go-docker:latest .
  • -f flag 是我们的Dockerfile.
  • -t tag 是镜像标签。
  • .命令是当前文件夹下的Dockerfile.

查看docker镜像

docker images

运行镜像

docker run -d -p 8080:8080 test-go-docker:latest

测试

http://192.168.179.128:8080/ping

运行结果

{"message":"golang-tech-stack.com"}

避坑指南

  1. 要配置ENV,GOPROXY 否则无法下载镜像
  2. 基础镜像版本要和go mod中的go版本一致

=========================

如果涉及数据库,可以直接文件里调用远程服务器的数据库

前提是远程数据库要开启权限

//赋予任何主机访问数据的权限

例如,你想root使用mypassword从任何主机连接到mysql服务器的话。

12GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'mypassword' WI TH GRANT OPTION;

如果你想允许用户myuser从ip为192.168.1.6的主机连接到mysql服务器,并使用mypassword作为密码

12GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.3'IDENTIFIED BY'mypassword' WITH GRANT OPTION;

然后宝塔面板放行3306端口