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容器化部署。多阶段构建是关键优化点,能有效减少生产环境镜像大小,提升部署效率。