Docker를 사용할 때 왜 volume기능을 통해 소스코드를 연결하지 않는가?
Docker를 사용할 때 왜 volume기능을 통해 소스코드를 연결하지 않는가?

Docker를 사용할 때 왜 volume기능을 통해 소스코드를 연결하지 않는가?

때는 2021년 3월

저희 lab2ai는 screen을 통해 홈페이지를 운영하고 있었습니다.

사용법이 간단했으나 서버를 재부팅할 때마다 쉘스크립트 파일을 실행해줘야 했습니다.

그에 대해 검색을 하며 알아보자 대체로 Docker를 사용하면 된다는 식의 말들이 많았습니다.

그 당시 주변 친구들도 Docker가 좋다는 추천을 하기도 해서 한번 알아보기도 했습니다.

Docker에 대한 제대로 된 이해없이 시작을 하려니 아무리 자료가 많아도 이해하기 쉽지 않았습니다.

특히 소스코드를 통째로 COPY를 하고 빌드를 하는 방식이 비효율적이라고 생각했습니다.

AI 개발자분들을 통해 volume이라는 기능을 사용해 컨테이너 외부와 내부를 연결하는 방법을 먼저 배웠었는데

소스코드는 외부를 통해 volume으로 가져오면 되는데 왜 굳이 COPY를 할까?

그래서 초창기 COPY하는 방식이 아니라 volume을 통해 소스코드를 공유하는 방식으로 진행되었습니다.

그렇게 유지보수를 하던 어느날 Docker와 관련된 작업을 해야하는 상황이었습니다.

그래서 배포하기 전에 로컬PC에서 Docker를 실행시켜보고 문제가 없다는 것을 확인했습니다.

그렇게 그대로 배포를 하자 에러가 발생하게 되었던 것입니다.

그렇게 알아본 결과 로컬에서는 Docker 외부에서 따로 빌드를 한적이 있어 컨테이너 내에서 빌드에 실패했음에도

빌드파일을 가진 상태라서 잘 실행되었으나

서버에선 빌드파일이 없는 상태로 실행을 하려니 에러가 발생하게 된 것입니다.

그제서야 저는 왜 COPY를 통해 소스코드를 다 옮기게 되었는지 알게 되었습니다.

Docker의 장점 중의 하나는 독립적인 환경이라는 것입니다.

서버가 어떤 환경이든 상관없이 그저 Docker 명령어만 실행시켜주면 알아서 환경을 구축하는 것입니다.

만약 Docker를 사용할 때 volume을 사용한다면 그 환경은 독립적이지 않기 때문에

Docker의 장점을 제대로 활용하지 못한다는 문제점을 깨닫게 되었습니다.

(실제 volume이 주로 사용되는 곳은 대용량 데이터를 다룰 때와 같이 불가피한 일에만 사용되는 것으로 알고 있습니다.)

결론은 Docker에서 COPY 명령어를 통해 필요한 데이터를 최대한 옮긴 후 작업하려 하는 것은

Docker 컨테이너를 최대한 외부와 단절된 독립적인 환경을 만들어주는 작업이 필요하기 때문입니다.

만약 Docker를 도입하시려는 분이 있다면 이 점을 잘 고려해 개발하시면 분명 도움이 되실거라 생각합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다