我们有一个稍旧的 Docker 服务器,运行在 RHEL 6.6 上。目前我们的运营团队对它的支持不够好,所以我们无法轻松升级。目前它运行来自 EPEL 存储库的 Docker 1.3.2。如果我通过 ssh 登录,它就可以完成概念验证所需的一切,这有望帮助我推动管理层改进 Docker 的基础设施支持。
我将其设置为监听 TCP/TLS,并且能够连接到它,但它拒绝运行我的本地 docker 客户端给出的命令。
$ docker version
Client version: 1.4.1
Client API version: 1.16
Go version (client): go1.4
Git commit (client): 5bc2ff8
OS/Arch (client): darwin/amd64
FATA[0000] Error response from daemon: client and server don't have same version (client : 1.16, server: 1.15)
我知道连接本身有效,因为fig
有效:
$ cat > fig.yml
test:
image: busybox
$ fig run --rm test sh
/ # hostname -f
084f75fb59d4
有没有什么方法可以让我告诉较新的 docker 客户端使用较旧的 docker API 版本,直到我可以访问较新的 docker 主机?
答案1
自 Docker 1.10.0 起,有一个选项可以覆盖用于 Docker 客户端与 Docker 引擎通信的 API 版本。
只需使用 DOCKER_API_VERSION 环境变量。
前任。:
$ docker version
Client:
Version: 1.10.0
API version: 1.22
Go version: go1.5.3
Git commit: 590d510
Built: Fri Feb 5 08:21:41 UTC 2016
OS/Arch: darwin/amd64
Error response from daemon: client is newer than server (client API version: 1.22, server API version: 1.21)
$ DOCKER_API_VERSION=1.21 docker version
Client:
Version: 1.10.0
API version: 1.21
Go version: go1.5.3
Git commit: 590d510
Built: Fri Feb 5 08:21:41 UTC 2016
OS/Arch: darwin/amd64
Server:
Version: 1.9.1
API version: 1.21
Go version: go1.4.3
Git commit: a34a1d5
Built: Fri Nov 20 17:56:04 UTC 2015
OS/Arch: linux/amd64
参考:https://docs.docker.com/engine/reference/commandline/cli/#environment-variables
编辑
自 Docker 1.13 以来,CLI 具有改进的向后兼容性。根据https://blog.docker.com/2017/01/whats-new-in-docker-1-13:
从 1.13 开始,较新的 CLI 可以与较旧的守护进程通信。我们还添加了功能协商,以便在新客户端尝试使用较旧的守护进程不支持的功能时返回正确的错误。这大大提高了互操作性,并使从同一台机器管理不同版本的 Docker 安装变得更加简单。
答案2
如果你无法轻松升级服务器,那么你应该能够轻松降级客户端。Docker 是开源的,网址为GitHub。版本 1.3.3 是最后一个采用 1.15 客户端 API 的版本。这里是标签的直接链接。
只需对 repo 进行本地克隆、进行构建、生成二进制文件,然后交换生成的二进制文件:
sudo service docker stop ; sudo cp $(which docker) $(which docker)_ ; sudo cp ./bundles/1.3.3-dev/binary/docker-1.3.3-dev $(which docker);sudo service docker start