복붙노트

[SPRING] 두 개의 고정 컨테이너 사이의 통신 문제

SPRING

두 개의 고정 컨테이너 사이의 통신 문제

나는 도커가 처음인데, 스프링 부팅 응용 프로그램을 부팅 디스커버리 컨테이너에 연결하여 포트 6603에있는 mymysql 도커 컨테이너에있는 mysql 서버에 연결하려고합니다. 둘 다 동일한 phisical 컴퓨터에서 실행됩니다. 사실은 : 데이터베이스와 통신하기 위해 스프링 부트 응용 프로그램을 mymysql 도커 컨테이너에 연결하면 오류가 발생하지 않고 모든 것이 정상적으로 작동합니다.

스프링 부트 애플리케이션을 부트 예제 컨테이너로 옮기고 (최대 절전 모드를 통해) mymysql 컨테이너와 통신하려고하면 다음 오류가 발생합니다.

2018-02-05 09:58:38.912 ERROR 1 --- [           main] o.a.tomcat.jdbc.pool.ConnectionPool      : Unable to create initial connections of pool.

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_111]

내 봄 부팅 application.properties 위치 :

server.port=8083
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://localhost:6603/mydockerdb
spring.datasource.username=root
spring.datasource.password=mypassword

내 스프링 부팅 응용 프로그램이 포트 8082의 도커 컨테이너에서 실행될 때까지 작동합니다 (도커 이미지가 올바르게 빌드 된 후).

docker run -it -p 8082:8083 boot-example 

해결법

  1. ==============================

    1.위의 제안에 따라 Docker 작성은 길이나 compose / swarm 모드를 사용하지 않으려는 경우에 유용합니다.

    위의 제안에 따라 Docker 작성은 길이나 compose / swarm 모드를 사용하지 않으려는 경우에 유용합니다.

    docker 악마의 DNS 확인을 사용하면 컨테이너가 서로를 발견하여 통신 할 수 있습니다. [DNS는 기본적으로 브리지에서 지원되지 않습니다. 브릿지를 사용하는 사용자 정의 네트워크는 않습니다.]

    자세한 내용은 다음을 참조하십시오. https://docs.docker.com/engine/userguide/networking/

  2. ==============================

    2.컨테이너 내부에서는 localhost를 사용할 수 없으며 컨테이너 자체입니다. 따라서 항상 연결 거부 오류가 발생합니다.

    컨테이너 내부에서는 localhost를 사용할 수 없으며 컨테이너 자체입니다. 따라서 항상 연결 거부 오류가 발생합니다.

    당신은 아래 일을 할 수 있습니다 -

    PS - 여러 컨테이너를 함께 통합해야 할 때마다 언제나 도커 - 버전 3 이상을 작성하십시오. 도커 실행 | 빌드를 사용하여 기본 사항 및 건조 / 테스트 실행을 이해하십시오.

  3. ==============================

    3.@ vivekyad4v가 제안한대로 - 당신의 욕망을 달성하는 가장 쉬운 방법은 더 나은 컨테이너 통신 통합을 가진 도커 - 작성 (docker-compose)을 사용하는 것입니다.

    @ vivekyad4v가 제안한대로 - 당신의 욕망을 달성하는 가장 쉬운 방법은 더 나은 컨테이너 통신 통합을 가진 도커 - 작성 (docker-compose)을 사용하는 것입니다.

    Docker-compose는 단일 또는 다중 도커 컨테이너를 관리하기위한 도구입니다. docker-compose.yml이라는 단일 구성 파일을 사용합니다.

    도커 작성에 대한 자세한 내용은 설명서를 참조하고 파일 참조를 작성하십시오.

    내 경험에 비추어 볼 때, SRP (single responsibility principle)를 따르는 것이 좋습니다. 따라서 데이터베이스와 컨테이너를 하나씩 생성하는 것이 좋습니다. 둘 다 구성에서 지정한 네트워크를 사용하여 통신합니다.

    docker-compose.yml의 예는 다음과 같이 도움이 될 수 있습니다 :

    version: '2'
     networks: 
     # your network name
      somename:
        driver: bridge
    
    services:
       # PHP server
      php:
       image: dalten/php5.6-apache
       ports:
        - 80:80
       volumes:
        - .application_path:/some/application/path
       # your container network name defined at the beggining 
       networks: 
        - somename
    
       # Mysql server for backend
      mysql:
       image: dalten/mysql:dev
       ports:
        - 3306:3306
       # The /var/lib/mysql volume MUST be specified to achieve data persistence over container restart
       volumes:
        - ./mysql_data:/var/lib/mysql
       environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: backend
       # your container network name defined at the beggining 
       networks: 
          - somename
    

    참고 : 내부 컨테이너에서 서비스 이름을 호출하여 네트워크 내부 컨테이너 간의 통신을 수행 할 수 있습니다.

    PHP에서 MySQL 컨테이너에 연결하는 매개 변수는 다음과 같습니다.

    hostname: mysql
    port: 3306
    database: backend
    user: root
    password: root
    
  4. from https://stackoverflow.com/questions/48620107/trouble-communicating-between-two-docker-containers by cc-by-sa and MIT license