2017-03-18 1 views
0

나는 Digital Ocean에서 Docker 서버를 실행 중입니다. 거기에 두 개의 컨테이너 Nodejs와 MySQL이 있습니다. MySQL 컨테이너가 3306에 열린 포트를 가지고있다.docker nodejs 컨테이너 캔트 mysql 컨테이너에 연결

Docker Server ip + port에 의해 nodejs를 통해 mysql에 접근하려고 할 때. 오류 : ETIMEDOUT을 연결합니다.

로컬 컴퓨터에서 동일한 nodejs 도커 설정을 실행할 때 정상적으로 작동합니다. 내가 놓친 게있어? 여기

은 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" 

MySQL 용 고정 표시기-composer.yml이다

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 컨테이너에 접근하려고합니까? UR 로컬 컴퓨터? 도커 파일/도커 작성/출력과 같은 더 많은 정보를 제공해주십시오. 지금까지 제 제안은 docker-compose를 사용하고 docker-compose dns (즉, mysql : 3306')를 사용하여 브리지 네트워크 내에서 mysql 컨테이너에 연결하는 것입니다. 설치 프로그램이 db가 node.js에서만 사용할 수 있도록 허용 할 수 있다면 섬기는 사람. – BlackStork

+0

Sequal Pro와 같은 Mac 클라이언트에서도 DB에 액세스하고 싶습니다. 나는 그 설정 파일들을 추가했다. 도와 줘서 고맙다. – user257980

답변

0

제가 수정하겠습니다 대답 우리는 전진으로 - 귀하의 의견에 따라 반면, 귀하의 env에 액세스 할 수 없으며 점진적으로 문제를 해결할 수 있습니다 :

  1. db를 node.js 서버에서 볼 수있게하려고합니다.
  2. 작동 방식을 확인한 다음 env 네트워킹 구성에 대해 알아보십시오. 첫째을 해결하고 난 당신의 ENV 접촉 할 수없이 보는 바와 같이 2 차 문제가있을 수 있습니다

이 2 가지 방법 :

연결할 수없는 경우

1 일 서버가 데이터베이스를 볼 수 있도록,하지만 것 외부의 DB가 방화벽/물방울 네트워킹 구성 문제로 보입니다. 두 번째 방법을 시도해 볼 수는 있습니다 (변경할 가능성은 없지만 시도해 보는 것이 좋습니다). 당신의 ENV에 깊이 파고에 포함 할

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" 

더 정확한 솔루션 (문제의 뿌리를 찾을 수) :

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 : 이것은 당신이 동일한 고정 표시기의 작성과 같은 브리지의 맞춤 네트워크를 사용하는 가정 네트워크 구성, docker 네트워킹 설정 등이 있지만 이러한 솔루션을 사용하면 현재 문제를 해결할 수 있습니다.

시도해 주시면 결과를 출력 해주세요.

0

도커 네트워킹은 컨테이너 내부에서 다른 호스트로 노출 된 포트에 연결하기 위해 호스트 IP로 되돌아 갈 수 있도록 허용하지 않습니다. iptables 규칙 또는 docker-proxy의 내부에있는 것인지 확인하기에 충분합니다. 컨테이너 - 투 - 컨테이너 네트워킹이 도커의 기능에 내장되어 있기 때문에 어떤 방법으로도 조사 할 가치가 없습니다.

도커의 네트워킹을 사용하려면 컨테이너가 동일한 도커 네트워크에 있어야하며 DNS의 컨테이너 이름으로 컨테이너를 참조해야합니다. docker-compose를 사용하면 일반적으로 compose가 별칭을 만들기 때문에 컨테이너 이름 대신 서비스 이름 (예 : test-web-install 및 mysql)을 사용할 수 있습니다. 그러나 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 

그리고 고정 표시기-작성 mysql에 대한 .yml :

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 
관련 문제