본문 바로가기
Programming/Etc

docker compose를 이용한 mariadb build시 트러블 슈팅 (3306이 아닌 다른 포트 사용시)

by Renechoi 2023. 5. 23.

문제상황 : 

 

도커 컴포즈를 이용해 mariaDb를 생성하고 jdbc 혹은 datagrip을 이용해 접속하려고 했을 때 아래와 같은 에러가 발생했다. 

 

Caused by: java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=localhost)(port=3307)(type=master) : Could not connect to localhost:3307 : unexpected end of stream, read 0 bytes from 4 (socket was closed by server)

 

이러한 상황은 로컬에서 이미 3306 포트를 사용하고 있기 때문에 포트 번호를 바꿔주려고 시도한 데서부터 발생했다. 

pharmacy-recommendation-database:
  container_name: pharmacy-recommendation-database
  build:
    dockerfile: Dockerfile
    context: ./database
  image: renechoi/pharmacy-recommendation-database
  environment:
    - MARIADB_DATABASE=pharmacy-recommendation
    - MARIADB_ROOT_PASSWORD=${PASSWORD}
  volumes:
    - ./database/config:/etc/mysql/conf.d
    - ./database/init:/docker-entrypoint-initdb.d
  ports:
    - "3308:3308"

 

ps 명령어를 통해 컨테이너가 정상적으로 생성되고 

해당 컨테이너 내부에 db도 모두 생성되는 것을 확인했지만 

계속해서 위와 같은 에러를 띄우며 접속이 안되었다. 

 

docker compose가 빌드시 사용하는 cnf 파일을 아래와 같이 바꾸어 주어도 문제가 해결되지 않았다. 

 

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
bind-address=0.0.0.0
port=3308

[mysqldump]
default-character-set=utf8mb4

 

 

해결:

 

생각보다 문제는 간단히 풀렸다.

 

3306:3306 포트의 의미를 다시 생각해보아야 한다. 

 

위와 같은 설정은 3306 포트로 들어오면 도커 내부의 3306포트로 forwarding 한다는 것이다. 

 

3307:3306으로 하든 3307:3307로 하든 그 의미를 잘 알아야 한다. 로컬에서 접속시에는 앞의 3307을 사용할 것이고, 무엇이 되었든 그 포트로 접속되는 것을 전부 3306 혹은 3307로 포워딩한다는 것이다. 

 

즉, 도커 내부에서 3306, 3307을 제대로 받을 수 있어야 한다. 

 

문제는 도커에 생성되는 mariaDb의 포트가 여전히 3306으로 잡혀있다는 것이다. 

 

따라서 문제는 이렇게 요약되었다. 

 

만약 3307:4000으로 포트 번호를 지정한다면 docker 컨테이너 내의 mariaDb의 4000번 포트로 지정해주는 작업이 필요할 것인가? 

-> yes 

 

그것이 가능할 것인가? 

-> yes 

 

다음과 같은 방식으로 변경이 가능하다. 

 

1. 컨테이너를 확인한다.

docker ps

 

2. container id를 통해 해당 컨테이너에 접속한다. 

 

docker exec -it 7b88a8eaf973 bash

 

3. configuration 파일을 찾고 들어간다. 

 

 

vim 편집기를 사용하는 예시는 다음과 같다. 

 

vim etc/mysql/my.cnf

 

만약 vim이 없다면 다음 명령어로 install 할 수 있다. 

 

apt update
apt install vim

 

 

my.cnf 에 들어갔다면 다음과 같이 port 번호를 바꿔준다. 

 

 

4. 컨테이너를 재시작한다. 

 

 

이후 정상적으로 접속이 되는 것을 확인할 수 있다. 

 

 

반응형