es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Estás intentando acceder a un servidor que se ejecuta en localhost:3000 desde tu servicio php. Has intentado añadir extra_hosts a la configuración del servicio php, pero obtienes un error de Conexión rechazada cuando intentas curl http://localhost:3000. También has intentado añadir un mapeo de puertos al contenedor php, pero obtienes un error diciendo que el puerto ya se está utilizando. También has intentado añadir network_mode: host, pero obtienes un error diciendo que entra en conflicto con links.

    Parece que necesitas encontrar una forma de acceder al servidor que se ejecuta en localhost:3000 desde tu servicio php. Podrías intentar usar un puerto diferente para el servidor, o podrías intentar usar un modo de red diferente para tu servicio php.

Comments are closed.