최근, 서비스를 배포하면서 Docker를 제대로 사용해볼 수 있었습니다..
근데 도커로 배포하면서 느낀게 도커가 운영 환경에서 배포할 때 더 쉽게 할 수 있다는 장점외에
더 자세한 이유나 "뭔가 도커가 정말 좋구나.." 하는 점을 못 느껴서
왜 못 느꼈는지 다시 한번 돌아보기 위해 이 글을 포스팅하게 됐습니다.
(사실 혼자서 한 컴퓨터로 다 만든 서비스라 그럴 수 있습니다)
우선 도커의 장점으로는 크게 몇가지가 있습니다,
- 환경 일관성
- 빠른 배포 및 확장성
- 서비스 분리 및 관리

개발을 하다보면 한 번쯤 겪는 고질적인 문제가 있는데요, 바로
"분명 데스크탑에서는 잘 돌아갔는데 왜 노트북에선 안되는거지..?"
이런 상황을 겪어 보셨다면 도커를 통해 해결이 가능합니다,
개발자가 maxOS에서 개발을 하고, 테스트 팀은 Windows 환경에서 테스트를 하며
실제 서비스는 이번에 저가 배포한 것과 같이 Linux 기반의 서버에서 운영되면
이 세가지 다 잘 작동이 되어야 하며 각 환경에서 애플리케이션이 동일하게 동작되어야 합니다.

이때 위에 그림처럼 어느 환경에서든 동일한 Docker 이미지를 사용하게 되며
이를 통해 애플리케이션이 실행되게 됩니다, 즉 동일한 환경에서 애플리케이션이 실행되며
덕분에 "분명 데스크탑에서는 잘 돌아갔는데 왜 노트북에선 안되는거지..?" 같은 상황을
방지할 수 있습니다,
위 그림을 보면 도커 파일, 도커 이미지란게 있습니다
Dockerfile은 Docker 이미지를 빌드하기 위한 명령어들의 집합으로
Docker 이미지 생성 시 포함될 모든 내용과 설정이 명시되어 있습니다.
조금 더 예를 들어보자면 도커 파일은

이미지를 빌드하기 위한 '레시피' 라고 볼 수 있습니다,
Docker 데몬이 이 파일을 읽고 해당 지시에 따라 이미지를 생성하며
즉, Dockerfile은 이미지를 빌드하는 과정에서
필요한 설정과 파일을 정의하는 스크립트 입니다.

앞서 말했듯이 도커를 사용하게 되면 미리 만들어진 이미지를 바탕으로
몇 초 내에 새로운 인스턴스를 실행할 수 있습니다, 때문에 서비스를 운영하다가
문제가 발생할 경우 빠르게 대응할 수 있으며 이는 서비스의 가용성 및 사용자 경험을 개선하는데
도움을 줄 수 있습니다.
예를 들어보자면,

위 같은 상황이 발생할 경우 빠른 배포 및 확장성으로 신속하게 대처가 가능하며
평소에 개발할 때도 더 편하게 배포 및 확장이 가능해집니다.
웹 어플리케이션의 프론트는 React로, 백엔드는 Java Spring Boot로
구현이되어있는 상황에서 Docker를 사용하면 두 컴포넌트를 각각 별도의
컨테이너에서 실행이 가능합니다, 이를 통해 서로 다른 기술 스택과 설정이
충돌되는 상황을 방지하며 한 쪽에서 문제가 발생할 경우 다른쪽에 영향을 미치치 않습니다.

해당 설명은 인프런 강의 "따라하며 배우는 도커와 CI환경"의 내용을 참고해서 추가로 설명드리겠습니다,
위 그림처럼 nginx를 통하여 동일한 서버에서 여러개의 어플리케이션을 실행할 경우
Nginx를 리버스 프록시로 사용하여 각 요청을 적절한 Docker 컨테이너로 라우팅할 수 있으며
위 그림과 같이 /api 경로로 오는 요청은 백엔드 컨테이너로 이외에 요청은
프론트엔드 컨테이너로 보낼 수 있으며 이렇게 하면 여러 서비스를 효율적으로 관리하고
단일 도메인에서 여러 서비스를 제공할 수 있습니다.

또한 프론트와 백엔드 말고도 개발 환경과 운영 환경을 나누어
각 환경에 맞게 설정을 할 수 있습니다, 이는 로컬 시스템에 필요한 의존성을
설치하거나 설정할 필요 없이 개발할 수 있도록 해주며 환경을 격리한 상태에서
1번에 있는 환경 일관성 덕분에 개발 중에 오류나 문제를 미리 발견하고
수정할 수 있습니다.
이렇게 도커를 왜 사용해야하는지 알아보았는데요, 다음에는 실제로 서비스를 운영하면서
도커를 통해 문제를 해결하는 과정에 대하여 포스팅 하도록 하겠습니다, 이외에도 앞으로
프로젝트를 새롭게 시작하게 되면 계속 포스팅을 하게될 거 같은데 가능한 최대한
기술 정리글이 아닌 해당 기술을 통해 생긴 문제와 그 문제를 해결하는 과정에 대해 적고 싶습니다,
봐주셔서 감사합니다.