Skip to content

Docker 容器生命周期 · 从 Go HTTP 示例构建到启动至21. 官方参考 ​

返回分篇目录

先启动服务,再观察和排查,最后停止、更新和清理。

环境变量、标签与运行基线在创建时一并决定;历史 Go HTTP 构建例见完整练习。Dockerfile 指令解释与镜像仓库操作分别见 Dockerfile 和 镜像仓库。

从 Go HTTP 示例构建到启动 ​

先查单条指令时,可直接进入 Dockerfile 指南的对应章节,再继续下面的构建练习:

指令具体说明
FROM选择基础镜像
RUN构建时执行命令
COPY / ADD复制与解包行为
WORKDIR设置工作目录
ENV区分构建参数与运行环境
CMD / ENTRYPOINT默认参数、入口与覆盖方式
EXPOSE声明端口与实际发布端口的区别
LABEL镜像元数据;旧 MAINTAINER 改用标签
  • 创建main.go 执行 go mod init dockerhttp
go
package main

import (
        "fmt"
        "net/http"
)

func main() {
        http.HandleFunc("/", hello)
        server := &http.Server{
                Addr: ":8888",
        }
  fmt.Println("server startup...")
        if err := server.ListenAndServe(); err != nil {
                fmt.Printf("server startup failed, err:%v\n", err)
        }
}

func hello(w http.ResponseWriter, _ *http.Request) {
        w.Write([]byte("docker http yes Cc36048!"))
}
  • 创建 Dockerfile
dockerfile
# 使用Go的官方映像作为基础映像。这个映像是alpine预安装的。该映像的$GOPATH值已被设置为/go。所有安装在/go/src的程序包都能通过go命令访问。
FROM golang:alpine
# 注释
LABEL author="example-user"
LABEL version="V1.1"
# 为我们的镜像设置必要的环境变量
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64
# 移至工作目录,存在侧移动到此目录,不存在侧创建次目录
WORKDIR /opt
# 使用 pwd 查看所在当前目录位置
COPY . .
RUN pwd
RUN go mod tidy
RUN go build -o imagesServer .
# 通过开发计算机上容器的8888端口暴露该应用程序。最后一行,
EXPOSE 8888/tcp
ENTRYPOINT ["/opt/imagesServer"]
  • docker build

进入包含 main.go 和 Dockerfile 的项目目录,给镜像打本地标签,再映射示例监听的 8888 端口:

bash
docker build -t dockerhttp:local .
docker run --rm --name dockerhttp -p 127.0.0.1:8888:8888 dockerhttp:local
# 在另一个终端验证
curl -fsS http://127.0.0.1:8888/

原例使用浮动的 golang:alpine 和单阶段构建,用于理解 COPY、RUN 与 ENTRYPOINT 的执行顺序。正式构建的固定版本、多阶段与缓存策略见 Dockerfile。原 tcpserver 的 GOPATH 挂载路径与此 HTTP 示例不同,不应拼接成同一个启动步骤。

历史环境中的独立操作 ​

Docker daemon 未启动 ​

旧记录在 CentOS 中执行 docker images 报 Cannot connect to the Docker daemon at unix:///var/run/docker.sock,启动服务后恢复。先确认目标主机的 Docker 服务状态与当前连接目标;这条错误本身不能证明只有“服务未启动”一种原因。进一步诊断见 Docker 排障。

镜像保存与私有仓库 ​

bash
# 保存镜像为 tar;这是镜像备份,不是容器数据备份
docker save -o name.tar tcpserver:latest

# 来源中的阿里云仓库示例;替换账号、镜像和版本
docker login --username=<username> registry.cn-hangzhou.aliyuncs.com
docker tag <image-id> registry.cn-hangzhou.aliyuncs.com/chaochengli/tcpserverandcluster:<version>
docker push registry.cn-hangzhou.aliyuncs.com/chaochengli/tcpserverandcluster:<version>

容器可写层、卷与数据的备份边界见 存储 和 维护与备份。

Portainer 旧部署记录 ​

2019 年来源曾用 portainer/portainer、宿主机 9000 端口和 Docker socket 挂载部署可视化界面。该镜像名与版本未固定,记录也未说明 TLS/访问控制,不作为当前安装步骤;保留此处用于解释旧环境中的容器。需要实际部署时应按目标版本的官方文档重新核对镜像和权限。

21. 官方参考 ​

继续阅读