各位看官老爷们,现在用 Docker 还如以前那样轻松自如么?
自从 DockerHub 及国内镜像被一条禁令一刀切以后,Docker Image 相关的资源变得非常难以获取,不仅仅是对使用者而言整个事情变得极其繁杂,对开发者而言,也是非常挠头的一件事。
原本预计是 Doris On Docker 推出正常流水线策略,把一些新功能 Merge 进去或者已知 BUG Fix 以后尽快打包发布给广大用户,这样无论是大家的使用连续性还是我们更新的速度,都会有比较好的体感,然而事情往往不是按照既定轨迹运行的,所以在当下这个情况中,我决定不能坐以待毙,还是主动用其他方式来解决这个问题。
本篇着重有三方面信息:
话不多说,开整!
PS:如无需构建,只需要使用,可直接跳到文末查看补习班专属仓库源和构建命令!!!
Apache Doris 容器化的整体工程当下有三位社区同学在做主要维护:@intelligentfu(smiletan) @catpineapple(胡得潮) @FreeOnePlus(苏奕嘉)
前两位是 Doris On K8S 的主要贡献者,而我主要是负责 Doris On Docker,故此在一些构建镜像的准备工作上,我们已经做了不少事情:比如 Dockerfile、init、entrypoint 等脚本的融合统一,镜像也尽可能融合统一,即 k8s 镜像与 Doris On Docker 镜像使用同一个镜像,以此来减少各位看官老爷的准备工作。
以构建 Apache Doris 2.1.4 为例,可制作的镜像有三类,分别是 All In One、FE、BE,整个镜像构建工作目录如下:
└── doris
├── all
│ ├──Dockerfile
│ └── resource
│ ├── apache-doris-2.1.4-bin-amd64
│ ├── apache-doris-2.1.4-bin-arm64
│ └── entry_point.sh
├── be
│ ├──Dockerfile
│ └── resource
│ ├── apache-doris-2.1.4-bin-amd64
│ ├── apache-doris-2.1.4-bin-arm64
│ ├── entry_point.sh
│ └── init_be.sh
└── fe
├──Dockerfile
└── resource
├── apache-doris-2.1.4-bin-amd64
├── apache-doris-2.1.4-bin-arm64
└── init_fe.sh由于这里我构建的镜像都是需要交叉编译的,所以每一个子目录下都有 amd64 和 arm64 的二进制程序,如不需要交叉编译,则根据个人所需下载解压缩相应架构二进制包即可。
这里不用自己写 Dockerfile 内容了,只需要修改官方提供的 Dockerfile 脚本,设置具体的 version 版本即可。
Dockerfile-FE 地址:https://github.com/apache/doris/blob/master/docker/runtime/fe/Dockerfile Dockerfile-BE 地址:https://github.com/apache/doris/blob/master/docker/runtime/be/Dockerfile
根据不同的版本,设置该变量即可,图为设置 apache-doris-2.1.4 版本的示例。
在 Doris 2.x 开始,对很多系统级的环境参数有了比较明确的要求,并将这些要求放在了 start_be.sh 启动脚本中,启动时会进行校验,未通过校验的话会停止运行启动脚本,而在很多容器化的场景中,大家并没有相应宿主机的设置权限,故此为了通用性和易用性,建议调整 start 脚本来略过相应的测试。
调整后如下:
官网命名规则里,AMD64 的包会用 x64 来表示,故此下载以后的二进制包解压缩以后需要调整一下文件夹名称,否则无法与 Dockerfile 中的变量一一对应,致使打包时报无法找到资源的错误。
tar -zxvf apache-doris-2.1.4-bin-x64.tar.gz
mv apache-doris-2.1.4-bin-x64 apache-doris-2.1.4-bin-amd64如果不需要交叉编译,使用如下命令进行编译:
docker build . -t apache/doris:2.1.4-fe-amd64众所周知,Docker 的编译使用的命令是 docker build,该命令可根据当前机器的CPU架构(ARM、AMD)来编译出适合该架构下运行的 Image 镜像。
如果我们把该镜像 Push 到 DockerHub 或者自己的私有化仓库中,那 Docker Pull 下来的镜像也只能支持同 CPU 架构的机器运行,以我两年前打包的一个 ARM 镜像为例,在 AMD 机器上运行如下:
如上, ARM64 构建的镜像在 AMD64 机器上就无法成功运行,但是我们在 DockerHub 使用 Docker Pull 拉取镜像时,经常会发现使用 docker pull 命令时并没有人为的去区分这个镜像是支持 AMD 架构还是支持 ARM 架构的。
造成这个差异的原因就是因为那些镜像使用了交叉编译的能力,将 ARM 镜像和 AMD 镜像一并构建、同时推送至同一个 Docker 仓库的 Tag 中,在 DockerHub 上的具体表现是这样的:
这里可以看到,这个镜像用了同一个 Tag 名,但是里面根据不同的系统架构对应有不同的镜像文件,所以诸如这样的交叉编译的镜像,就可以极大的简化我们在使用镜像时去记忆一些复杂的区分后缀名了。
之前使用 freeoneplus/doris:{版本号-进程名-架构类型}
现在使用 freeoneplus/doris:{版本号-进程名}
交叉编译构建镜像这件事说起来并不复杂:
但是在实际构建过程中,需要克服的困难还是很多的:
那 Buildx 工具就是为了解决前两个问题而生的:自动化封装构建不同架构下的容器,并合并推送至同一 Tag 下的镜像仓库中。
具体使用方式可根据以下 Docker Buildx 教程按步执行
https://yeasy.gitbook.io/docker_practice/buildx/multi-arch-images
这里就不一一赘述了,我在这着重讲构建时因为网络原因导致的两个问题的解决思路。
前面我们也讲了,构建一个镜像,在 Dockerfile 中我们往往会指定 FROM 父镜像,但是使用原生的 Buildx 拉取父镜像或者在镜像里执行诸如 yum update 等命令,往往因为网络原因无法正常拉取和下载更新,这里有小伙伴就说了:我知道这个问题怎么处理,把 Docker 的 daemon.json 配置文件改一改重启不就好了嘛?
如果是这么简单的问题,我就不在这里赘述了……
因为 Buildx 工具其实本身就是一个镜像容器,所以你这个修改配置文件应该修改的是 Buildx 容器中的 Docker 镜像源,而不是宿主机上的 Docker 配置。
教程给出了三个镜像,一个是腾讯云虚机适用的,一个是国内环境适用的,一个是原生的镜像,那这三个在以前国内网络环境还尚可的时候,是没问题的,但是现在网络环境大幅度变化,这三个镜像在国内基本都行不通了,用该镜像构建的话,那失败率可稳定保持在 99.9%,所以我们需要做的事情就只有一个:
用我们自己的可以成功拉取镜像的镜像源构建一个独属于自己的 Buildx 镜像。
具体步骤简化而言就三步:
buildkitd.toml 配置文件,将文件中的 mirrors 源修改为国内可访问的镜像源docker build 命令构建自定义镜像以下是我的配置,仅供参考
# https://github.com/moby/buildkit/blob/master/docs/buildkitd.toml.md
debug = true
[registry."docker.io"]
mirrors = ["https://docker.211678.top","https://docker.1panel.live","https://hub.rat.dev","https://docker.m.daocloud.io","https://do.nark.eu.org","https://dockerpull.com","https://dockerproxy.cn","https://docker.awsl9527.cn"]
http = false最后我使用以下命令构建镜像
docker build . -t freeoneplus/mybuilder:latest这里建议最好先 push 到镜像仓库,再执行 buildx 镜像构建命令
# 推送镜像
docker push freeoneplus/mybuilder:latest
# 依据镜像构建 Buildx 容器环境
docker buildx create --use --name=mybuilder --driver docker-container --driver-opt image=freeoneplus/mybuilder:latest
# 指定在交叉编译时使用该容器环境
docker buildx use mybuilder最后到构建完成的推送环节了,如果顺利的话你会看到它一直在 retry push……(我被 Retry 了一早晨,已麻木)
这里建议的方案是:构建一个国内的、自己的、私有的镜像仓库,或者如果你只是想用 Doris On Docker 的,也可以到我公开的补习班专属阿里云镜像仓库中下载使用,地址见下一小节。
我这里使用的是阿里云容器镜像个人服务,地址如下:
https://cr.console.aliyun.com/repository
申请开通以后,创建一个独属的命名空间,再在改空间下创建相应镜像仓库即可,这里傻瓜式的服务,不做赘述。
仓库地址:registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris
拉取镜像命令:
docker pull registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:[镜像版本号]
# 例如拉取 2.1.4-all 镜像
docker pull registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.1.4-all具体使用可参照官网 Docker 安装部署章节
https://doris.apache.org/zh-CN/docs/install/cluster-deployment/run-docker-cluster
这里做三个不同版本或者部署过程中的运行时演示案例。
为了不受网络环境的影响,我们在演示环境里采用桥接网络模式配置网络:
docker network create --driver bridge --subnet=172.20.80.0/24 doris-network镜像:
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.1.4-all运行命令:
docker run -itd \
--name=doris-all-in-one \
-p 8030:8030 \
-p 8040:8040 \
-p 9030:9030 \
--network=doris-network \
--ip=172.20.80.100 \
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.1.4-all执行截图:
使用 MySQL 客户端链接:
镜像:
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.1.4-fe
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.1.4-be运行命令:
docker run -itd \
--name=fe \
--env FE_SERVERS="fe1:172.20.80.2:9010" \
--env FE_ID=1 \
-p 8031:8030 \
-p 9031:9030 \
-v /data/fe/doris-meta:/opt/apache-doris/fe/doris-meta \
-v /data/fe/log:/opt/apache-doris/fe/log \
--network=doris-network \
--ip=172.20.80.2 \
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.1.4-fe
docker run -itd \
--name=be \
--env FE_SERVERS="fe1:172.20.80.2:9010" \
--env BE_ADDR="172.20.80.3:9050" \
-p 8041:8040 \
-v /data/be/storage:/opt/apache-doris/be/storage \
-v /data/be/log:/opt/apache-doris/be/log \
--network=doris-network \
--ip=172.20.80.3 \
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.1.4-be执行截图:
使用 MySQL 客户端链接:
镜像:
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.1.4-fe
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.1.4-be运行命令:
docker run -itd \
--name=fe-01 \
--env FE_SERVERS="fe1:172.20.80.4:9010,fe2:172.20.80.5:9010,fe3:172.20.80.6:9010" \
--env FE_ID=1 \
-p 8032:8030 \
-p 9032:9030 \
-v /data/fe-01/doris-meta:/opt/apache-doris/fe/doris-meta \
-v /data/fe-01/log:/opt/apache-doris/fe/log \
--network=doris-network \
--ip=172.20.80.4 \
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.1.4-fe
docker run -itd \
--name=fe-02 \
--env FE_SERVERS="fe1:172.20.80.4:9010,fe2:172.20.80.5:9010,fe3:172.20.80.6:9010" \
--env FE_ID=2 \
-p 8033:8030 \
-p 9033:9030 \
-v /data/fe-02/doris-meta:/opt/apache-doris/fe/doris-meta \
-v /data/fe-02/log:/opt/apache-doris/fe/log \
--network=doris-network \
--ip=172.20.80.5 \
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.1.4-fe
docker run -itd \
--name=fe-03 \
--env FE_SERVERS="fe1:172.20.80.4:9010,fe2:172.20.80.5:9010,fe3:172.20.80.6:9010" \
--env FE_ID=3 \
-p 8034:8030 \
-p 9034:9030 \
-v /data/fe-03/doris-meta:/opt/apache-doris/fe/doris-meta \
-v /data/fe-03/log:/opt/apache-doris/fe/log \
--network=doris-network \
--ip=172.20.80.6 \
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.1.4-fe
docker run -itd \
--name=be-01 \
--env FE_SERVERS="fe1:172.20.80.4:9010,fe2:172.20.80.5:9010,fe3:172.20.80.6:9010" \
--env BE_ADDR="172.20.80.7:9050" \
-p 8042:8040 \
-v /data/be-01/storage:/opt/apache-doris/be/storage \
-v /data/be-01/log:/opt/apache-doris/be/log \
--network=doris-network \
--ip=172.20.80.7 \
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.1.4-be
docker run -itd \
--name=be-02 \
--env FE_SERVERS="fe1:172.20.80.4:9010,fe2:172.20.80.5:9010,fe3:172.20.80.6:9010" \
--env BE_ADDR="172.20.80.8:9050" \
-p 8043:8040 \
-v /data/be-02/storage:/opt/apache-doris/be/storage \
-v /data/be-02/log:/opt/apache-doris/be/log \
--network=doris-network \
--ip=172.20.80.8 \
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.1.4-be
docker run -itd \
--name=be-03 \
--env FE_SERVERS="fe1:172.20.80.4:9010,fe2:172.20.80.5:9010,fe3:172.20.80.6:9010" \
--env BE_ADDR="172.20.80.9:9050" \
-p 8044:8040 \
-v /data/be-03/storage:/opt/apache-doris/be/storage \
-v /data/be-03/log:/opt/apache-doris/be/log \
--network=doris-network \
--ip=172.20.80.9 \
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.1.4-be执行截图:
使用 MySQL 客户端链接:
可以看到,在这台虚拟机上,我们成功启动了 All-In-One、1FE&1BE、3FE&3BE 三套不同规格的测试集群。
使用 Docker 来快速构建一套 Doris 的测试环境和开发环境还是很不错的,在写这篇文章的时候,我也同步又修复了一个 BUG,的确是要全方位使用测试用例进行覆盖,才能把一个项目做到更好。
好了,看到这里了,不得来个点赞和在看鼓励一下?
后续新版本发布了,我在时间允许的情况下也会尽可能的同步更新三个镜像,谢谢大家支持~
附录:当前已打包上传的镜像
2.0.12 :
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.0.12-all
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.0.12-fe
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.0.12-be
2.1.4:
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.1.4-all
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.1.4-fe
registry.cn-hangzhou.aliyuncs.com/freeoneplus/doris:2.1.4-be本文分享自 Apache Doris 补习班 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!