Cliente Docker más nuevo con host Docker más antiguo

12

Tenemos un servidor Docker un poco más antiguo que se ejecuta en RHEL 6.6. Nuestro equipo de operaciones no lo respalda bien en este momento, por lo que no podemos actualizar fácilmente. En este momento ejecuta Docker 1.3.2 desde un repositorio EPEL. Si lo hago, hace todo lo que necesito para obtener pruebas de concepto que, con suerte, me ayudarán a impulsar la administración para mejorar el soporte de infraestructura para Docker en el futuro.

Lo configuré para escuchar en TCP / TLS, y puedo conectarme a él, pero se niega a ejecutar comandos dados por mi cliente local de 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)

Sé que la conexión en sí funciona porque figfunciona:

$ cat > fig.yml
test:
    image: busybox
$ fig run --rm test sh
/ # hostname -f
084f75fb59d4

¿Hay alguna forma de decirle al cliente de docker más nuevo que use la versión anterior de la API de docker hasta que pueda acceder a un host de docker más nuevo?

kojiro
fuente
¿Usar un cliente Docker en RHEL?
Michael Hampton
@MichaelHampton Los desarrolladores que se conectan a esta ventana acoplable están en varias estaciones de trabajo con Windows y OS X. Tienden a tener boot2docker instalado y les gustaría usar el mismo cliente de Docker apuntado a este host.
kojiro
La opción ideal, entonces, es utilizar una distribución de Linux que rastree la última versión de Docker. Por el momento, ese es el servidor Fedora.
Michael Hampton
Supongo que le gustaría que los chicos de la Operación actualicen a RHEL 7, que actualmente parece ser 1.2, y se incrementará (como está en el canal Extras, por lo que puede crecer más rápido que el Core). Si su equipo de operaciones no puede soportar un RHEL 7 (con el soporte pagado de Red Hat), entonces ciertamente no pueden soportar algo más innovador como Fedora. Sus desarrolladores solo deben aceptar que necesitan codificar en un entorno operativo estándar. Consulte también access.redhat.com/solutions/1408853 "¿Cómo se admite Docker en RHEL 7.1?"
Cameron Kerr

Respuestas:

26

Desde Docker 1.10.0, existe una opción para anular la versión de API utilizada para la comunicación del cliente Docker con el motor Docker.

Simplemente usando la variable de entorno DOCKER_API_VERSION.

Ex.:

$ 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

Referencia: https://docs.docker.com/engine/reference/commandline/cli/#environment-variables

EDITAR

Desde Docker 1.13, CLI tiene una compatibilidad con versiones anteriores mejorada. De acuerdo con https://blog.docker.com/2017/01/whats-new-in-docker-1-13 :

A partir de 1.13, las CLI más nuevas pueden hablar con demonios más antiguos. También estamos agregando la negociación de funciones para que se devuelvan los errores adecuados si un nuevo cliente intenta usar funciones que no son compatibles con un demonio anterior. Esto mejora enormemente la interoperabilidad y hace que sea mucho más simple administrar las instalaciones de Docker con diferentes versiones de la misma máquina.

Enderson Maia
fuente
1

Si no puede actualizar fácilmente el servidor, debería poder degradar fácilmente a su cliente. Docker es de código abierto en GitHub . La versión 1.3.3 fue la última con la API del cliente 1.15. Aquí hay un enlace directo a la etiqueta.

Simplemente haga un clon local del repositorio, haga una compilación, haga un binario y luego cambie el binario producido:

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
allingeek
fuente
Registry.hub.docker.com/u/igneoussystems/docker-client parece ser un cliente de Docker (de una versión específica) dentro de un contenedor de Docker. Parece que no se está compilando en este momento, pero tal vez eso le daría algo de utilidad ... puede requerir un poco de esfuerzo, pero con algunas herramientas debería escalar bien para proporcionar múltiples versiones del cliente de Docker.
Cameron Kerr
1
Descubrí que también puedes descargar clientes prediseñados directamente. Puede derivar la URL del script de instalación en get.docker.com . Por ejemplo, necesitaba get.docker.com/builds/Darwin/x86_64/docker-1.3.2 para OS X.
kojiro