말 그대로 로컬(태스트서버가 아닌) 자바 개발환경에 도커를 도입하면 어떤 이득이 있을까요?
사실 서버에서 직접 컴파일하는 개발환경 혹은 서버 의존성이 높은 리눅스관련 개발환경이 아닌 이상이야
구지 로컬개발환경에서 도커를 사용해야 하는 이유가 있나 싶습니다.
자바는 말그대로 JVM에 중간에서 처리해줘서 자바 버전만 맞추고
Maven이나 Gradle를 통해 러이브러리를 관리하면 문제 없을거 같은데
(당연히 서버는 )
로컬개발머신에서 자바+도커 개발환경을 갖추신분들의 의견은 어떠신가요?
참고로 저는 맥북에서 intellij + 스프링 으로 개발중입니다.
다른 개발자가 해당 리소스를 점유하면 기다리시나요?
개발자가 바뀔 때마다 개발환경은 어떻게 세팅해주시나요? 일일이 말로 설명하나요?
빌드 환경에 격리가 필요한가요?
도커 이미지로 빌드하여 SaaS 서비스를 하고 싶으신가요?
위 문제에 대한 답은 도커입니다.
(여러 사람들의 개발 환경을 통일하는데 유용하긴 합니다.)
서버 모듈을 Java 로 개발할 때 docker 를 쓸 이유는 없다고 생각합니다.
JVM은 특히 off heap 관리가 쉽지 않아서 host memory 를 쓰는게 낫지
docker container 에 넣어두면 container limt 을 꽤나 넉넉히 줘야 합니다.
- 도커를 사용하면 개발자 각자의 로컬 환경에서 발생할 수 있는 차이점을 제거할 수 있습니다. 이로 인해 "내 컴퓨터에서는 잘 돌아가는데..."라는 문제를 피할 수 있습니다.
다양한 환경 테스트
- 다양한 자바 버전이나 다른 종속성을 가진 환경에서의 테스트가 용이합니다. 예를 들어, Java 8과 Java 11에서 동시에 테스트를 해야 하는 경우, 도커 컨테이너를 사용하면 간단히 해결할 수 있습니다.
서비스 의존성
- 로컬에서 여러 서비스나 데이터베이스와의 통신이 필요한 경우, 도커 Compose를 사용하여 여러 컨테이너를 함께 실행할 수 있습니다. 이를 통해 실제 운영 환경과 유사한 환경을 로컬에서 구축할 수 있습니다.
빠른 환경 구축
- 새로운 개발자가 팀에 합류하거나 환경을 새로 세팅해야 할 때, 도커 이미지와 도커 컴포즈 파일만 있으면 빠르게 환경을 구축할 수 있습니다.
포트폴리오 및 배포 용이성
- 개발한 애플리케이션을 도커 이미지로 만들어 관리하면, 이를 통해 다른 사람들에게 쉽게 보여주거나 배포할 수 있습니다.
DB 서버는 docker를 이용하여 실행하면, 버전을 맞춰주기도, 또 여러가지 DB를 띄워 사용하기 좋습니다.
다만 JDK의 경우는 굳이 도커를 사용하지 않아도 괜찮다 생각을 합니다.
다양한 버전의 JDK를 실행하는 것은 intellij에서 JDK를 선택하는 것으로 충분한 것 같아요.
맥북에서 docker를 이용할 때에는 가상머신을 생성하여 그 가상머신 위에서 docker를 구동하게 되는데,
DB 서버나 웹 서버 같은 프로세스가 이미 docker 위에서 구동되고 있는데, 거기에 JDK를 굳이 더 얹고싶지 않더라구요.
또 위에서 많은 분들이 배포 용이성을 말씀해주셨는데...
ARM 기반 맥북이라면, 그리고 서버에서는 x86/AMD64 계열을 사용한다면... 도커 이미지 빌드를 아키텍처에 따라 여러벌을 해주어야 합니다.
저는 이 부분이 좀 더 번거롭게 느껴지더라구요.
그리고 스프링 기반이라면 JAR/WAR만 배포하면 되니, 저는 서버에서 JAR를 실행하는 환경을 docker로 구성해놓았습니다.
결론을 다시 한번 말씀드리면...
JDK는 로컬에서 intellij와 함께 관리하는 것이 사용하기 편하고
DB 서버 / 웹서버 등의 인프라는 docker로 관리하는 것이 편합니다.
+) JDK를 도커로 구동하게 될 경우에, intellij 구버전에서는 디버깅이 쉽지 않더라구요.