-
Ubuntu에서 Spring, MySQL, Redis Docker Compose로 배포하기프로젝트/WebRTC 화상통화 프로젝트 2022. 8. 4. 13:33
(1) Window에서 도커로 MySQL + SpringBoot 띄우기
(2) Ubuntu에서 Spring,MySQL, Redis Docker Compose로 배포하기
(3) Jenkins로 Gitlab CI/CD 구축하기(Spring + MySQL + JenKins + Redis + Nginx)
지난 시간에는 Spring과 MySQL을 도커로 띄워서 사용해보았습니다.
하지만 네트워크를 생성하고 이미지를 여러 옵션을 줘서 실행시키는 번거로운 절차들이 필요했습니다.
따라서 이 점을 보완하며 여기에 redis까지 적용하여 Docker Compose로 배포해보겠습니다.
https://junuuu.tistory.com/420?category=1014988
준비물 : Ubuntu 서버, MySQL redis와 연동할 Spring Application, Docker, git
1. docker -v로 도커가 설치되었는지 확인합니다.
2. git --version으로 git이 설치되었는지 확인합니다.
3. git clone 저장소의 주소를 통해 git 저장소의 코드를 가져옵니다.
저는 특정 branch를 가져오고 싶어서 다음과 같은 명령어를 사용했습니다
git clone -b {브랜치 이름} --single-branch {저장소 url}
4. Spring Application properties 설정을 변경합니다.
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://mysql:3306/zipzong?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul spring.datasource.username=root spring.datasource.password=root spring.jpa.show-sql=true spring.jpa.generate-ddl=true spring.jpa.hibernate.ddl-auto=create spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect spring.profiles.include=oauth logging.level.root = info spring.redis.host = redis spring.redis.port = 6379
mysql:3306에서 mysql은 MySQL 컨테이너의 이름입니다.
spring.redis.host = redis에서 redis는 Redis의 컨테이너 이름입니다.
시큐리티 설정쪽에서도 localhost:8080 부분을 SpringBoot의 컨테이너 이름인 springbootapp으로 설정했습니다.
docker compose로 묶게되면 같은 네트워크 대역으로 묶여서 생성됩니다.
5. Spring Application를 build하여 .jar 파일을 생성합니다
테스트 없이 빌드를 진행하기 위해 다음 명령어를 입력합니다.
./gradlew build -x test
권한이 없다는 메시지가 나옵니다. 다음 명령어를 입력하여 권한을 줍니다.
chmod +x ./gradlew
6. vi docker-compse.yml으로 도커 컴포즈 파일을 생성합니다.
version: "3" services: mysql: image: mysql container_name: mysql environment: MYSQL_DATABASE: zipzong MYSQL_ROOT_PASSWORD: root MYSQL_USER: username MYSQL_PASSWORD : dbpassword ports: - 3306:3306 redis: container_name: redis image: redis ports: - 6379:6379 springbootapp: build: . container_name: springbootapp ports: - 8080:8080 depends_on: - mydb - redis
7. docker-compose up --build -d 명령어로 컨테이너를 백그라운드로 실행합니다.
8. docker ps -a 명령어로 컨테이너들이 잘 띄워졌는지 확인합니다.
컨테이너의 이름이 springbootapp, redis, mysql이 아니라 앞뒤로 숫자들과 backend가 붙어있습니다.
https://stackoverflow.com/questions/33045358/docker-compose-image-named-prefix-s-1-instead-of-s
stackoverflow에 이미 저와 같은 에러를 해결한 글이 있습니다.
아래와 같이 container_name을 지정해야 합니다.
container_name: 사용자 지정 컨테이너 이름
9. 에러가 난다면 docker logs [컨테이너 이름]으로 어떤 에러가 나는지 확인해야 합니다.
저는 mysql connection이 잘 수행되지 않았습니다.
뭔가 컨테이너의 이름이 바뀐 것이 문제 같습니다
또한 모든 설정이 잘 된 것 같은데 mysql connection error가 계속 발생하는 경우 application.properties 설정을 변경한 후 build를 다시 수행해야 합니다.
이때 기존에 생성된 .jar을 삭제해주고 다시 build 하면 해결할 수 있습니다.
10. 모든 컨테이너가 잘 동작되고 있으면 hostname -I 명령어를 통해 내 IP 주소를 확인합니다.
이때 영어 i를 대문자로 입력해야 합니다.
이후에 IP:8080으로 접속하면 스프링 화면을 만날 수 있습니다.
출처
https://thalals.tistory.com/343
'프로젝트 > WebRTC 화상통화 프로젝트' 카테고리의 다른 글
Jenkins로 Gitlab CI/CD 구축하기(Spring + MySQL + JenKins + Redis + Nginx) (0) 2022.08.06 letsencrypt 인증서 발급하고 OpenVidu에 적용하기 (0) 2022.08.05 AOP 적용하기 (+원리 CGlib vs Dynamic Proxy) (0) 2022.08.04 스프링 시큐리티가 OAuth 로그인을 처리하는 방법 (0) 2022.08.03 Spring JPA에 Index 적용하기 (0) 2022.08.02