Ubuntu下Golang容器化部署步骤(基于Docker)
在Ubuntu系统上,首先需要安装Docker引擎。打开终端,执行以下命令:
sudo apt update && sudo apt install docker.io -y
sudo systemctl start docker && sudo systemctl enable docker
安装完成后,通过docker --version验证是否安装成功(输出Docker版本信息则表示成功)。
在本地创建一个简单的Golang项目目录(如my-golang-app),并编写一个基础的HTTP服务代码(main.go):
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello from Golang in Docker!")
}
func main() {
http.HandleFunc("/", handler)
fmt.Println("Server started on :8080")
http.ListenAndServe(":8080", nil)
}
保存后,在项目目录下执行go run main.go,确认应用能在本地正常运行(访问http://localhost:8080应看到响应信息)。
在项目根目录(与main.go同级)创建名为Dockerfile的文件(无扩展名),内容如下:
# 第一阶段:构建(使用官方Golang镜像)
FROM golang:1.23-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./ # 仅复制依赖文件,利用Docker缓存加速构建
RUN go mod download
COPY . . # 复制全部源码
RUN CGO_ENABLED=0 GOOS=linux go build -o /app/main . # 编译为静态链接的可执行文件(适配alpine基础镜像)
# 第二阶段:运行(使用轻量级alpine镜像)
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/main . # 从构建阶段复制编译后的二进制文件
EXPOSE 8080 # 声明容器监听的端口
CMD ["/app/main"] # 容器启动时执行的命令
说明:
golang:1.23-alpine(包含Go编译环境)编译代码,第二阶段用alpine(轻量级Linux镜像,大小约5MB)仅运行编译后的二进制文件,大幅减少最终镜像大小(通常从几GB压缩到几十MB)。CGO_ENABLED=0:禁用CGO,生成纯静态链接的可执行文件,避免依赖libc等库(alpine镜像无libc,静态链接可解决兼容性问题)。EXPOSE:仅声明容器内部端口,实际端口映射需通过docker run命令实现。在项目目录下执行以下命令,构建Docker镜像(-t指定镜像名称及标签,.表示Dockerfile所在目录):
docker build -t my-golang-app:1.0 .
构建过程中,Docker会依次执行Dockerfile中的指令:拉取基础镜像、设置工作目录、复制文件、编译代码、复制二进制文件等。构建完成后,通过docker images查看镜像列表,应存在my-golang-app:1.0镜像。
使用构建好的镜像启动容器,执行以下命令:
docker run -d -p 8080:8080 --name my-golang-container my-golang-app:1.0
参数说明:
-d:后台运行容器(守护进程模式)。-p 8080:8080:将容器的8080端口映射到主机的8080端口(主机端口:容器端口)。--name:为容器指定名称(便于后续管理)。my-golang-app:1.0:使用的镜像名称及标签。通过浏览器或curl命令访问http://localhost:8080,应看到页面显示Hello from Golang in Docker!',或终端输出类似以下信息:
$ curl http://localhost:8080
Hello from Golang in Docker!
表示Golang应用已成功在Docker容器中运行。
为避免将不必要的文件(如node_modules、.git、临时文件)复制到镜像中(增加构建时间和镜像大小),可在项目根目录创建.dockerignore文件,内容如下:
.git
node_modules
*.log
*.tmp
.DS_Store
这样,docker build命令会自动忽略这些文件。
通过以上步骤,即可完成Golang应用在Ubuntu系统上的Docker容器化部署。多阶段构建是关键优化点,能有效减少生产环境镜像大小,提升部署效率。