[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.위의 제안에 따라 Docker 작성은 길이나 compose / swarm 모드를 사용하지 않으려는 경우에 유용합니다.
위의 제안에 따라 Docker 작성은 길이나 compose / swarm 모드를 사용하지 않으려는 경우에 유용합니다.
docker 악마의 DNS 확인을 사용하면 컨테이너가 서로를 발견하여 통신 할 수 있습니다. [DNS는 기본적으로 브리지에서 지원되지 않습니다. 브릿지를 사용하는 사용자 정의 네트워크는 않습니다.]
자세한 내용은 다음을 참조하십시오. https://docs.docker.com/engine/userguide/networking/
-
==============================
2.컨테이너 내부에서는 localhost를 사용할 수 없으며 컨테이너 자체입니다. 따라서 항상 연결 거부 오류가 발생합니다.
컨테이너 내부에서는 localhost를 사용할 수 없으며 컨테이너 자체입니다. 따라서 항상 연결 거부 오류가 발생합니다.
당신은 아래 일을 할 수 있습니다 -
PS - 여러 컨테이너를 함께 통합해야 할 때마다 언제나 도커 - 버전 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
from https://stackoverflow.com/questions/48620107/trouble-communicating-between-two-docker-containers by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring 데이터로 저장 프로 시저를 호출하여 엔티티를 선택하는 방법 (0) | 2019.04.01 |
---|---|
[SPRING] 봄을 사용하여 속성 파일 재정의 (0) | 2019.04.01 |
[SPRING] 스프링 보안, 폼 로그인 및 동시 세션 (0) | 2019.03.31 |
[SPRING] 스프링 배치 주석을 사용하여 itemprocessor로 Job 매개 변수를 가져 오는 방법 (0) | 2019.03.31 |
[SPRING] Spring MappingJacksonJsonView, JSP 뷰 대신 사용하는 법을 가르쳐주세요. (0) | 2019.03.31 |