聊聊Docker Hub与Compose
潘忠显 / 2024-10-09
今天在构建测试的时候,遇到了两个小问题。
docker pull
失败了,出现好几种错误docker-compose
失败了,命令不存在
本文顺着这两个小问题,稍微深入聊聊。
DockerHub 是什么
docker pull ubuntu:24.10
指令就是从 Docker Hub 拉取一个 Docker 镜像。
DockerHub 确实只是一个 Docker 镜像的托管网站,大型企业和云服务商业会提供这样的镜像托管服务,他们在技术和实现上可能没有太大的不同。但区别在于,大部分著名项目,会提供官方镜像,通常只会将其托管在Docker Hub,而不在每个云厂商的网站上都去创建个帐号,托管一份。
这些镜像是重要的基础镜像,比如 Ubuntu、Python 等镜像,是你自己再按照 Dockerfile 构建镜像的基础。
主站 DNS 污染
运营商可以通过 DNS 污染的方式,阻止用户访问某些特定的服务。
DNS 污染的原理其实很简单。就像给你提供了一个错误的电话本,你在电话本上查到了某某的电话,但是是运营商给你的假的,你打过去,自然接不通,或者是另外的根本不认识的人接听。
上边的现象对应到网络服务,就会有三种表现:
- 连接超时。因为IP根本就不存在,包送达不了。
- 协议问题。虽然错误的提供服务,但是协议类型可能不一样,比如报错:server gave HTTP response to HTTPS client
- 证书验证失败。即使错误的IP也提供相同协议的服务,其返回内容也必然不符合要求。最常见的,如果是 HTTPS 服务,会校验证书失败,因为域名和实际的证书是不对应的:tls: failed to verify certificate: x509
DNS 污染还是比较容易解决的。比如你把常用的联系人的电话,存到手机通讯录即可。这个本地的通讯录,就对应我们主机上的 hosts 文件。
实际上,如果要阻止用户访问某些网站,DNS污染是最基础的,你绕过了这个障碍,还有其他一些更高级的障碍。
不要一条路走到黑,可以试试其他的途径。
镜像站均已关闭
上边提到,不要老想着突破障碍,直接访问禁止访问的网站。
为了加速访问,国内通常会搭建一些镜像网站。这些镜像通常包括 Ubuntu、Debian、CentOS、Python、Node.js、DockerHub等软件源。
而维护这些镜像网站的通常有两类:著名的学术机构,如清华TUNA、中科大USTC的镜像站;著名的门户网站,比如阿里云、腾讯云、网易等。
我本想改访问国内镜像的 DockerHub,但是发现今年6月开始,这些镜像网站都不再提供 Docker Hub 的镜像了。搜了一圈,原因众所不知。以下为 USTC 的公告:
总有办法解决
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
你在国内的机器上,再去从后边这个仓库中拉去下来,然后再反过来打上没有前缀 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
不再支持 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 compose 主要用于开发和测试环境,适合单机或小规模容器编排
- K8s Pod 用于生产环境的大规模容器编排和管理,是编排的基本调度单元,K8s还提供了更高层级的抽象,如 Deployment、Service、Ingress 等
Docker 官方文档中也有提到 Docker Compose 的常见用例:
- 搭建开发环境,可以配置应用程序所有服务依赖项(数据库、队列、缓存、Web 服务 API 等)
- 自动化测试环境,方便创建和销毁隔离的测试环境
- 单主机部署