쌓고 쌓다

Docker로 서버 동작하기 / MySQL 외부 접속, 아이피 허용 본문

프로그래밍/SQL

Docker로 서버 동작하기 / MySQL 외부 접속, 아이피 허용

승민아 2024. 4. 12. 17:02

아래의 Dockerfile을 만들어 주자.

FROM openjdk:17
ARG JAR_FILE=build/libs/spotServer-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
  • COPY :  ${JAR_FILE}를 도커 이미지의 ./app.jar 경로에 복사한다.
  • ENTRYPOINT : Docker 컨테이너가 시작될때 실행되는 명령을 지정한다.

 

그리고 로컬에서 빌드한다. 테스트 코드는 빌드에서 제외하기 위해 -x test를 추가해주었다.

./gradlew build -x test

빌드한 파일은 JAR_FILE 경로에 존재하게 된다.

 

그리고 다음 명령어를 실행하자.

docker build --platform linux/amd64 --tag <dockerid>/<이미지명>:<버전> .

 

--platform 옵션을 주지 않고 ec2에서 서버를 동작하면 다음과 같은 에러를 만나기에 환경을 지정해주자.

 

WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64/v3) and no specific platform was requested

=> docker build --platform linux/amd64 --tag dltmdals6718/spot-server:1.0.0 .

 

 

이제 빌드된 이미지를 푸쉬하자!

docker push dltmdals6718/spot-server:1.0.0 

 

이미지가 잘 올라갔는지 확인할 수 있다.

docker search dltmdals6718/spot-server

 

이제 로컬에서 올린 이미지를 EC2에서 당겨와서 받아보자.

docker pull dltmdals6718/spot-server:1.0.0

 

이미지를 확인하는 명렁어이다.

docker images

이미지를 잘 가져왔다.

 

이제 컨테이너를 올려보자.

docker run -d -p 8080:8080 dltmdals6718/spot-server:1.0.0

 

그런데 docker ps -a 명령어로 확인하는데 자꾸 컨테이너가 죽어있는 상황이 발생한다.

계속 꺼진다..

 

로그를 한번 출력해보자.

ps -a 명령어에 NAMES필드를 통해 로그 출력해볼 수 있다.

 

docker logs heuristic_hugle

JDBC 에러가 뜬다. MySQL의 접속이 잘 안되는것 같다.

 

application.properties의 일부분이다.

spring.datasource.url=jdbc:mysql://localhost:3306/spot

localhost의 db로 접속을 못하고 있는 것 같다.

 

그럼 DB를 컨테이너로 올리던지. EC2의 DB를 사용하던지

두가지 선택지가 있는 것 같다.

 

MySQL도 docker를 통해 뛰어야하나?

https://hyeon9mak.github.io/why-does-not-run-database-on-docker/

 

도커 위에 데이터베이스를 운영하지 않는 이유

 

hyeon9mak.github.io

EC2의 DB에 접속하는 방식으로 하고자 한다.

 

일단 application.properties를 다음과 같이 변경했다.

spring.datasource.url=jdbc:mysql://서버ip:3306/spot

 

외부인 Docker 컨테이너에서 EC2 MySQL은 어떻게 접속하도록 설정할 수 있을까?

 

EC2 보안 그룹에서 3306 포트의 인바운드 규칙을 추가해주자.

 

그리고 아래의 명령어를 치자.

vi /etc/mysql/mysql.conf.d/mysqld.cnf

127.0.0.1로 local에서만 접속이 가능한 MySQL을 0.0.0.0로 모든 ip가 접속이 가능하게 해주자.

 

위의 쿼리를 날려보면 localhost만 접속 허용을 해두고 있다. 이것을 모든 ip에서 접속이 가능하게 UPDATE문을 날리자.

 

UPDATE mysql.user SET Host='%' WHERE User='root';
FLUSH PRIVILEGES;

 

정말 외부 접속이 잘 되는지 로컬 서버에서 EC2의 DB를 조회해보기로 했다.

 

EC2의 디비에 poster 정보이다.

EC2의 DB의 poster 테이블 상황
local에서 EC2의 DB 정보가 나옴

로컬에서 posters의 정보를 요청했더니 EC2 디비에 있는 정보가 잘 나온다.

 

Docker 컨테이너에서 정상적으로 EC2의 DB에 접속해 쿼리를 조회하고 있다!

 

다시 컨테이너를 돌려보니 Docker를 통해 서버가 잘 돌아간다.

 

외부접속이 가능하다는게 너무 신기하다.

터미널에서 외부 MySQL DB에 접속하는 명령어도 있다!!

mysql -h 아이피 -P 포트 -u root -p

내 터미널에서 EC2 MySQL에 접속하는게 신기하다..

 

아래의 예외 모두 포트를 뚫고 DB 외부 접속을 허용하는 위의 방법으로 해결했다.

com.mysql.cj.jdbc.exceptions.CommunicationsException

java.net.SocketTimeoutException: Connect timed out

The driver has not received any packets from the server.

Comments