Jason Pan

聊聊Docker Hub与Compose

潘忠显 / 2024-10-09


今天在构建测试的时候,遇到了两个小问题。

本文顺着这两个小问题,稍微深入聊聊。

DockerHub 是什么

docker pull ubuntu:24.10 指令就是从 Docker Hub 拉取一个 Docker 镜像。

DockerHub 确实只是一个 Docker 镜像的托管网站,大型企业和云服务商业会提供这样的镜像托管服务,他们在技术和实现上可能没有太大的不同。但区别在于,大部分著名项目,会提供官方镜像,通常只会将其托管在Docker Hub,而不在每个云厂商的网站上都去创建个帐号,托管一份。

这些镜像是重要的基础镜像,比如 Ubuntu、Python 等镜像,是你自己再按照 Dockerfile 构建镜像的基础。

主站 DNS 污染

运营商可以通过 DNS 污染的方式,阻止用户访问某些特定的服务。

DNS 污染的原理其实很简单。就像给你提供了一个错误的电话本,你在电话本上查到了某某的电话,但是是运营商给你的假的,你打过去,自然接不通,或者是另外的根本不认识的人接听。

上边的现象对应到网络服务,就会有三种表现:

certificate

DNS 污染还是比较容易解决的。比如你把常用的联系人的电话,存到手机通讯录即可。这个本地的通讯录,就对应我们主机上的 hosts 文件。

实际上,如果要阻止用户访问某些网站,DNS污染是最基础的,你绕过了这个障碍,还有其他一些更高级的障碍。

不要一条路走到黑,可以试试其他的途径。

镜像站均已关闭

上边提到,不要老想着突破障碍,直接访问禁止访问的网站。

为了加速访问,国内通常会搭建一些镜像网站。这些镜像通常包括 Ubuntu、Debian、CentOS、Python、Node.js、DockerHub等软件源。

而维护这些镜像网站的通常有两类:著名的学术机构,如清华TUNA、中科大USTC的镜像站;著名的门户网站,比如阿里云、腾讯云、网易等。

我本想改访问国内镜像的 DockerHub,但是发现今年6月开始,这些镜像网站都不再提供 Docker Hub 的镜像了。搜了一圈,原因众所不知。以下为 USTC 的公告:

image-20241009175723946

总有办法解决

Docker Hub 从大陆无法访问可能是很早的事情,而国内镜像缓存服务不能访问也是6月初的事情了。为什么10月我才感知到?

Docker 有本地缓存,如果本地有相同标签的基础镜像,不会再去拉新的。假期的时候,打算清理一下MacBook的空间,清理了一下 Docker:

docker system prune -a

也不是没有办法,走香港的网络是可以拉取这些镜像的。如果你有环境可以连接到香港网络的,比如一些开发环境,是可以 docker pull 下这样的镜像。

docker pull ubuntu:24.10

然后,打一下新 tag,推送到 Docker Hub 之外的镜像托管服务上的。我这里为了演示,在腾讯云上建立了一个镜像仓库

docker tag ubuntu:20.04 wlbcoder-docker-hub.tencentcloudcr.com/wlb/ubuntu:20.04
docker push wlbcoder-docker-hub.tencentcloudcr.com/wlb/ubuntu:20.04
pull-from-hong-kong

你在国内的机器上,再去从后边这个仓库中拉去下来,然后再反过来打上没有前缀 tag,既可以被使用到:

docker pull wlbcoder-docker-hub.tencentcloudcr.com/wlb/ubuntu:24.10
docker tag wlbcoder-docker-hub.tencentcloudcr.com/wlb/ubuntu:24.10 ubuntu:24.10

pull-from-mainland

不再支持 docker-compose

因为上边的网络问题,我这边顺便更新了一下 Docker Desktop。

更新完之后,docker-compose 指令不能用了。去搜了一下发现,是 Docker Compose 更新到 v2 了。调用方式不再是单独的指令,而是集成到了 Docker CLI,即需要通过 docker compose 进行调用。

From July 2023 Compose V1 stopped receiving updates. It’s also no longer available in new releases of Docker Desktop.

compose 集成到 Docker CLI 有些好处:可以使用跟 docker 一致的一些 flag,比如 docker --log-level=debug --tls compose up 启用调试日志记录以及确保使用 TLS 进行连接。

如果你有脚本调用 docker-compose,官方是建议更新一下。如果你实在不想更新调用的脚本,可以加一个别名:

alias docker-compose="docker compose"

Docker Compose 是什么

Docker Compose 用于定义和运行多容器的 Docker 应用。通过一个 docker-compose.yml 文件,可以描述应用的服务、网络和卷等。一个配置文件中,可以定义多个容器,并通过一个命令启动它们。

很多项目都会提供这样的 Dockerfile 或者 Docker Compose 配置,用于快速开发和测试。

上边提到的这两个特点(定义多个容器;支持定义网络和卷,以便容器之间可以通信并共享数据)和 K8s 的 Pod 概念有些类似。但是两者使用场景不同:

Docker 官方文档中也有提到 Docker Compose 的常见用例