In this Article
Los containers revolucionaron el desarrollo de software, ya que resolvieron muchos de los desafíos que enfrentaban los programadores. Ayudan a entregar productos que funcionan de manera fiable y consistente en diversos sistemas y dispositivos. Docker, por su parte, llevó los containers a un nuevo nivel, ya que la plataforma hizo que construirlos, gestionarlos y ejecutarlos fuera mucho más fácil y rápido. Docker también admite el uso de proxies de terceros y ofrece varios métodos para hacerlo. Por qué combinarlo con IP alternativas, qué método es mejor para tu caso concreto y qué hacer exactamente paso a paso: sigue leyendo el artículo para saberlo.
Por qué usar proxies con Docker
Garantizar un acceso a internet estable, seguro y controlado es la respuesta. A veces, para garantizar siquiera el acceso.
Docker necesita acceso a la Web para realizar tareas como descargar imágenes, instalar paquetes, etc. Sin embargo, muchas redes corporativas no ofrecen una conexión normal: el tráfico saliente está controlado o restringido. Las razones de seguridad tienen la culpa; aun así, esto dificulta el trabajo de los desarrolladores. Los proxies aprobados a veces son la única forma de llegar a la red y evitar mensajes como “Connection timed out” o “Unable to access www.example.com“.
Además, en algunos casos se necesita autenticación para usar la red. Docker por sí mismo no admite autenticación, así que un proxy externo es el camino a seguir.
Las aplicaciones en tiempo de ejecución también pueden requerir una conexión externa. Hay situaciones en las que un container necesita conectarse a API en la nube, bases de datos, servicios de terceros, etc. Si está protegido por un firewall, se necesita un proxy para alcanzar los endpoints de destino.
También hay otras razones para usar proxies. Enrutar el tráfico a través de un servidor alternativo puede resolver problemas de velocidad y ayudar con la monitorización del tráfico para registros, malware, inspección SSL y más. También ayudan a mantener la consistencia de la red entre distintos tipos de servidores y máquinas, así como a ocultar información interna (dirección IP, solicitudes DNS internas y NAT), lo que brinda mayor seguridad.
Cómo configurar proxies en Docker
Hay cuatro capas diferentes en las que puedes configurar proxies: el Docker Daemon (o Docker Engine, en otras palabras), el Docker Client, los containers y el nivel del sistema operativo. También hay distintos métodos para establecer proxies en cada capa. Según lo que elijas, afectará a diferentes partes. Todas las opciones tienen sus ventajas y debes elegir según tu caso de uso. Vamos a analizarlas una por una: cuál se adapta mejor a cada propósito y qué hacer exactamente.
Capa 1: Configurar el Docker Daemon
Los proxies configurados en ese nivel controlan la descarga y subida de imágenes y el acceso a Docker Hub y a registros privados. También son responsables de alcanzar Docker Swarm.
Cuándo elegir esta opción:
- Necesitas que todas las operaciones con imágenes pasen por un proxy;
- Comandos como docker pull o docker push fallan;
- Debes enrutar todo el tráfico de tu máquina a través de un proxy corporativo;
- El acceso a redes externas solo es posible con proxies;
- Con Docker Swarm.
Es estable y predecible y, si usas Desktop, es fácil configurar proxies con su interfaz gráfica. Por otro lado, en versiones antiguas (< 17.x) y en algunas configuraciones poco comunes, los ajustes pueden afectar a todos los containers, lo que puede ralentizar los que no usan internet. En las versiones modernas, el proxy del Daemon no afecta a los containers, ya que la configuración no se hereda automáticamente.
Hay cuatro maneras de configurar el proxy del Docker Daemon.
Método 1 – Usar daemon.json
Este método es solo para Linux y es el recomendado para este SO. Configuras el comportamiento del proxy en este archivo daemon.json:
{
"proxies": {
"http-proxy": "http://proxy.example.com:3128",
"https-proxy": "https://proxy.example.com:3129",
"no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
}
}
Después de cambiar el archivo, reinicia Docker para que los cambios empiecen a funcionar:
sudo systemctl restart docker
Método 2 – Mediante un archivo drop-in de systemd
Esto también funciona solo en Linux. Puedes ejecutarlo en modo normal y en modo rootless.
En cualquier caso, empieza creando un directorio del sistema:
sudo mkdir -p /etc/systemd/system/docker.service.d
Luego, crea un archivo con el nombre /etc/systemd/system/docker.service.d/http-proxy.conf que añada las variables de entorno del proxy.
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:3128"
Si usas un servidor HTTPS, cambia tu variable a “HTTPS_PROXY”. Puedes establecer varias variables. Después, guarda el archivo y reinicia Docker.
sudo systemctl daemon-reload
sudo systemctl restart docker
Método 3 – Usar variables de entorno para dockerd
El Docker Daemon comprueba las variables de entorno antes de ejecutarse. Sin embargo, este método no suele ser la primera opción.
export HTTP_PROXY=...
dockerd
Método 4 – Docker Desktop
Técnicamente, Docker Desktop se apoya en una máquina virtual Linux ligera y la usa para configurar Docker. Puede que leas que Docker Desktop solo está disponible para Windows/macOS. Técnicamente, también está disponible para Linux; sin embargo, es poco común y opcional, y sigues gestionando el Daemon dentro de una VM, no en un motor nativo. Así que este método sigue siendo preferible para Windows/macOS. Sigue esta ruta:
Docker Desktop > Settings > Resources > Proxies.
Capa 2: Configurar los proxies del Docker Client (CLI)
El Docker Client usa proxies para hacer solicitudes. Esto se aplica a las llamadas a la API hechas por la CLI y a comandos como docker login, docker pull, docker push.
Cuándo elegir esta opción:
- Si necesitas que el cliente se autentique a través de un proxy;
- Cuando hay restricciones de la empresa sobre el tráfico saliente;
- Cuando no necesitas afectar al daemon ni a los containers.
El Client es rápido y fácil de configurar, y no hay necesidad de reiniciar el daemon. Sin embargo, este método no funcionará si necesitas arreglar problemas de acceso al construir o ejecutar containers, o errores de push y pull del Daemon.
Normalmente, configurarías el Docker Client usando variables de entorno del shell.
Así se ve para Linux y macOS:
export HTTP_PROXY=http://PROXY:PORT
o
export HTTPS_PROXY=http://PROXY:PORT
Usa esto para Windows:
setx HTTP_PROXY http://PROXY:PORT
Nota: en Windows, cuando usas CMD, puede haber problemas. PowerShell funciona.
Hay otra manera, aunque se usa raramente: configurar por comando.
HTTP_PROXY=http://PROXY docker login
Capa 3: Proxy del container
Si eliges este método, las aplicaciones dentro de los containers usarán proxies. Puedes configurar proxies para los builds o ejecutar containers con proxies.
Cuándo elegir esta opción:
- Los containers necesitan una conexión externa;
- Los builds fallan al ejecutar gestores de paquetes;
- Las apps dentro de los containers necesitan enrutar solicitudes de API a través de un proxy externo.
Es fácil de establecer por container y se adapta a entornos mixtos, cuando algunos containers necesitan proxies y otros no. También ofrece una separación limpia de las configuraciones del SO y del daemon. Sin embargo, tendrás que configurar los proxies manualmente para cada build y ejecución. Esta opción tampoco es la mejor para despliegues a gran escala y está asociada a riesgos de seguridad, ya que las credenciales del proxy pueden filtrarse.
Método 1 – Configurar proxies por build
docker build \
--build-arg HTTP_PROXY=http://PROXY:PORT \
--build-arg HTTPS_PROXY=http://PROXY:PORT \
-t myimage .
Método 2 – Usar Dockerfile
ENV en el Dockerfile o las variables de entorno incrustan tu configuración en la imagen. Este método conlleva riesgos de seguridad y no deberías usarlo para builds.
ENV HTTP_PROXY=http://PROXY:PORT
ENV HTTPS_PROXY=http://PROXY:PORT
Método 3 – Configurar proxies por ejecución
docker run \
-e HTTP_PROXY=http://PROXY:PORT \
-e HTTPS_PROXY=http://PROXY:PORT \
image
Método 4 – Optar por Docker Compose
Esta es una opción segura y recomendada:
environment:
HTTP_PROXY: http://PROXY:PORT
HTTPS_PROXY: http://PROXY:PORT
NO_PROXY: "localhost,127.0.0.1"
Nota: en la documentación oficial de Docker, dos conceptos diferentes se llaman CLI, y esto puede confundirte. Existe un proxy de la Docker CLI que afecta al programa cliente. También existen los flags de la Docker CLI: inyectan la configuración del proxy dentro de los containers. Afectan a los containers, no al cliente. Sin embargo, en ambos casos usas herramientas de línea de comandos.
Capa 4: Proxy del sistema operativo
Puedes configurarlo para que todo el tráfico de tu dispositivo pase por un servidor proxy. Afectará tanto al Docker Daemon como al Docker Client; a veces puede afectar incluso a los containers y a todas las demás apps que uses.
Cuándo usar esta opción:
- La empresa exige el uso de proxies a nivel de sistema;
- Hay muchas apps además de Docker que también necesitan proxies.
Este método es simple y rápido: configuras los proxies una vez y esos ajustes funcionan para la mayoría de las partes y apps. Sin embargo, no es específico de Docker y hace más difícil la depuración. Además, ten en cuenta que es realmente raro que los containers hereden esos ajustes automáticamente, así que puede que aún necesites configurarlos por separado.
Aquí puedes encontrar tutoriales paso a paso sobre la configuración de proxies en varios sistemas operativos, incluidos macOS y Windows.
Además, puedes visitar la documentación oficial de Docker para encontrar más detalles sobre cada método y todas las variables disponibles.
Configuración del proxy del Docker Daemon
Cómo configurar el Docker Client
Cómo ajustar los cambios de proxy en Docker Desktop
¿Docker tiene proxies internos?
Docker ofrece un llamado proxy HTTP(S) interno solo para builds de imágenes, y esto confunde a la gente, ya que algunos piensan que los proxies externos no son necesarios.
El proxy interno de BuildKit se usa solo para builds, y acelera el acceso, elimina problemas de DNS y evita que la configuración de DNS se filtre en los builds. Sin embargo, no puede ayudar a establecer conexiones salientes seguras. No puedes usarlo en lugar de un proxy.
Problemas comunes de configuración y cómo solucionarlos
Arreglar errores relacionados con proxies en Docker puede ser complicado por sus múltiples capas. Estos son cinco de los problemas más comunes y sus soluciones.
Error 1: docker pull/docker push falla
Si notas que el pull a través del proxy se cuelga o agota el tiempo de espera, o que la conexión es rechazada, significa que el Docker Daemon no conoce tu proxy. Para arreglarlo, configura los proxies a nivel del motor.
Error 2: No hay conexión, incluso si el Daemon funciona
Al mismo tiempo, docker pull funciona, pero los containers no pueden ejecutar pip install y otras dependencias. Pueden aparecer errores como Temporary failure resolving. Esta situación ocurre con las versiones modernas de Docker porque el proxy del Daemon no se aplica automáticamente dentro de los containers. Para librarte de ella, aplica un proxy a nivel de container en el Dockerfile o en Docker Compose.
Error 3: La variable NO_PROXY no funciona
Si aún ves que Docker intenta enrutar el tráfico a través de proxies a pesar de tu configuración, que los containers no logran comunicarse o que los espejos de registro fallan, puede deberse a una sintaxis incorrecta. Prueba a usar entradas separadas por comas y no especifiques protocolos al incluir dominios.
NO_PROXY=localhost,127.0.0.1,.corp.example.com,registry.internal
Error 4: Las credenciales del proxy contienen símbolos no admitidos
En este caso, Docker puede fallar al iniciarse o al enrutar el tráfico a través de proxies. Para resolverlo, necesitas codificar en URL símbolos como @, #, %, :
Se verá así:
Environment=”HTTP_PROXY=http://user:Pa%%23ss@proxy:8080″
Error 5: Docker ignora la configuración de proxy de Desktop
Cuando estableces proxies usando Desktop pero los builds fallan y los containers no pueden establecer conexión, puede ser una señal de que debes usar otra opción de configuración. Desktop afecta al Daemon, pero no a los containers directamente. Prueba a establecer proxies a nivel de container.
En resumen
Docker y los proxies son una combinación poderosa que brinda velocidad, seguridad y un despliegue eficaz. Para sacarle el máximo partido, necesitas elegir una configuración adecuada y, por supuesto, optar por proxies de alta calidad obtenidos legalmente. DataImpulse te respalda en esto: hay 90+ millones de proxies de origen ético a tu servicio, así como soporte humano 24/7 para ayudarte con las tareas de desarrollo. No dudes en escribirnos a [email protected] o pulsa el botón “Try Now” para empezar con nosotros. Haz clic en “Try now” o contáctanos en [email protected] para empezar.
