Go 在 Linux 的容器化应用实践
一 快速上手
my-go-app/
├── main.go
├── go.mod
└── go.sum
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, Dockerized Go!\n")
})
http.ListenAndServe(":8080", nil)
}
# 构建阶段
FROM golang:1.21 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o app
# 运行阶段
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /app
COPY --from=builder /app/app .
EXPOSE 8080
CMD ["./app"]
docker build -t my-go-app .
docker run -d -p 8080:8080 my-go-app
curl http://localhost:8080
二 生产级 Dockerfile 与工程化
.git
.gitignore
README.md
Dockerfile
*.log
vendor/
HEALTHCHECK --interval=30s --timeout=10s \
CMD wget --spider http://localhost:8080/health || exit 1
FROM alpine:latest
RUN apk add --no-cache tzdata ca-certificates && \
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone && \
apk del tzdata
WORKDIR /app
COPY --from=builder /app/app .
EXPOSE 80
CMD ["./app"]
docker build -t my-go-app:1.0.0 .
docker run -d --name app -p 8080:8080 my-go-app:1.0.0
docker ps -f name=app
docker logs -f app
三 多容器与本地开发
version: "3.8"
services:
app:
build: .
ports:
- "8080:8080"
environment:
- DB_HOST=db
- DB_USER=root
- DB_PASSWORD=example
- DB_NAME=appdb
depends_on:
db:
condition: service_healthy
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: appdb
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u$$MYSQL_USER", "-p$$MYSQL_PASSWORD"]
interval: 10s
timeout: 5s
retries: 5
docker-compose up -d
docker-compose logs -f app
docker-compose down --volumes
四 Linux 环境准备与最小化部署
sudo apt update
sudo apt install -y docker.io
sudo systemctl enable --now docker
sudo usermod -aG docker $USER # 重新登录后生效
sudo yum update -y
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
# 构建
docker build -t my-go-app:latest .
# 前台运行便于排错
docker run --rm -p 8080:8080 my-go-app:latest
# 后台运行
docker run -d --name app -p 8080:8080 my-go-app:latest
五 进阶与原理