构建HTTPS服务镜像

1、创建目录

root@localhost \~# mkdir demo5

root@localhost \~# cd demo5

2、编写main.go

root@localhost demo5# vim main.go

文件内容如下:

package main

import (

"log"

"net/http"

)

func main() {

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {

w.Write(\[\]byte("Hello, HTTPS!\n"))

})

log.Println("Server running on https://localhost:443")

err := http.ListenAndServeTLS(":443", "/etc/ssl/certs/server.crt",

"/etc/ssl/private/server.key", nil)

if err != nil {

log.Fatal("ListenAndServeTLS: ", err)

}

}

3、编写go.mod

root@localhost demo5# vim go.mod

文件内容如下:

复制代码
module github.com/yourusername/go-https-server
​
go 1.21
​
require (
        golang.org/x/crypto v0.14.0 // indirect
        golang.org/x/net v0.17.0 // indirect
        golang.org/x/sys v0.13.0 // indirect
)

4、编写go.sum

复制代码
[root@localhost demo5]# vim go.sum

文件内容如下:

复制代码
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
golang.org/x/crypto v0.14.0/go.mod
h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

5、编写Dockerfile

复制代码
[root@localhost demo5]# vim Dockerfile

文件内容如下::

复制代码
FROM golang:1.21-alpine AS builder
​
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
ENV GOPROXY=https://goproxy.cn,direct
​
RUN apk add --no-cache git make openssl
​
WORKDIR /app
​
COPY go.mod go.sum .
RUN go mod download
​
COPY . .
​
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o app
​
RUN openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
    -keyout server.key -out server.crt -subj "/CN=localhost" \
    -addext "subjectAltName=DNS:localhost,IP:127.0.0.1"
​
​
FROM alpine:3.23
​
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
​
RUN apk add --no-cache ca-certificates tzdata
​
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
​
COPY --from=builder /app/app /usr/local/bin/app
COPY --from=builder /app/server.crt /etc/ssl/certs/
COPY --from=builder /app/server.key /etc/ssl/private/
​
RUN chown appuser:appgroup /usr/local/bin/app && \
    chmod 755 /usr/local/bin/app && \
    chmod 644 /etc/ssl/certs/server.crt && \
    chmod 644 /etc/ssl/private/server.key
​
WORKDIR /home/appuser
USER appuser
​
EXPOSE 443
​
HEALTHCHECK --interval=30s --timeout=3s \
   CMD wget --no-check-certificate -qO- https://localhost/healthz || exit 1
​
ENTRYPOINT ["app", "--cert", "/etc/ssl/certs/server.crt", "--key", "/etc/ssl/private/server.key"]

6、编写.dockerignore

复制代码
[root@localhost demo5]# vim .dockerignore

文件内容如下:

复制代码
Dockerfile

7、目录结构

复制代码
[root@localhost demo5]# ls -a
.  ..  Dockerfile  .dockerignore  go.mod  go.sum  main.go

8、构建镜像

复制代码
[root@localhost demo5]# docker build -t https-server:1.0 .

9、查看镜像

复制代码
[root@localhost demo5]# docker images  

10、运行容器

复制代码
[root@localhost demo5]# docker run --rm --name hs -d -p 443:443 https-server:1.0

[root@localhost demo5]# docker ps

11、访问测试

复制代码
[root@localhost demo5]# curl -k https://localhost
Hello, HTTPS!
相关推荐
AlfredZhao2 天前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
戴为沐3 天前
Linux内存扩容指南
linux
zylyehuo3 天前
Linux 彻底且安全地删除文件
linux
用户805533698034 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户034095297914 天前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux
乘云数字DATABUFF4 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
Web3探索者5 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo6 天前
Linux系统中网线与USB网络共享冲突
linux
荣--6 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森6 天前
动手实战学 Docker — 从零到集群编排完全指南
运维