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

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
git clone 复制一个整个仓库并推送到新地址

git clone 复制一个整个仓库并推送到新地址

要使用 git clone --bare 复制一个新的仓库并推送到远程仓库,可以按照以下步骤操作: 1. 克隆一个裸仓库 首先,使用 git clone --bare 命令克隆源仓库。假设源仓库的 URL 是 https://github.com/user/source-repo.git,你可以执行以下命令: bash复制 git clone --bare https://github.com/user/source-repo.git 这将创建一个新的裸仓库(没有工作区),通常会创建一个名为 source-repo.git 的目录。 2. 进入裸仓库目录 进入刚刚克隆的裸仓库目录: bash复制 cd source-repo.git 3. 添加新的远程仓库 接下来,

By brian
搜索引擎技巧不用多,学会 3 个加速 100% 找到目标

搜索引擎技巧不用多,学会 3 个加速 100% 找到目标

在搜索时使用英文关键词,提高结果质量。尽量使用 google.com 以下搜索引擎技巧在 google.com 进行测试,效果都很好,前三个非常常用且强烈推荐。 使用精确搜索 * 建议: 使用双引号 "" 搜索完全匹配的短语,避免无关结果。 * 示例: * "Java NullPointerException" fix * 场景: 找到错误信息的精确解决方案。 利用站内搜索 * 建议: 使用 site: 限制搜索范围到特定网站。 * 示例: * site:stackoverflow.com "TypeError: undefined is not a function" * 场景: 搜索 Stack Overflow、官方文档或技术博客的特定内容。 一些关键词 * 建议:

By brian
沪ICP备2022013452号-1