使用 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,调整环境变量、配置文件等,来适应不同的部署需求。

相关推荐
Java水解4 分钟前
深入浅出:在 Koa 中实现优雅的中间件依赖注入
后端·koa
lssjzmn15 分钟前
构建实时消息应用:Spring Boot + Vue 与 WebSocket 的有机融合
java·后端·架构
Spider_Man18 分钟前
打造属于你的前端沙盒 🎉
前端·typescript·github
金銀銅鐵18 分钟前
[Java] 浅析可重复注解(Repeatable Annotation) 是如何实现的
java·后端
用户81744134274819 分钟前
Kubernetes集群核心概念 Service
后端
用户479492835691520 分钟前
🤫 你不知道的 JavaScript:`"👦🏻".length` 竟然不是 1?
前端·javascript·面试
掘金一周21 分钟前
凌晨零点,一个TODO,差点把我们整个部门抬走 | 掘金一周 9.11
前端·人工智能·后端
yeyong22 分钟前
日志告警探讨,我问deepseek答,关于elastalert
后端
沐怡旸23 分钟前
【底层机制】稀疏文件--是什么、为什么、好在哪、实现机制
c++·面试
Cyan_RA927 分钟前
SpringMVC 执行流程分析 详解(图解SpringMVC执行流程)
java·人工智能·后端·spring·mvc·ssm·springmvc