docker 官网
docker 官方文档
docker 参考文档
dockerfile 参考
本文是作者在跟着docker官网go开发学习时做的笔记,可能不够详尽,有需要的同学请自己去官网查看
构建你的 Go 镜像
为应用程序创建一个 Dockerfile
首先说明使用的基础镜像
1
2
3
|
# syntax=docker/dockerfile:1
FROM golang:1.16-alpine
|
在构建的img中创建一个目录。这也指示 Docker 将此目录用作所有后续命令的默认目标,即后续的相对路径都是基于此目录的。
安装编译它所需的模块:
将 go.mod和go.sum文件使用COPY命令复制到其中。
1
2
|
COPY go.mod ./
COPY go.sum ./
|
使用RUN命令执行go mod download命令。
接下来使用COPY将源代码复制到img中。
该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
或缩写
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 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 network create -d bridge mynet
|
bridge表示桥接网络
查看网络
启动数据库引擎
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 up --build -d
|
运行测试
配置CI/CD
部署
见官网