인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

river_bori님의 프로필 이미지
river_bori

작성한 질문수

입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기

[실습] Docker로 프로젝트 빌드하기

도커로 크롬에서 프로그램 열기

작성

·

23

0

안녕하세요.

크롬에서 프로그램을 열 수 없습니다. (11:00)

https://github.com/bohuiKang/portfolio_bohui

아래에 에러 메시지입니다. 어떤 부분이 문제인지 찾지 못했습니다..

어디가 문제인지 알 수 있을까요?

2024-12-12 18:14:04 2024-12-12T09:14:04.434Z INFO 1 --- [nio-8080-exec-8] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2024-12-12 18:14:04 2024-12-12T09:14:04.434Z WARN 1 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 08S01
2024-12-12 18:14:04 2024-12-12T09:14:04.434Z ERROR 1 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : Communications link failure
2024-12-12 18:14:04 2024-12-12 18:14:04 The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
2024-12-12 18:14:04 2024-12-12T09:14:04.436Z WARN 1 --- [ main] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: Could not obtain connection to query metadata
2024-12-12 18:14:04 2024-12-12 18:14:04 org.hibernate.exception.JDBCConnectionException: unable to obtain isolated JDBC connection [Communications link failure
...
2024-12-12 18:14:04 2024-12-12T09:14:04.574Z WARN 1 --- [ main] org.hibernate.orm.deprecation : HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)
...
2024-12-12 18:14:21 2024-12-12T09:14:21.680Z WARN 1 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 08S01
2024-12-12 18:14:21 2024-12-12T09:14:21.680Z ERROR 1 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : Communications link failure
2024-12-12 18:14:21 2024-12-12 18:14:21 The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
2024-12-12 18:14:21 2024-12-12T09:14:21.742Z INFO 1 --- [nio-8080-exec-1] c.b.p.a.advice.AdminApiControllerAdvice : Could not open JPA EntityManager for transaction
2024-12-12 18:14:21 2024-12-12 18:14:21 org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction

...

답변 2

0

정보근님의 프로필 이미지
정보근
지식공유자

안녕하세요 정보근입니다:)

 

올려주신 로그를 보면 Communications link failure라는 메시지가 확인되는데요.

MySQL에 연결하려고 했으나 정상적으로 커넥션이 성립되지 않은 것으로 보입니다.

추정 가능한 원인은 여러가지가 있는데, 몇가지 말씀드릴테니 확인해주세요.

 

  1. application-docker.yml에서 mysql URL에 오타가 없는지 확인한다.

  2. MySQL 도커 컨테이너가 실행 중인지 확인한다.

  3. docker-compose.yml 파일에서 컨테이너의 포트 정보를 3306:3306으로 세팅했는지 확인한다.

  4. docker-compose의 컨테이너 이름과 application-docker의 URL 정보가 맞는지 확인한다. 예를 들어 컨테이너 이름이 "mydb"라면 url은 jdbc:mysql://mydb:3306과 같이 되어야 한다.

 

이 정도 사항을 확인해보시면 될 것 같습니다.

참고로 올려주신 깃허브 소스의 application-docker를 보니 3307 포트로 지정해두셨는데요.

이 경우 docker-compose.yml에서는 3307:3306으로 설정해야 연결이 될 겁니다.

혹은 application-docker의 mysql 정보를 3306 포트로 변경하거나요.

 

간단히 설명하자면 로컬 컴퓨터의 포트와 도커 컨테이너의 포트를 연결해주는 설정입니다.

컨테이너 내부에서는 3306 포트에서 mysql이 실행되고 있는데,

이 컨테이너의 3306 포트를 로컬호스트의 3307 포트와 연결해줘야

사용중인 컴퓨터에서 3307 포트를 통해 도커 컨테이너의 3306 포트로 접속할 수 있습니다.

 

감사합니다.

river_bori님의 프로필 이미지
river_bori
질문자

