使用 Docker 部署 Go 项目(Beego 框架)

背景

Beego 是一个基于 Go 语言的开源 Web 应用框架,它具有强大的功能和易于使用的特性。使用 Docker 部署 Go 项目,尤其是 Beego 框架,可以让项目的部署过程变得更加简便和一致。通过容器化技术,我们能够轻松地在各种环境中部署、测试和运行 Go 项目。

目标

本文将介绍如何使用 Docker 部署一个基于 Beego 框架的 Go 项目。整个过程包括:

  1. 准备 Beego 项目代码
  2. 编写 Dockerfile
  3. 构建 Docker 镜像
  4. 运行 Docker 容器

1. 准备 Beego 项目代码

首先,创建一个简单的 Beego 项目,假设我们已经安装了 Go 语言和 Beego 框架。如果你还没有安装,可以按照以下步骤进行安装:

bash 复制代码
bash
# 安装 Beego 框架
go get github.com/astaxie/beego

# 安装 Beego 的工具 b
go get github.com/beego/bee

接下来,创建一个新的 Beego 项目:

创建webapi目录

创建/wwwroot/myproject,将web api程序文件存放在此目录下

bash 复制代码
mkdir -p /wwwroot/myproject

开放webapi端口

web api预使用8001端口,需要对外开放8001端口,端口配置步骤如下:

防火墙相关命令

Ubuntu中使用防火墙和开放端口

centos

bash 复制代码
# 查看防火墙状态
systemctl status firewalld

# 启动防火墙
systemctl start firewalld

# 重新启动防火墙
firewall-cmd --reload

# 关闭防火墙命令:
systemctl stop firewalld

ubuntu

bash 复制代码
# 查看防火墙状态
sudo ufw status

# 安装防火墙
sudo sudo apt-get install ufw

# 启动防火墙
sudo ufw enable

# 重新启动防火墙
sudo ufw reload

# 关闭防火墙命令:
sudo ufw disable

查看防火墙状态

系统提示: "Status: inactive"状态:不活跃,上面提示表示没有开启防火墙,并不是没有安装防火墙

启动防火墙提示

注意:Command may disrupt existing ssh connections. Proceed with operation (y|n)?

表示:命令可能会中断现有的ssh连接。继续操作(y|n)?

端口设置

centos

csharp 复制代码
# web api预用端口
 firewall-cmd --zone=public --add-port=8001/tcp --permanent
 
 # 建议同时设置开放portainer的8090端口
 firewall-cmd --zone=public --add-port=8090/tcp --permanent
  • 命令含义:
    -- zone #作用域
    -- add-port=1935/tcp #添加端口,格式为:端口/通讯协议
    -- permanent #永久生效,没有此参数重启后失效

ubuntu

yaml 复制代码
# web api预用端口
sudo ufw allow 8081

# 建议同时设置开放portainer的8090端口
sudo ufw allow 8090

重启防火墙

centos

css 复制代码
firewall-cmd --reload

ubuntu

复制代码
sudo ufw reload

查看端口状态

centos

ini 复制代码
firewall-cmd --query-port=8001/tcp

yes 表示已开启 no表示未开启

ubuntu

perl 复制代码
sudo netstat -tunlp | grep 8001

配置好开放的端口后,建议重新关闭并停止防火墙服务。

centos

arduino 复制代码
systemctl stop firewalld

ubuntu

bash 复制代码
sudo ufw disable

关闭端口

ubuntu

arduino 复制代码
sudo ufw delete allow 8001

web 项目

项目目录

使用beego创建一个web 项目,目录结构如下:

编译运行

arduino 复制代码
bee run

访问curl http://localhost:8081/或者浏览器打开http://localhost:8081/

查看环境变量

bash 复制代码
go env

编译

win环境编译win包

bash 复制代码
go env

如果GOOS不是windows,GOARCH不是amd64

ini 复制代码
$env:GOOS = "windows"
$env:GOARCH = "amd64"
go 复制代码
go build -o beego_demo

将beego_demo上传到linux服务器

bash 复制代码
chmod +x ./beego_demo
bash 复制代码
./beego_demo

win环境编译linux包

Win下编译Linux平台64位可执行程序,在终端输入以下命令

