Acceder al host desde un contenedor de Docker.
Pregunta
Tengo una aplicación en docker y utilizo el siguiente docker-compose.yml para ejecutarla:
version: '3.1'
services:
db:
image: mysql:5.7
ports:
- "3306:3306"
env<em>file:
- ./docker/db/.env
volumes:
- ./docker/db/data:/var/lib/mysql:rw
- ./docker/db/config:/etc/mysql/conf.d
command: mysqld --sql</em>mode="NO<em>ZERO</em>IN<em>DATE,ERROR</em>FOR<em>DIVISION</em>BY<em>ZERO,NO</em>AUTO<em>CREATE</em>USER,NO<em>ENGINE</em>SUBSTITUTION"
<pre><code>php:
build: ./docker/php/7.4/
volumes:
- ./docker/php/app.ini:/usr/local/etc/php/conf.d/docker-php-ext-app.ini:ro
- ./docker/logs/app:/var/www/app/var/log:cached
- .:/var/www/app:cached
working_dir: /var/www/app
links:
- db
env_file:
- ./docker/php/.env
webserver:
image: nginx:1
depends_on:
- php
volumes:
- ./docker/webserver/app.conf:/etc/nginx/conf.d/default.conf:ro
- ./docker/logs/webserver/:/var/log/nginx:cached
- .:/var/www/app:ro
ports:
- "80:80"
</code></pre>
Tengo un servidor que no se encuentra en docker en mi máquina, al que puedo acceder a través de <code>localhost:3000</code>. Me gustaría que mi servicio <code>php</code> pudiera acceder a él.
Encontré que algunas personas sugieren agregar lo siguiente a mi configuración de servicio <code>php</code>:
<code>
extra_hosts:
- "host.docker.internal:host-gateway"
</code>
Pero cuando lo agrego, entonces <code>docker-compose up -d</code> y trato de <code>docker exec -ti php_1 curl http://localhost:3000</code>, obtengo <code>curl: (7) Failed to connect to localhost port 3000 after 0 ms: Connection refused</code>. Tengo el mismo error cuando intento <code>curl http://host.docker.internal:3000</code>.
Desesperadamente intenté agregar un mapeo de puertos al contenedor <code>php</code>:
<code>
ports:
- 3000:3000
</code>
Pero entonces, cuando inicio los servicios, tengo el siguiente error:
ERROR: for php1 Cannot start service php: driver failed programming external connectivity on endpoint php1 (9dacd567ee97b9a46699969f9704899b04ed0b61b32ff55c67c27cb6867b7cef): Error starting userland proxy: listen tcp4 0.0.0.0:3000: bind: address already in use
ERROR: for php Cannot start service php: driver failed programming external connectivity on endpoint php_1 (9dacd567ee97b9a46699969f9704899b04ed0b61b32ff55c67c27cb6867b7cef): Error starting userland proxy: listen tcp4 0.0.0.0:3000: bind: address already in use
“`
Lo cual es obvio ya que mi servidor está ejecutándose en ese puerto 3000
.
También intenté agregar
network_mode: host
Pero falla porque ya tengo un links
. Obtengo el siguiente error:
Cannot create container for service php: conflicting options: host type networking can't be used with links.
Estoy ejecutando docker v20.10.6 en Ubuntu 21.10.
Cualquier ayuda es apreciada, ¡gracias de antemano!
davy.ai
Estás intentando acceder a un servidor que se ejecuta en
localhost:3000
desde tu serviciophp
. Has intentado añadirextra_hosts
a la configuración del serviciophp
, pero obtienes un error deConexión rechazada
cuando intentascurl http://localhost:3000
. También has intentado añadir un mapeo de puertos al contenedorphp
, pero obtienes un error diciendo que el puerto ya se está utilizando. También has intentado añadirnetwork_mode: host
, pero obtienes un error diciendo que entra en conflicto conlinks
.Parece que necesitas encontrar una forma de acceder al servidor que se ejecuta en
localhost:3000
desde tu serviciophp
. Podrías intentar usar un puerto diferente para el servidor, o podrías intentar usar un modo de red diferente para tu serviciophp
.