dbeaver에서 mysql연결할 때, port를 3306으로 하면 연결이 안되어 3307로 진행했습니다.

  1. application-docker.yml에서 mysql URL에 오타가 없는지 확인한다.

    1. url에서 3307만 변경했습니다.

  2. MySQL 도커 컨테이너가 실행 중인지 확인한다.

    1. docker.desktop 터미널에서 docker ps 명령어로 실행 확인했습니다.

       

  3. docker-compose.yml 파일에서 컨테이너의 포트 정보를 3306:3306으로 세팅했는지 확인한다.

    1. port를 3307로 변경해서 3307:3306으로 세팅했습니다.

  4. docker-compose의 컨테이너 이름과 application-docker의 URL 정보가 맞는지 확인한다. 예를 들어 컨테이너 이름이 "mydb"라면 url은 jdbc:mysql://mydb:3306과 같이 되어야 한다

     

    1. docker-compose.yml

      version: '2'
      
      services:
        mysql:
          image: mysql
          container_name: mysql
          ports:
            - "3307:3306"
          environment:
            - "MYSQL_ROOT_PASSWORD=..."
            - "TZ=Asia/Seoul"
          command:
            - --character-set-server=utf8mb4
          volumes:
            - /var/lib/docker/volumes/mysql/_data:/var/lib/mysql
      
        portfolio-bohui:
          image: rivrbori/portfolio-bohui
          container_name: portfolio-bohui
          ports:
            - "8080:8080"
          environment:
            - "SPRING_PROFILES_ACTIVE=docker"
            - "jasypt.encryptor.key=..."
          volumes:
            - /var/lib/docker/volumes/portfolio-bohui/_data:/tmp
          depends_on:
            - mysql
      • application-docker.yml

      spring:
        jpa:
          database: mysql
          open-in-view: false
          show-sql: true
          hibernate:
            ddl-auto: none
          properties:
            hibernate:
              format_sql: false
              default_batch_fetch_size: 10
        datasource:
          url: jdbc:mysql://mysql:3307/portfolio
          username: root
          password: ENC(...)
          driver-class-name: com.mysql.cj.jdbc.Driver

port 문제인가 싶어 cmd 창에서 3306, 3307을 검색했는데, time wait 등이 없는 걸로 봐선 괜찮은 것 같습니다.

netstat -ano | findstr 3306
  TCP    0.0.0.0:3306           0.0.0.0:0              LISTENING       5432
  TCP    [::]:3306              [::]:0                 LISTENING       5432

netstat -ano | findstr 3307
  TCP    0.0.0.0:3307           0.0.0.0:0              LISTENING       21616
  TCP    127.0.0.1:3307         127.0.0.1:64064        ESTABLISHED     21616
  TCP    127.0.0.1:3307         127.0.0.1:64065        ESTABLISHED     21616
  TCP    127.0.0.1:3307         127.0.0.1:64066        ESTABLISHED     21616
  TCP    127.0.0.1:64064        127.0.0.1:3307         ESTABLISHED     7864
  TCP    127.0.0.1:64065        127.0.0.1:3307         ESTABLISHED     7864
  TCP    127.0.0.1:64066        127.0.0.1:3307         ESTABLISHED     7864
  TCP    [::]:3307              [::]:0                 LISTENING       21616
  TCP    [::1]:3307             [::]:0                 LISTENING       21536
tasklist /FI "PID eq 5432"

이미지 이름                    PID 세션 이름              세션#  메모리 사용
========================= ======== ================ =========== ============
mysqld.exe                    5432 Services                   0      3,448 K

tasklist /FI "PID eq 21616"

이미지 이름                    PID 세션 이름              세션#  메모리 사용
========================= ======== ================ =========== ============
com.docker.backend.exe       21616 Console                    7     88,124 K

tasklist /FI "PID eq 7864"

이미지 이름                    PID 세션 이름              세션#  메모리 사용
========================= ======== ================ =========== ============
dbeaver.exe                   7864 Console                    7    298,992 K

tasklist /FI "PID eq 21536"

이미지 이름                    PID 세션 이름              세션#  메모리 사용
========================= ======== ================ =========== ============
wslrelay.exe                 21536 Console                    7      5,096 K

