Go 在 Linux 下的容器化应用探索
一 核心方案与适用场景
二 从零到一的容器化流程
三 关键实践清单
四 示例与命令速查
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 main ./cmd/api
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /app
COPY --from=builder /app/main .
RUN addgroup -g 1001 -S appuser && adduser -u 1001 -S appuser -G appuser
USER appuser
EXPOSE 8080
CMD ["./main"]
docker build -t go-web-server:latest .
docker run -d -p 8080:8080 --name go-web go-web-server:latest
version: "3.8"
services:
go-app:
image: go-web-server:latest
container_name: my-go-app
restart: always
working_dir: /app
volumes:
- ./config.yaml:/app/config.yaml:ro
network_mode: "host" # 大量端口或低开销场景
command: ["./main", "-c", "/app/config.yaml"]
logging:
driver: "json-file"
options:
max-size: "10m"
docker-compose up -d
docker-compose logs -f go-app
docker-compose stop go-app
docker-compose restart go-app
[Unit]
Description=My Go Application
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/root/app
ExecStart=/root/app/myapp -c /root/app/config.yaml
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now myapp
journalctl -u myapp -f
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-web
spec:
replicas: 3
selector: { matchLabels: { app: go-web } }
template:
metadata: { labels: { app: go-web } }
spec:
containers:
- name: go-web
image: go-web-server:latest
ports: [{ containerPort: 8080 }]
resources:
requests: { cpu: "100m", memory: "128Mi" }
limits: { cpu: "500m", memory: "256Mi" }
livenessProbe:
httpGet: { path: /health, port: 8080 }
initialDelaySeconds: 10
periodSeconds: 5
readinessProbe:
httpGet: { path: /ready, port: 8080 }
initialDelaySeconds: 5
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: go-web-svc
spec:
selector: { app: go-web }
ports: [{ port: 80, targetPort: 8080 }]
type: ClusterIP
以上示例覆盖了多阶段构建、非 root 运行、Compose 自启与日志轮转、host 网络、Systemd 原生守护以及 K8s 最小部署要点。