Contents

云原生-docker-golang开发

docker 官网

docker 官方文档

docker 参考文档

dockerfile 参考

本文是作者在跟着docker官网go开发学习时做的笔记,可能不够详尽,有需要的同学请自己去官网查看

构建你的 Go 镜像

为应用程序创建一个 Dockerfile

首先说明使用的基础镜像

1
2
3
# syntax=docker/dockerfile:1

FROM golang:1.16-alpine

在构建的img中创建一个目录。这也指示 Docker 将此目录用作所有后续命令的默认目标,即后续的相对路径都是基于此目录的。

1
WORKDIR /app

安装编译它所需的模块:

将 go.mod和go.sum文件使用COPY命令复制到其中。

1
2
COPY go.mod ./
COPY go.sum ./

使用RUN命令执行go mod download命令。

1
RUN go mod download

接下来使用COPY将源代码复制到img中。

1
COPY *.go ./

该COPY命令使用通配符将位于主机当前目录(Dockerfile所在目录)的所有.go扩展名文件复制到映像内的当前目录(WORKDIR)中。

编译我们的应用程序生成可执行文件

1
RUN go build -o /docker-gs-ping

最后使用CMD命令告诉 Docker 当启动镜像容器时在内部执行什么命令:

1
CMD [ "/docker-gs-ping" ]

Dockerfile注释以#符号开头,必须位于行首。

Dockerfile指令(例如 syntax是我们添加的指令)以#开头位于Dockerfile的最顶部:

构建图像

1
docker build -f Dockerfile --tag docker-gs-ping .

–tag标志给构建结果添加标签,默认值为atest。

查看本地img

1
docker image ls

或缩写

1
docker images

img标签

1
docker image tag docker-gs-ping:latest docker-gs-ping:v1.0

添加标记不会生成新img,生成的标记指向同一个img id

删除标签

1
2
docker image rm docker-gs-ping:v1.0
Untagged: docker-gs-ping:v1.0

当删除只有latest标签的img会直接删除img

多阶段构建

使用AS关键字标记非部署img,在完成程序编译之后,使用From关键字引入部署img(不需要额外的指示,docker会自动使用最后引入的img作为最终生成img),将非部署img构建的可执行文件使用COPY拷贝到部署img中,完成构建

Dockerfile.multistage:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# syntax=docker/dockerfile:1

## Build
FROM golang:1.16-buster AS build

WORKDIR /app

COPY go.mod ./
COPY go.sum ./
RUN go mod download

COPY *.go ./

RUN go build -o /docker-gs-ping

## Deploy
FROM gcr.io/distroless/base-debian10

WORKDIR /

COPY --from=build /docker-gs-ping /docker-gs-ping

EXPOSE 8080

USER nonroot:nonroot

ENTRYPOINT ["/docker-gs-ping"]
1
docker build -t docker-gs-ping:multistage -f Dockerfile.multistage .

将img作为容器运行

概述

1
docker run docker-gs-ping

–publish选项(简称-p)设置暴露端口。

–p [host_port]:[container_port]

以分离模式运行

–detachor选项(简称-d):将容器“分离”并返回到终端提示符,可以理解为在后台运行容器。

1
2
docker run -d -p 8080:8080 docker-gs-ping
d75e61fcad1e0c0eca69a3f767be6ba28a66625ce4dc42201a8a323e8313c14e

列出容器

1
docker ps -a

重启、停止、启动和命名容器

重启

1
docker restart inspiring_ishizaka

停止

1
2
docker stop inspiring_ishizaka
inspiring_ishizaka

删除

1
2
3
4
5
6
docker rm inspiring_ishizaka wizardly_joliot magical_carson gifted_mestorf

inspiring_ishizaka
wizardly_joliot
magical_carson
gifted_mestorf

命名:在从img生成容器的时候使用–name选项给容器名称

1
2
docker run -d -p 8080:8080 --name rest-server docker-gs-ping
3bbc6a3102ea368c8b966e1878a5ea9b1fc61187afaac1276c41db22e4b7f48f

使用容器进行开发

本地数据库和容器

存储

卷(volume)是持久化 Docker 容器生成和使用的数据的首选机制。

创建卷:

1
docker volume create roach

查看卷:

1
docker volume list

网络

创建网络

1
docker network create -d bridge mynet

bridge表示桥接网络

查看网络

1
docker network list

启动数据库引擎

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
docker run -d \
  --name roach \
  --hostname db \
  --network mynet \
  -p 26257:26257 \
  -p 8080:8080 \
  -v roach:/cockroach/cockroach-data \
  cockroachdb/cockroach:latest-v20.1 start-single-node \
  --insecure

# ... output omitted ...

配置数据库引擎

容器内执行命令

1
docker exec -it roach ./cockroach sql --insecure

使用 Docker Compose 提高生产力

Docker Compose 配置编排容器,将所有参数通过文件的方式声明

.env文件:Docker Compose 自动从该文件中读取环境变量

启动

1
docker-compose up --build

–build标志编译我们的img然后run。

关闭

1
docker-compose down

分离模式

1
docker-compose up --build -d

运行测试

配置CI/CD

部署

官网

 |