혹시 제가 확인하지 못하고 놓친 부분이 있어서 에러가 나는 걸까요...?

정보근님의 프로필 이미지
정보근
지식공유자

안녕하세요 제가 답변이 늦었습니다.

 

설명을 잘못 드린 부분이 있습니다.

 

앞서 3307:3306으로 설정했으니 datasource.url의 포트를 3307로 해줘야 한다고 했었는데요.

 

만약 포트폴리오 프로젝트를 로컬호스트에서 실행시켜서 MySQL 컨테이너에 접속하려는거면 이게 맞습니다.

 

MySQL 프로세스는 MySQL 도커 컨테이너의 3306 포트에서 실행이 되고 있고,

 

이 3306 포트를 로컬호스트의 3307 포트와 연결시켜주는 것이거든요.

 

그래서 로컬호스트에서 도는 포트폴리오 프로젝트는 같은 로컬호스트의 3307 포트로 접속해야,

 

거기 연결된 도커 컨테이너 3306 포트의 MySQL 프로세스에 접속합니다.

 

다만 지금 케이스는 포트폴리오 또한 도커 컨테이너로 돌고 있습니다.

 

그리고 도커 컴포즈를 통해 포트폴리오와 MySQL 컨테이너를 같이 실행시켰는데,

 

이럼 도커 컴포즈에서 기본적으로 두 컨테이너가 같은 네트워크를 공유하게 해줘요.

 

즉 포트폴리오 컨테이너에서는 mysql:3306 포트를 통해 mysql 컨테이너의 3306 포트에서 돌고 있는 mysql 프로세스에 접속 가능한 것입니다.

 

(글로 설명하니 잘 전달이 될지 모르겠네요. 도커 네트워크에 대해 별도로 찾아보시거나, 추가로 댓글 달아주시면 제가 그림 그려드릴게요)

 

제가 프로젝트 받은 뒤 컨테이너로 둘 다 실행해서 확인 후 말씀드리는거니

 

jdbc:mysql://mysql:3306/portfolio로 url 변경해주면 잘 될 것 같네요.

 

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. river_bori님.

프로젝트를 Docker로 실행할 때 크롬에서 열리지 않는 문제는 주로 데이터베이스 연결 오류로 인해 발생할 수 있으며, 제공하신 로그를 기반으로 몇 가지 점을 유추할 수 있습니다.

  1. Communications Link Failure: 해당 에러는 데이터베이스(MySQL 등) 서버와의 연결이 실패했음을 나타냅니다. 이는 데이터베이스가 실행 중이지 않거나, 애플리케이션에서 데이터베이스에 연결할 수 있는 네트워크 경로가 없기 때문일 수 있습니다.

  2. 포트 확인: Docker Compose 설정 파일(docker-compose.yml)을 확인하여 MySQL 설정이 올바르게 되어 있는지, 포트가 열려 있는지 확인해보세요. 일반적으로 MySQL의 기본 포트는 3306입니다. 외부 네트워크에서 접근 가능한지 확인해야 합니다.

  3. 데이터베이스 설정: 애플리케이션의 application.yml이나 application.properties 파일에 설정된 데이터베이스 URL, 사용자 이름, 비밀번호가 정확한지 확인하세요.

  4. Docker 네트워크 구성: Docker 네트워크가 제대로 구성되어 있지 않거나, 애플리케이션의 Docker 컨테이너가 데이터베이스와 같은 네트워크에 속해 있지 않을 경우, 연결이 거부될 수 있습니다.

  5. DNS 또는 호스트 문제: Docker 환경에서 사용 중인 호스트네임이나 IP 주소가 올바르지 않을 수 있습니다. Docker 네트워크 환경에서 MySQL 서버가 포트에 대해 클라이언트를 허용하고 있는지 확인하세요.

관련 질문을 다룬 기존의 Q&A가 궁금하시다면 다음 링크를 참고하세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

river_bori님의 프로필 이미지
river_bori

작성한 질문수

질문하기