docker部署golang服务

创建服务

package main
import (
	"fmt"
	"net/http"
)
func handlerHello(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "hello docker")
}
func main() {
	http.HandleFunc("/", handlerHello)
	fmt.Println("run 8080")

	http.ListenAndServe(":8080", nil)
}

docker部署golang服务_第1张图片

dockerFIle

进入工作目录

/Users/zhangsan/Documents/GitHub/web-test
-> % tree                                                                               
.
├── dockerfile
├── go.mod
└── main.go

0 directories, 3 files

docker内容

FROM golang:latest

ENV GO111MODULE=on \
    CGO_ENABLED=1

WORKDIR /Users/zhangsan/Documents/GitHub/web-test

COPY  . /Users/zhangsan/Documents/GitHub/web-test


RUN go build .

EXPOSE 8080
ENTRYPOINT ["./web-test"]

FROM 母镜像
MAINTAINER 维护者信息
WORKDIR工作目录
ADD 将文件复制到镜像中
RUN 执行操作
EXPOSE 监听端口
ENTRYPOINT 程序入口
项目目录执行

docker build    -t testweb .

-> % docker build    -t testweb . 
Sending build context to Docker daemon  4.096kB
Step 1/7 : FROM golang:latest
 ---> 028d102f774a
Step 2/7 : ENV GO111MODULE=on     CGO_ENABLED=1
 ---> Using cache
 ---> 3aec09f7569c
Step 3/7 : WORKDIR /Users/zhangsan/Documents/GitHub/web-test
 ---> Running in cf907f5da8e0
Removing intermediate container cf907f5da8e0
 ---> e111905b2f0c
Step 4/7 : COPY  . /Users/zhangsan/Documents/GitHub/web-test
 ---> 5c06746de2df
Step 5/7 : RUN go build .
 ---> Running in 85ee6f5aa4fe
Removing intermediate container 85ee6f5aa4fe
 ---> 6cbafd7f5b58
Step 6/7 : EXPOSE 8080
 ---> Running in eefd150be5ea
Removing intermediate container eefd150be5ea
 ---> baf71f368cfa
Step 7/7 : ENTRYPOINT ["./web-test"]
 ---> Running in b75142748ae3
Removing intermediate container b75142748ae3
 ---> c88bc3a4ff72
Successfully built c88bc3a4ff72
Successfully tagged testweb:latest

#启动景象

-> % docker run -p 8080:8080 -d testweb           
b0e843cc8e3063769c35905a4c0a01749d1c4129d1283accdc31d3e9aaac7b6a

验证

-> % curl http://localhost:8080/
hello docker%   
FROM golang:1.13.0-stretch AS builder

ENV GO111MODULE=on \
    CGO_ENABLED=1

WORKDIR /build

# 缓存 mod 检索-那些不常更改的模块


# 复制构建应用程序所需的代码
# 可能需要更改下边的命令,只复制您实际需要的内容。
COPY . /build


RUN go mod tidy && go mod download && go mod vendor

# 构建应用程序
RUN go build .

# 我们创建一个 /dist 目录, 仅包含运行时必须的文件
# 然后,他会被复制到输出镜像的 / (根目录)
WORKDIR /dist
RUN cp /build/web-test ./web-test

# 可选项:如果您的应用程序使用动态链接(通常情况下使用 CGO),
# 这将收集相关库,以便稍后将它们复制到最终镜像
# 注意: 确保您遵守您复制和分发的库的许可条款
RUN ldd web-test | tr -s '[:blank:]' '\n' | grep '^/' | \
    xargs -I % sh -c 'mkdir -p $(dirname ./%); cp % ./%;'
RUN mkdir -p lib64 && cp /lib64/ld-linux-x86-64.so.2 lib64/

# 在运行时复制或创建您的应用程序需要的其他目录/文件。
# 例如,本例使用 /data 作为工作目录,在正常运行容器时,该目录可能绑定到永久目录
RUN mkdir /data

# 构建最小运行时镜像
FROM scratch

COPY --chown=0:0 --from=builder /dist /

# 设置应用程序以 /data 文件夹中的非 root 用户身份运
# User ID 65534 通常是 'nobody' 用户.
# 映像的执行者仍应在安装过程中指定一个用户。
COPY --chown=65534:0 --from=builder /data /data
USER 65534
WORKDIR /data
EXPOSE 8080
ENTRYPOINT ["./web-test"]

你可能感兴趣的:(Docker)