개발자

개발용 Docker 컨테이너 내부에서 spring boot 외 다른 프로세스 돌리기

2024년 03월 07일조회 158

Gitlab과 유사하게 작동하는 Git을 사용한 CI 웹 어플리케이션을 만들고 있습니다. API 서버는 spring boot + JGit을 사용하여 구축하여 웹 서버를 띄우고, 개발자가 CI 서버에 접근하여 git clone 또는 git push 를 해야 하기 때문에 ssh 서버를 띄워서 백엔드에서 총 두개의 서버를 구동시켜야 하는 상황입니다. 두 서버는 서로의 정보를 필요로 하기 때문에 파일 시스템을 공유해야하구요. 설치형 어플리케이션이기 때문에 docker를 사용하여 플랫폼 독립적으로 설치를 할 수 있게 하려고 했어요. 근데 이 서버를 두개 띄우는 시나리오가, Production 환경에서는 spring boot 서버를 jar 파일로 만들어서 파일로 나오게 된다면, 따로 스크립트 파일을 작성해서 ssh 서버와 spring boot 서버를 한 컨테이너에서 실행시키게 할 수는 있을 것 같습니다. 하지만 Intellij를 사용하는 개발환경에서는 한 컨테이너로 하기가 좀 어렵더라구요 지금까지 시도해본것은 1. 한 컨테이너에서 ssh 서버를 띄운 후 Intellij 원격 개발 기능을 사용하여 컨테이너에 ssh로 붙는다. -> Intellij에서 코드 작성 속도가 너무 느립니다. 그리고 버그가 너무 많아서 못쓸 지경이예요. 2. Intellij Docker 플러그인을 사용한다. Intellij 에서 이미지를 지정해서 spring boot를 로컬에서 돌리는 것처럼 만들어주는것이 있더라구요. -> 이 방법으로는 한 컨테이너에 spring boot 하나만 돌릴 수 있는 것 같았습니다. (아니라면 알려주세요 ㅠㅠ) 2-1. 컨테이너를 ssh 서버용, spring boot 개발 서버용 두개를 작성하여 Intellij Docker 플러그인을 사용하여 spring boot 개발 서버를 돌리고 둘을 Volume으로 공유한다. -> 이 방법이 가장 정석인 것 같긴 한데, ssh 서버에서 생성한 파일과 spring boot 에서 생성한 파일 간에 접근 권한 이슈가 있을 것 같아서 이렇게 하는게 맞나 싶습니다. 이렇게 한다면 Production 환경과 다를 수 있으니 Production도 개발환경과 유사하게 두 컨테이너로 운용해야겠지요? 3. (아직 시도는 안해봤지만) 개발 환경 자체를 리눅스 데스크탑을 사용하여 개발한다. (or wsl을 사용한다) -> 가장 간단한 방법이겠지만 이것 또한 Docker를 사용하려는 Production 과 환경이 다를 수 있어서 고민이 됩니다. 제가 원하는건 딱 이거인 것 같아요. Intellij에서 실행버튼 하나를 딱 누르면 ssh 서버도 띄워지고, spring boot 개발서버도 띄워지고. 여기까지가 제 고민입니다.. 어떻게 개발 환경을 꾸리는게 좋을까요…? 아니면 제가 미처 생각하지 못한 방법이 있으면 말씀해주시면 감사드리겠습니다. 긴 글 읽어주셔서 감사합니다. Docker 라는걸 이제 막 사용하기 시작해서 모르는 것 투성입니다. 도움 부탁 드려요…!

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

박범수님의 프로필 사진

ssh 서버라고 말씀하신 서버의 용도가 무엇인지 궁금합니다. 그냥 리눅스 서버에 붙어서 명령어를 치려는 용도인가요? 만약 그렇다면 프로세스가 하나 더 있을 필요가 없이 docker exec 명령을 사용하면 됩니다.

이정윤님의 프로필 사진

이정윤

작성자

소프트웨어 개발자2024년 03월 08일

헐 exec을 생각 못했네요.. 시도해보겠습니다.

이정윤님의 프로필 사진

이정윤

작성자

소프트웨어 개발자2024년 03월 08일

ssh 서버는 깃랩과 같이 git 서버를 리모트로 등록하기 위해 필요합니다

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 03월 07일

당신이 여기서 설명한 시나리오를 고려할 때, docker-compose를 사용하는 것이 가장 좋은 선택일 수 있습니다. docker-compose를 사용하면 여러 Docker 컨테이너를 정의하고 실행할 수 있는 YAML 파일을 작성할 수 있습니다. spring boot 서버와 SSH 서버는 각각 자신만의 컨테이너에서 실행되며, 동일한 네트워크를 공유하도록 설정할 수 있습니다. 이렇게 하면 두 서비스가 필요한 데이터를 공유할 수 있습니다. 공유 볼륨을 사용하여 두 컨테이너간에 파일을 공유하는 것도 가능합니다. docker-compose.yml 파일에서 이를 설정함으로써, SSH 서버와 Spring Boot 서버가 모두 같은 디렉토리에 액세스하도록 할 수 있습니다. 다음은 docker-compose.yaml 파일 내용의 기본 예시입니다: ```yaml version: '3' services: spring_boot_app: build: context: ./path_to_your_spring_boot_app volumes: - shared_data:/path_to_shared_directory_in_spring_boot_container networks: - shared_network ssh_server: build: context: ./path_to_your_ssh_server volumes: - shared_data:/path_to_shared_directory_in_ssh_server_container networks: - shared_network volumes: shared_data: networks: shared_network: ``` 위의 설정에서 "shared_data"라는 볼륨은 두 컨테이너에서 파일을 공유하며, "shared_network"라는 네트워크를 통해 서로 통신합니다. 개발 환경에서는 개별 컨테이너를 실행하는 대신 docker-compose up 명령을 사용하여 두 서비스를 함께 시작할 수 있습니다. 프로덕션 환경도 마찬가지 방법으로 설정할 수 있으니, 이 방식은 당신의 프로덕션과 개발 환경간에 일관성을 유지하면서 복잡성을 줄여줄 것입니다. 물론 이 방법도 접근 권한 문제 같은 다른 문제를 야기할 수 있으므로, 이런 문제들을 해결하는 additioanal 설정이 필요할 수 있습니다. 그러나 이 기본 설정은 여러분이 원하는 동작에 가까운 결과를 얻게 해줄 것입니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!