Docker를 이용해서 배포를 할 경우 개발 할 때와는 다르게 신경써야할 부분이 있다.
Docker를 사용하는 경우 개발환경에서는 Bind Mounts를 사용하면 매우 편리하다.
개발환경에서는 Container와 런타임 환경을 캡슐화해야하지만, 코드 까지 캡슐화 할 필요는 없다. 그래서 Bind Mounts를 통해서 Container의 외부에서 코드의 변경 사항을 이미지의 리빌드 없이 즉시 Container에 적용 시킬 수 있다.
그러나, 배포를 하는 환경에서는 말이 다르다. Container를 만약 EC2와 같은 가상환경에서 구동한다고 생각해보자. 도커의 사상인 “주변환경에 아무런 영향을 받지 않고 독립적인 실행 환경을 구축한다” 명확히 따르려면 이미지를 Instance에 업로드하고 이를 통해서 컨테이너를 생성하여 배포를 하게 된다. 결국 이미지를 통해서 Container 내부에 코드가 완전히 실행될 수 있어야 하며 이는 어떠한 환경 변화에도 동일해야 한다.
그래서 배포의 경우 Bind Mounts가 아닌 COPY를 사용하여 Container 내부에 소스코드를 완전히 적재하고 실행환경 또한 적재하여 코드가 온전히 가동될 수 있도록 해야한다.
여기서 꿀팁! 지금까지 Bind Mounts를 사용할 경우 DockerFile에 Bind Mounts 경로를 생성하는 것이 아닌, -v 옵션을 통해 생성했다… 이는 똑같은 DockerFile을 통해 개발과 배포를 모두 가능케 하기 위해서 했다고 한다…이를 통해 유연성을 높이고 범용성을 높일 수 있다고 한다. 그리고 이렇게 해야 컨테이너가 어딜가던지 구동될 수 있다고 하니 꼭 기억하자.
이렇게 손쉽게 Docker가 설치 된 것을 볼 수 있다.
배포를 위해 EC2로 필요한 것을 옮기는 것은 두가지 방법이 있다.
당연하게 생각해보면 2번 방식이 더 편하다. 로컬에서 모든걸 준비하고 배포하는 Remote Server에서는 오직 배포에만 집중할 수 있도록 하는 방식이 맞다고 생각한다. Image를 Push하면 docker run 하나만으로 충분하니까. 1번의 경우에는 build 부터 불필요한 행동들이 필요하기 때문에 굳이……
그럼 어떻게 하냐!
우선 docker hub에 가서 Repo를 하나 만들어주자