2017-03-18 227 views
0

我在數字海洋中運行Docker服務器。在那裏我有兩個容器Nodejs和Mysql。 Mysql容器的開放端口爲3306.docker nodejs容器無法連接mysql容器

當試圖通過Docker Server的ip +端口通過nodejs訪問mysql時。我收到錯誤:連接ETIMEDOUT。

當我在本地計算機上運行相同的nodejs docker設置時,它工作正常。有什麼我失蹤?

這裏是碼頭工人的NodeJS,composer.yml:

version: '2' 
services: 
    test-web-install: 
     image: example-nodejs:latest 
     working_dir: /home/app 
     volumes: 
     - ./:/home/app 
     command: sh -c 'nodemon' 
     environment: 
     - NODE_ENV=development 
     - DB_HOST=192.168.11.207 #or public ip in internet 
     - DB_PORT=3036 
     - DB_PASSWORD=root 
     - DB_USER=root 
     - DB_DATABASE=root 
     ports: 
     - "3000:3000" 

這裏是碼頭工人,composer.yml爲MySQL

mysql: 
    container_name: flask_mysql 
    restart: always 
    image: mysql:5.6 
    environment: 
     MYSQL_ROOT_PASSWORD: 'root' # TODO: Change this 
     MYSQL_USER: 'root' 
     MYSQL_PASS: 'root' 
     MYSQL_DATABASE: 'root' 
    volumes: 
    - ./data:/var/lib/mysql 
    ports: 
    - "3036:3306" 
    restart: always 
+0

您是否嘗試通過'localhost:3306'到達mysql容器上喲你的本地電腦?請提供更多信息 - 碼頭文件/ docker-compose/outputs。到目前爲止,我的建議是使用docker-compose,並使用docker-compose dns(例如'mysql:3306')連接到橋網絡內的mysql容器,如果你的安裝程序允許數據庫只能訪問你的node.js服務器。 – BlackStork

+0

我想通過像Sequal Pro這樣的Mac客戶端訪問數據庫。我添加了這些設置文件。感謝您的幫助。 – user257980

回答

0

我將修改的答案,因爲我們提前 - 按照你的意見,而我無法訪問你的env,讓我們嘗試以增量方式解決:

  1. 讓我們使db對node.js服務器可見
  2. 看看它是如何工作,然後可能潛入env網絡配置。

有2種方式來解決第一個和我沒有能夠觸動你的ENV看到的可能是第二個問題:

一日一將確保服務器看到的數據庫,但如果您無法連接到從外面的數據庫似乎有防火牆/液滴網絡配置問題,你可以嘗試第二種方式(不太可能改變,但它是很好的嘗試)。這是假設你使用相同的碼頭工人撰寫和同一橋cusom網絡:

version: '2' 
services: 
    test-web-install: 
     image: example-nodejs:latest 
     working_dir: /home/app 
     volumes: 
     - ./:/home/app 
     command: sh -c 'nodemon' 
     environment: 
     - NODE_ENV=development 
     - DB_HOST= mysql 
     - DB_PORT=3036 
     - DB_PASSWORD=root 
     - DB_USER=root 
     - DB_DATABASE=root 
     ports: 
     - "3000:3000" 
    networks: 
     inner: 
     alias: server 
    mysql: 
    container_name: flask_mysql 
    restart: always 
    image: mysql:5.6 
    environment: 
     MYSQL_ROOT_PASSWORD: 'root' # TODO: Change this 
     MYSQL_USER: 'root' 
     MYSQL_PASS: 'root' 
     MYSQL_DATABASE: 'root' 
    volumes: 
    - ./data:/var/lib/mysql 
    ports: 
    - "<externalEnvIp>:3036:3306" 
    restart: always 
    networks: 
     inner: 
     alias: mysql 
networks: 
    inner: 
     driver: bridge 
     driver_opts: 
     com.docker.network.enable_ipv6: "true" 
     com.docker.network.bridge.enable_ip_masquerade: "true" 
     ipam: 
     driver: default 
     config: 
     - subnet: 172.16.100.0/24 
      gateway: 172.16.100.1 

選項2:

version: '2' 
services: 
    test-web-install: 
     image: example-nodejs:latest 
     working_dir: /home/app 
     volumes: 
     - ./:/home/app 
     command: sh -c 'nodemon' 
     environment: 
     - NODE_ENV=development 
     - DB_HOST= mysql 
     - DB_PORT=3036 
     - DB_PASSWORD=root 
     - DB_USER=root 
     - DB_DATABASE=root 
     ports: 
     - "3000:3000" 
     network_mode: "host" 
    mysql: 
    container_name: flask_mysql 
    restart: always 
    image: mysql:5.6 
    environment: 
     MYSQL_ROOT_PASSWORD: 'root' # TODO: Change this 
     MYSQL_USER: 'root' 
     MYSQL_PASS: 'root' 
     MYSQL_DATABASE: 'root' 
    volumes: 
    - ./data:/var/lib/mysql 
    ports: 
    - "3036:3306" 
    restart: always 
    network_mode: "host" 

更精確的解決方案(找到問題的根源),將涉及到深挖到您的ENV網絡配置,碼頭網絡設置等,但這些解決方案可能有助於解決您的問題。

請仔細閱讀後請輸出結果。

0

碼頭網絡不允許您從容器內返回到主機IP以連接到另一個容器公開的端口。我還沒有深究這是否是由於iptables規則或docker-proxy內部的某些原因造成的。無論哪種方式,它從來沒有值得調查,因爲容器到容器網絡是docker的一個內置功能。

要使用docker的網絡,容器需要位於同一個docker網絡中,並且您可以通過DNS中的容器名稱引用它們。通過docker-compose,通常您可以使用服務名稱代替容器名稱(例如,您的示例中的test-web-install和mysql),因爲compose會爲這些名稱創建別名。但是,由於您已經重寫了mysql的容器名稱,請改爲使用flask_mysql容器名稱。

在你的場景中,由於你已經用兩個單獨的docker-compose.yml文件拆分了啓動,所以你將在單獨的網絡上創建。你有兩個選擇來解決這個問題:

  1. 合併成一個單一的碼頭組成。yml(BlackStork gave an example of this)。
  2. 使用預先創建的外部定義網絡。

要做到後者,首先創建您的網絡:

docker network create dbnet 

然後更新您的碼頭工人,compose.yml的應用程序看起來像:

version: '2' 
networks: 
    dbnet: 
     external: true 

services: 
    test-web-install: 
     image: example-nodejs:latest 
     working_dir: /home/app 
     volumes: 
     - ./:/home/app 
     command: sh -c 'nodemon' 
     environment: 
     - NODE_ENV=development 
     - DB_HOST=flask_mysql 
     - DB_PORT=3036 
     - DB_PASSWORD=root 
     - DB_USER=root 
     - DB_DATABASE=root 
     ports: 
     - "3000:3000" 
     networks: 
     - dbnet 

而且泊塢窗,撰寫.yml for mysql:

version: '2' 

networks: 
    dbnet: 
    external: true 

services: 

    mysql: 
    container_name: flask_mysql 
    restart: always 
    image: mysql:5.6 
    environment: 
     MYSQL_ROOT_PASSWORD: 'root' # TODO: Change this 
     MYSQL_USER: 'root' 
     MYSQL_PASS: 'root' 
     MYSQL_DATABASE: 'root' 
    volumes: 
    - ./data:/var/lib/mysql 
    ports: 
    - "3036:3306" 
    restart: always 
    networks: 
    - dbnet 
相關問題