簡體   English   中英

為什么我的Docker容器不互相通信

[英]Why will my Docker containers not talk to each other

我試圖讓我的節點快速泊塢窗容器與我的mysqldb容器對話。 但是當我查詢時,我總是得到:'connect ECONNREFUSED 127.0.0.1:3306'。 我究竟做錯了什么?

這是我的docker-compose.yml。 它旋轉了我的兩個容器。 如果我不使用容器而使用express,則my-api可以工作。 但不是一成不變。 當它在docker中運行時,express似乎路由不錯,但不會連接到另一個容器中的數據庫。

services:
  api:
    image: node:8
    container_name: my-api
    build:
      context: .
      dockerfile: Dockerfile
    command: npm run start
    volumes:
      - .:/usr/app/
      - /usr/app/node_modules
    ports:
      - "3000:3000"
    depends_on:
      - mysqldb
    expose:
      - 3000
    environment:
      PORT: 3000
      REACT_APP_BASE_URL: http://localhost:3000
      DB_HOST: localhost
      DB_NAME: test
      DB_USER: test
      DB_PASS: test
  mysqldb:
    image: mysql:5.7
    container_name: mysqldb
    command: mysqld --user=root --verbose
    volumes:
       - ./schemadump.sql:/docker-entrypoint-initdb.d/schemadump.sql
    ports:
      - "3306:3306"
    expose:
      - 3306
    environment:
      MYSQL_DATABASE: "test"
      MYSQL_USER: "test"
      MYSQL_PASSWORD: "test"
      MYSQL_ROOT_PASSWORD: "root"
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"

這是我的碼頭工人文件

FROM node:8

WORKDIR /usr/src/app

COPY ./package.json .

RUN npm install
COPY . .

EXPOSE 3000
CMD [ "npm", "start" ]

這是我的數據庫連接文件:

const mysql = require('mysql')

module.exports = function databaseCall (sql) {
  const connection = mysql.createConnection({
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASS,
    database: process.env.DB_NAME
  })
  ...
}

使用mysqldb代替localhost

       DB_HOST: mysqldb

容器可在docker compose環境中通過其服務名稱進行訪問。 localhost基本上是指您的API容器本身。

Docker容器充當隔離的機器,它們具有自己的網絡,包括自己的本地主機。 Docker-compose為您創建了一個內部網絡,您應該能夠使用服務名稱在容器之間進行通信。

例如,通過API,您可以通過將host指定為“ mysqldb”來訪問數據庫

Docker容器擁有自己的DNS系統。 通過容器名稱,您可以訪問其他容器,但它們應屬於一個網絡。

// docker compose file 

conatiner_name: api-app
..
 networks:
  - main-network

// other container

container_name:main-app
..
networks:
  - main-network


// In your main app.
await axios.post('http://api-app:3000/entinty-name',{data: { name: "xyz" } });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM