本文以部署 Go Web 程序为例,介绍了在 CentOS7 服务器上部署 Go 语言程序的若干方法。
一、独立部署
Go 语言支持跨平台交叉编译,也就是说我们可以在 Windows 或 Mac 平台下编写代码,并且将代码编译成能够在 Linux amd64 服务器上运行的程序。
对于简单的项目,通常我们只需要将编译后的二进制文件拷贝到服务器上,然后设置为后台守护进程运行即可。
1、编译
编译可以通过以下命令或编写 makefile 来操作。下面是mac下的命
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./bin/程序名
如果嫌弃编译后的二进制文件太大,可以在编译的时候加上-ldflags "-s -w"
参数去掉符号表和调试信息,一般能减小20%的大小。
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" -o ./bin/程序名
其他不同平台的打包语法
windows:
set CGO_ENABLED=0 //禁用CGO
set GOOS=linux //目标平台为linux
set GOARCH=amd64 //目标处理器架构是amd64
go build -o name //编译可执行文件到当前目录 (-o:自定义文件名)
mac:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
2、运行
nohup 用于在系统后台不挂断地运行命令,不挂断指的是退出执行命令的终端也不会影响程序的运行。
我们可以使用 nohup 命令来运行应用程序,使其作为后台守护进程运行。由于在主流的 Linux 发行版中都会默认安装 nohup 命令工具,我们可以直接输入以下命令来启动我们的项目:
nohup ./bin/程序名 > run.log 2>&1 &
二、Docker部署
1、安装docker
参考文章:
【Docker技术内幕】(四)Linux环境下安装docker_linux 7.9安装docker-CSDN博客
2、新建Dockerfile
#指定构建镜像的基础镜像
FROM golang:latest AS builder
#开发者
MAINTAINER who
# 为我们的镜像设置必要的环境变量
ENV GO111MODULE=on \
GOPROXY=https://goproxy.cn,direct \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64
#设置工作目录,后面的RUN,COPY等都基于在这个目录下工作
WORKDIR /goApp
# 复制项目文件到工作目录
COPY . .
# 编译应用程序成二进制文件app
RUN go build -o app
###################
# 接下来创建一个小镜像
###################
FROM scratch
WORKDIR /goApp
# 从第一阶段复制二进制文件到当前阶段
COPY --from=builder /goApp/app .
#容器暴露的端口
EXPOSE 8080
#启动容器时运行的命令
CMD ["./app"]
3、构建镜像
docker build . -t goweb_app
4、查看镜像
docker images|grep goweb
5、启动容器
docker run -d -p 8080:8080 --restart always goweb_app