ini 复制代码
$env:GOOS = "linux"
$env:GOARCH = "amd64"
go 复制代码
go build -o beego_demo

linux环境编译

ini 复制代码
GOOS=linux GOARCH=amd64 go build -o beego_demo
bash 复制代码
chmod +x ./beego_demo
bash 复制代码
./beego_demo

Dockerfile

Dockerfile的go版本要与项目的go.mod版本保持一致.

先手工go build后,再docker build

ini 复制代码
# 基础镜像
FROM golang:1.19

ENV GO111MODULE=on \
    TZ=Asia/Shanghai \
    CGO_ENABLE=0 \
    GOOS=linux \
    GOARCH=amd64 \
    GOPROXY="https://goproxy.cn,direct"

# 维护者
MAINTAINER longfc
# docker build 时执行命令 - 创建目录
RUN mkdir -p "/data/app" 
# 工作目录
WORKDIR "/data/app"

# 拷贝
COPY ./ /data/app

EXPOSE 8081
# docker run 时执行命令
ENTRYPOINT ["./beego_demo"]

或者先go build后与docker build执行

ini 复制代码
# 基础镜像
FROM golang:1.19 AS builder
ENV GO111MODULE=on \
    TZ=Asia/Shanghai \
    CGO_ENABLE=0 \
    GOOS=linux \
    GOARCH=amd64 \
    GOPROXY="https://goproxy.cn,direct" 
WORKDIR /build
 
ADD go.mod .
COPY . .
RUN go build -o beego_demo main.go
 
FROM golang:1.19
ENV GO111MODULE=on \
    TZ=Asia/Shanghai \
    CGO_ENABLE=0 \
    GOOS=linux \
    GOARCH=amd64 \
    GOPROXY="https://goproxy.cn,direct" 
WORKDIR /build
COPY --from=builder /build/ /build/
EXPOSE 8081
# docker run 时执行命令
CMD ["./beego_demo"]

docker build

erlang 复制代码
docker build -t beego.demo:v1.0.0 .

docker run

css 复制代码
docker run --name beego.demo -d -p 8081:8081 beego.demo:v1.0.0

http://192.168.3.150:8081/

5. 访问应用

容器启动后,你可以通过浏览器访问 Beego 应用:

arduino 复制代码
http://localhost:8080

如果一切顺利,你应该会看到 Beego 默认页面,表示应用已成功运行在 Docker 容器中。

6. 管理 Docker 容器

  • 查看容器日志

    复制代码
    bash
    docker logs mybeegoapp
  • 停止容器

    arduino 复制代码
    bash
    docker stop mybeegoapp
  • 删除容器

    bash 复制代码
    bash
    docker rm mybeegoapp
  • 删除镜像

    复制代码
    bash
    docker rmi mybeegoapp

总结

本文介绍了如何使用 Docker 部署一个基于 Beego 框架的 Go 项目。通过 Docker 的多阶段构建,我们能够将构建环境与运行环境分离,确保应用部署的高效与简洁。Docker 的使用使得开发、测试、生产环境的部署变得统一和可靠。

你可以根据自己的需求进一步优化 Dockerfile,调整环境变量、配置文件等,来适应不同的部署需求。

相关推荐
long31640 分钟前
构建者设计模式 Builder
java·后端·学习·设计模式
Noii.1 小时前
Spring Boot初级概念及自动配置原理
java·spring boot·后端
探索java1 小时前
Tomcat Server 组件原理
java·后端·tomcat
咕白m6251 小时前
通过 C# 高效提取 PDF 文本的完整指南
后端·c#
小高0071 小时前
🔥🔥🔥前端性能优化实战手册:从网络到运行时,一套可复制落地的清单
前端·javascript·面试
smallyu1 小时前
Go 语言 GMP 调度器的原理是什么
后端·go
放飞自我的Coder2 小时前
【github-action 如何为github action设置secrets/environment】
github·action
掉头发的王富贵2 小时前
ShardingSphere-JDBC入门教程(上篇)
spring boot·后端·mysql
盖世英雄酱581362 小时前
必须掌握的【InheritableThreadLocal】
java·后端
LovelyAqaurius2 小时前
乐观锁及其实现方式详解
后端