하나의 애플리케이션을 여러명의 개발자가 참여한다고 할때, 이들은 각각의 PC에서 소스 코드를 다운로드하고 개발 및 테스트 후 다시 소스를 업로드 합니다.
그런데 PC에서 애플리케이션을 개발하고 실행하려면 Node.js나 JDK 같은 런타임 환경이 구성되어 있어야 하는데 이러한 언어들은 모두 버전이 있기 때문에 동일한 소프트웨어를 개발하는 개발자들 모두 각자 PC에 동일한 버전이 설치되어 있어야 하며,
실제로 애플리케이션을 실행하는 배포 서버에서도 이 버전을 개발할 때 사용했던 버전과 동일하게 유지해야 합니다.
그런데 만약 개발자 PC에서는 런타임 환경이나 언어의 버전을 업데이트해서 개발을 했는데
실제 배포 서버에는 업데이트를 하지 않았다면 라이브러리 호환성 등 여러 문제가 발생할 수도 있습니다.
즉, 흔히 말하는 “내 컴퓨터에서는 동작해” 와 같은 문제가 발생한다는 것 입니다.
이러한 문제를 방지하기 위해선 각각의 환경의 버전을 일치 시키는 등 많은 노력이 필요합니다..
이렇게 환경의 차이에서 발생하는 문제들을 근본적으로 해결하기 위해서는 결국 이런 환경을 완전히 일치시키는 것이 가장 좋은 방법일 것입니다.
그래서 컨테이너를 활용하면 다양한 PC에서 동일한 환경을 구성해서 이런 환경 불일치 문제를 해결할 수 있습니다.
IDE의 원격 개발 환경 기능을 통해서 각 컨테이너별로 격리된 개발환경을 구성할 수 있습니다.
즉, 개발자는 내 PC에 다른 것 다 필요없이 Docker만 설치해두고 Docker에서 개발환경으로 사용할 이미지를 다운받아서 실행한 다음 컨테이너 안에 있는 환경을 사용해서 개발을 수행할 수 있습니다.
개발이 종료되면 컨테이너만 종료하고 나오면 됩니다.
저는 주로 VSCode를 사용하고 인텔리제이는 잘 사용하지 않기 때문에 VSCode에서 Node.js 원격 개발환경만 구성해보겠습니다.
먼저 VSCode에 들어가서 Docker
와 Dev Containers
(마이크로소프트 배포버전) 익스텐션을 설치합니다.
DevContainer 확장팩은 프로젝트 안에 .devcontainer
라는 폴더를 활용합니다.
그래서 이를 통해 개발환경을 구성할 때, 폴더 안에 있는 devcontainer.json
파일과 Dockerfile
을 활용합니다.
devcontainer.json 파일은 vscode가 새로운 개발환경을 만들 때 사용하는 파일 입니다.
{
// VSCode 개발환경 이름
"name": "Rawon-Log",
// dockerfile 경로
"dockerFile": "Dockerfile",
// docker run 명령의 -p 옵션과 동일, 개발용 컨테이너 실행 시 3000번 포트를 오픈한다는 의미
"forwardPorts": [3000],
// 이 개발환경 안에서 VSCode를 실행할 때, 사용할 VSCode 확장팩이나 셋팅 목록
"customizations": {
"vscode": {
"settings": {},
"extensions": ["dbaeumer.vscode-eslint"],
},
},
// 컨테이너가 처음 생성된 후, 또는 재생성된 후에 실행할 명령어(Dockerfile의 CMD 지시어와 동일한 역할)
"postCreateCommand": "bun install",
// 컨테이너 안에서 사용할 사용자 계정
"remoteUser": "node",
}
이렇게 devcontainer.json 파일을 설정하고 같은 프로젝트를 진행하는 개발자들끼리 공유하면
컨테이너 안에서 일관적인 개발환경을 구성할 수가 있습니다.
Dockerfile 까지 작성한 후 Mac의 경우 CMD+Shift+P를 클릭해서 Open folder in container … 을 클릭하면 컨테이너 내부로 이동하게 되어 터미널 창에도 뭔가 변화가 생길 겁니다.
그러나 실제 기술적으로 소스코드가 실제로 컨테이너 안으로 들어가는 것은 아니고 VSCode에서 자체적으로 볼륨을 사용해서 마운트 시킵니다.
그래서 실제로 소스코드는 Host OS에 있지만 이 Host OS의 경로를 dev container가 마운트해서 사용하기 때문에 코드는 공유하지만 개발환경은 컨테이너라는 격리된 공간에서 구성되는 것 입니다.
이 링크를 통해 구매하시면 제가 수익을 받을 수 있어요. 🤗