Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

1.1K
Visualizações
No se puede conectar a MySQL db usando el contenedor docker

Escribí una aplicación en Typescript que usa Typeorm para interactuar con una base de datos MySQL . Cuando ejecuto la aplicación usando npm run dev que es un script package.json , la conexión funciona bien con estas credenciales:

 "type": "mysql", "host": "127.0.0.1", "port": 3306, "username": "root", "password": "root", "database": "mydb",

pero cuando lanzo mi contenedor Docker obtengo:

 > Error: connect ECONNREFUSED 127.0.0.1:3306 > errno: -111, > code: 'ECONNREFUSED', > syscall: 'connect', > address: '127.0.0.1', > port: 3306, > fatal: true

No puedo resolver este problema, también traté de cambiar 127.0.0.1 con localhost pero el mismo problema. Eso es extraño porque estoy usando Dbeaver para conectarme con mi LAMP , que también es un contenedor contenedor Docker y puedo establecer la conexión.

Parece un problema relacionado solo con la conexión de contenedores, ¿quizás el contenedor de la aplicación no conoce la red 127.0.0.1 ?

Este es mi archivo de imagen:

 FROM node:stretch-slim WORKDIR /myapp COPY package.json ./ COPY ./dist ./dist RUN npm install EXPOSE 4000 ENV NODE_ENV development ENV PORT 4000 ENV URL http://localhost:4000 ENV JWT_SECRET secret CMD ["npm", "run", "start", "dev"]

y este es mi docker-compose.yml :

 version: '3' services: app: container_name: myapp restart: always build: . ports: - '4000:4000'

para compilar mis contenedores hice: docker-compose up --build

¿Lo que está mal? Como puede ver en el contenedor de mi lamp , cada puerto está correctamente expuesto:

ingrese la descripción de la imagen aquí

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

El problema aquí es que cada contenedor usa su propia red, aunque expuse el contenedor mysql en el puerto 3306 , no puedo acceder a mysql desde el contenedor myapp , porque el contenedor myapp usa otra red.

Entonces, al ejecutar el siguiente comando: docker network ls pude enumerar todas las redes disponibles, y luego lo hice:

 docker network inspect bridge

que ha devuelto la siguiente gateway de enlace: 172.17.0.1

La solución sería reemplazar localhost con 172.17.0.1 . Pero no me gusta demasiado la siguiente solución, así que reconstruí la imagen de myapp agregando previamente network_mode dentro de docker-compose.yml , así que ahora tengo:

 version: '3' services: app: container_name: myapp restart: always build: . ports: - '4000:4000' network_mode: 'host'

como dice la documentación:

Si usa el modo de red de host para un contenedor, la pila de red de ese contenedor no está aislada del host de Docker (el contenedor comparte el espacio de nombres de red del host), y el contenedor no obtiene su propia dirección IP asignada. Por ejemplo, si ejecuta un contenedor que se une al puerto 80 y utiliza una red de host, la aplicación del contenedor está disponible en el puerto 80 en la dirección IP del host.

No sé si existe una mejor solución, soy un novato de Docker hasta ahora, así que tal vez alguien más experto en esto podría proponer una mejor solución para compartir una red de contenedores como mysql y luego acceder a esa red compartida. red de otros contenedores.

Otra solución sería "host": "host.docker.internal"

over 4 years ago · Santiago Trujillo Relatório

0

docker-compose

docker-compose no se limita a un solo servicio, puede tener todo el sistema, lo que, en su caso, significa el servidor de base de datos, su aplicación y todas las demás cosas.

Puede cambiar su archivo docker-compose.yml a algo como a continuación (bit de MySQL copiado de https://hub.docker.com/_/mysql )

 version: '3' services: db: image: mysql command: --default-authentication-plugin=mysql_native_password restart: always environment: MYSQL_ROOT_PASSWORD: example app: container_name: myapp restart: always build: . ports: - '4000:4000'

Redes

Debido a que sus contenedores se muestran en el mismo docker-compose , de manera predeterminada, tienen acceso entre sí por nombre de host, por ejemplo, app y db . Para probar esto, docker attach/exec ejecutar la ventana acoplable a la app e intente hacer ping db a la base de datos.

Consulte https://stackoverflow.com/a/30173220/1148483

Esto significa que en su aplicación, puede usar db como la configuración del host DB.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda