阅读量:31
Linux系统下Go应用容器化部署指南(以CentOS为例)
1. 准备工作:安装Docker
在Linux系统(如CentOS)上部署Go应用容器前,需先安装Docker。以下是CentOS的安装步骤:
- 更新系统包:
sudo yum update -y - 安装必要工具:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 - 添加Docker官方仓库:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo - 安装Docker CE:
sudo yum install -y docker-ce docker-ce-cli containerd.io - 启动并设置开机自启:
sudo systemctl start docker&&sudo systemctl enable docker
安装完成后,可通过docker --version验证是否成功。
2. 创建Go应用(若未存在)
若已有Go应用,可跳过此步骤。否则,创建一个简单的HTTP服务作为示例:
- 初始化Go模块:
go mod init my-go-app(将my-go-app替换为你的项目名称) - 编写main.go:
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello from Go in Docker!") }) fmt.Println("Server started on port 8080") http.ListenAndServe(":8080", nil) } - 测试本地运行:
go run main.go,然后在浏览器访问http://localhost:8080,确认输出Hello from Go in Docker!。
3. 编写Dockerfile
Dockerfile是容器化的核心配置文件,用于定义镜像构建流程。以下是优化后的多阶段构建Dockerfile(推荐):
# 第一阶段:构建阶段(使用官方Golang镜像)
FROM golang:1.23-alpine AS builder
WORKDIR /app
# 复制依赖文件(避免每次复制全部代码)
COPY go.mod go.sum ./
# 下载依赖(缓存机制,减少重复下载)
RUN go mod download
# 复制源码
COPY . .
# 静态编译(CGO_ENABLED=0),适配Alpine等轻量级镜像
RUN CGO_ENABLED=0 GOOS=linux go build -o my-go-app .
# 第二阶段:运行阶段(使用Alpine镜像,减小体积)
FROM alpine:latest
WORKDIR /root/
# 从构建阶段复制二进制文件
COPY --from=builder /app/my-go-app .
# 暴露端口(与Go应用监听端口一致)
EXPOSE 8080
# 容器启动命令
CMD ["./my-go-app"]
关键说明:
- 多阶段构建:第一阶段用
golang镜像构建,第二阶段用alpine(轻量级)镜像运行,最终镜像大小可控制在10MB以内; - 静态编译:
CGO_ENABLED=0确保二进制文件不依赖系统库,适配Alpine等无glibc的镜像; - 依赖缓存:先复制
go.mod/go.sum并下载依赖,后续修改源码时不会重复下载依赖。
4. 构建Docker镜像
在包含Dockerfile的Go项目根目录下,运行以下命令构建镜像:
docker build -t my-go-app:latest .
-t my-go-app:latest:指定镜像名称(my-go-app)和标签(latest);.:表示Dockerfile位于当前目录。
构建完成后,可通过docker images查看镜像列表。
5. 运行Docker容器
使用构建好的镜像启动容器:
docker run -d -p 8080:8080 --name my-go-container my-go-app:latest
-d:后台运行容器;-p 8080:8080:将容器的8080端口映射到主机的8080端口;--name my-go-container:指定容器名称(便于管理)。
运行后,通过docker ps查看容器状态,确认容器处于Up状态。
6. 验证部署
在浏览器或终端访问http://localhost:8080,若看到Hello from Go in Docker!'的输出,说明部署成功。
也可通过以下命令查看容器日志:
docker logs -f my-go-container
应显示Server started on port 8080的启动信息。
7. 常用Docker命令
- 查看运行中的容器:
docker ps - 查看所有容器(包括停止的):
docker ps -a - 停止容器:
docker stop my-go-container(替换为你的容器名称) - 删除容器:
docker rm my-go-container - 删除镜像:
docker rmi my-go-app:latest - 进入容器调试:
docker exec -it my-go-container /bin/sh。
8. 优化建议(可选)
.dockerignore文件:在项目根目录创建.dockerignore,排除不必要的文件(如node_modules/、.git/、*.log),减少构建上下文大小,加快构建速度。- 环境变量配置:通过
ENV指令在Dockerfile中设置环境变量(如ENV PORT=8080),或在运行容器时通过-e传递(如docker run -e PORT=9090 ...),提高灵活性。 - 健康检查:在Dockerfile中添加
HEALTHCHECK指令,定期检查应用状态(如HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost:8080 || exit 1)。