Docker 入门

Docker 入门
Photo by Rubaitul Azad / Unsplash

1 docker 是什么,解决什么问题?

  • docker 将要程序和环境一起打包成一个镜像,可保证环境一致性。
  • docker 容器启动速度非常快,快速部署和扩容。
  • 每个镜像有独立的版本,可以用于快速回滚。

还有依赖管理、资源隔离、可移植性等特点。

2 镜像

2.1 基础镜像是什么?

docker 是由多层(layers)组成的,每一层代表镜像的一次变化,这些层叠加在一起,形成一个完整的文件系统。基础镜像是构建容器镜像的起点。可以在其上安装和配置应用及依赖项,就是叠加层。

基础镜像有:
alpine (https://hub.docker.com/_/alpine)
busybox(https://hub.docker.com/_/busybox)

2.2 Dockerfile

有了基础镜像还不够,还需要安装必要的依赖。我们公司选择的基础镜像是 alpine (https://hub.docker.com/_/alpine)镜像,并在此基础上增加了依赖项,作为我们自己的基础镜像,便于使用。下面是公司基础镜像的 Dockerfile,这个Dockerfile 声明了基础镜像(FROM),以及安装的依赖项(RUN)。

FROM --platform=linux/amd64 alpine:3.18.5
RUN echo "https://mirrors.aliyun.com/alpine/v3.18/main/" > /etc/apk/repositories
RUN echo "https://mirrors.aliyun.com/alpine/v3.18/community/" >> /etc/apk/repositories
RUN apk update
RUN apk --no-cache add ca-certificates
RUN apk --no-cache add tzdata  && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone

这里的镜像有优化空间,比如:将RUN合并成一条,可以减少层。

2.3 构建镜像

有了 Dockerfile,我们就可以使用 docker build 命令构建镜像,下面案例构建了公司的基础镜像。

docker build ./ -f Dockerfile -t test-registry.cn-shanghai.cr.aliyuncs.com/public-test/alpine:3.18

2.4 容器镜像仓库

容器镜像仓库(Docker Registry)是一个用于存储和分发容器镜像的系统,和代码仓库类似。企业内一般私有化部署,或者使用云服务。比如公司有生产和测试两个registry:

  • 生产:registry.cn-beijing.cr.aliyuncs.com
  • 测试:test-registry.cn-shanghai.cr.aliyuncs.com

我们本地可以使用 push 和 pull 来进行镜像推送和拉取。生产环境一般通过流水线进行推送,在 K8S可以通过配置拉取镜像部署,本质上也是通过 push 和 pull 实现。

docker push test-registry.cn-shanghai.cr.aliyuncs.com/public-test/alpine:3.18docker pull test-registry.cn-shanghai.cr.aliyuncs.com/public-test/alpine:3.18

容器的名称包含4段: {registry主机名}/{namespace}/{name}:{tag}私有化部署通常需要鉴权,可以针对 namespace 粒度的权限分配,使用前需要进行 docker login 登录。

docker login --username=brian@xxxx registry.cn-beijing.cr.aliyuncs.com

2.5 项目镜像

对于 docker 来说没有项目镜像的说法,我们 Go 项目的镜像是将 go build 之后的二进制文件拷贝到基础镜像中。并且可以添加运行必要的文件。 docker build 时默认会以 Dockerfile 所在目录作为构建上下文,可以使用 ADD COPY等命令将该目录的文件拷贝到 docker 中,示例如下:

FROM test-registry.cn-shanghai.cr.aliyuncs.com/public-test/alpine:3.18
ADD bin/server /server
ADD assets /assets/
ENTRYPOINT [ "/server" ]

3 容器(Container)

使用 docker pull 把镜像拉取下来,再使用 docker run 把镜像“解压缩”获得独立的环境和应用程序,并运行起来。这样一个独立的环境和应用程序就是容器。我们可以在一个操作系统上启动多个容器,且这些容器都是互相独立、互相隔离的。

docker pull test-registry.cn-shanghai.cr.aliyuncs.com/public-test/alpine:3.18docker run test-registry.cn-shanghai.cr.aliyuncs.com/public-test/alpine:3.18 sleep 10

Read more

CLI 工具多版本管理器 - asdf

CLI 工具多版本管理器 - asdf

asdf 是一个 CLI 工具,可以根据每个项目管理多个工具或语言运行时版本。它就像 gvm、nvm、rbenv 和 pyenv(以及更多)的合一工具!只需安装您语言的插件即可! 这个随手起的名字,可能是目前地表最强版本管理器。 https://github.com/asdf-vm/asdf 一、安装 asdf 以 macbook 为示例 brew install asdf asdf -v asdf version 0.16.2 0.16.0 以上命令有较大变更,详见:https://asdf-vm.com/guide/upgrading-to-v0-16.html#breaking-changes 本文使用

By brian
golang proto api 校验国际化 protovalidate

golang proto api 校验国际化 protovalidate

众所周知,protobuf 原型文件扩展很多功能,比如生成 http 接口层代码,顺势就有了生成接口参数校验代码的需求。 早期可以使用https://github.com/bufbuild/protoc-gen-validate 来实现,通过生成特定的 go 代码的方式来实现校验。 github 中也提到目前趋于稳定,不会有更多新特性的支持,推荐大家使用新的版本 protovalidate,https://github.com/bufbuild/protovalidate 。该版本是protoc-gen-validate 的“精神继承者”。它不需要任何代码生成并支持自定义约束。 现在我们尝试新版本,并且增加国际化支持。 go get github.com/bufbuild/protovalidate-go import "github.com/bufbuild/protovalidate-go" syntax = "proto3"; package

By brian
沪ICP备2022013452号-1