Intro
Docker와 Kubernetes가 어느 정도 안정화되면서, 개발 트렌드는 On-prem(혹은 VM)에서 Container로 변화했습니다.
따라서, 컨테이너에서 효율적으로 개발하는 것이 개발 생산성에 중요해졌으며, 이와 관련하여 VSCode에서 제공하는 플러그인, Devcontainer를 소개하고자 합니다.
이 글을 읽으면 좋은 사람
- 개발 생산성에 관심 있는 사람
- Docker를 사용하는 사람
컨테이너가 무엇인가요?
가상화(Virtualization) 기술이 발전함에 따라, 개발 트렌드가 VM(Virtual Machine)에서 Container로 변화했다고 합니다. 이 둘의 가장 큰 차이점은 무엇일까요?
VM과 Container 의 가장 큰 차이점은 GuestOS의 유무입니다.
VM의 경우, 구조적으로 하이퍼바이저(Hypervisor)가 존재하며, 각 가상 환경에는 GuestOS가 존재합니다.
문제는 각 가상 환경마다 GuestOS가 필요하다는 점입니다. VM환경에서 GuestOS의 할당은 상당히많은 리소스가 필요합니다.
따라서, N개의 가상 환경이 있다면 N개의 GuestOS에 대한 리소스를 할당해야 하는데, 리소스 측면에서 그리 달갑진않습니다.
시간이 지나면서 Docker Engine이 발전하여 시스템 안정성을 확보하게 되었고, Docker Engine이 하이퍼바이저의 역할을 맡게 되었습니다. 이때부터 Docker의 시대가 열렸습니다.
Docker Engine 위에서 실행되는 각 애플리케이션을 컨테이너라고 부릅니다.
- 컨테이너는 GuestOS를 사용하지 않고, 대신 HostOS의 리소스를 공유하여 사용하는 구조를 채택하였습니다.
- 컨테이너에서는 OS를 무조건 HostOS를 사용하기에, OS의 주체를 구분하는 용어를 쓰지않습니다.
- 이로 인해 VM보다 컨테이너를 채택하는 게,리소스 사용 측면에서 훨씬 이득입니다. 좀 더 자세한 내용은 https://jjongguet.tistory.com/79 를 참고하세요.
Devcontainer가 뭔가요?
Devcontainer는 Visual Studio Code의 확장 기능으로, 개발자가 컨테이너 내에서 효율적으로 작업할 수 있도록 지원합니다. 이 확장 기능은 개발 환경을 컨테이너로 격리함으로써, 일관된 개발 환경을 제공하고, 여러 종류의 도구와 응용 프로그램을 설치하는 복잡성을 줄여줍니다
Devcontainer 의 원리를 설명하면 다음과 같습니다.
기본적으로 Local 에서 Container(Docker) 를 띄우는것은 똑같습니다.
다만, 특정디렉토리의 볼륨을 Mount 하며, Container 내부에서 Vscode Server 를 띄워 FileSystem, Terminal, Debugger 등에 접근할 수 있게 합니다.
한줄로 요악하자면 ‘Container 내부에서 VSCode 워크스페이스를 띄우는 프로그램’ 입니다.
Devcontainer는 로컬 환경에서 Docker 컨테이너를 실행하는 것과 유사합니다.
- 특정 디렉토리의 볼륨을 마운트하고 컨테이너 내부에 VSCode 서버를 실행하여 FileSystem, Terminal, Debugger 등에 접근할 수 있게 하는 것이 특징입니다.
- '컨테이너 내부에서 VSCode 워크스페이스를 실행한다'로 볼 수 있습니다. 이는 개발 환경을 컨테이너화하여 일관성과 효율성을 제공합니다.
Devcontainer 를 왜 쓰는건가요? (vs Docker)
가장 중요한 점은 Container 로 환경을 띄움과 동시에, VScode 기능을 쓰며 개발할 수 있다는 점 입니다.
여기서는 python:3.9-bookworm 이미지를 예시로 들어서 설명해보겠습니다.
예시에서 사용할 Docker image 를 다운로드 받습니다.
docker pull python:3.9-bookworm
1. docker
docker 로 python:3.9 이미지를 띄우기위해 다음의 명령어를 사용합니다.
docker run -it --entrypoint /bin/bash python:3.9-bookworm
docker 에서 entrypoint
(시작지점) 을 /bin/bash
로 하여 bash쉘로 접근했습니다.
이후 다양한 명령어를 테스트해봅니다.
여기서 하나 주목해야할 점은 code .
명령어 를 찾지 못했다는 점입니다.
즉, 해당 Container 에 VSCode 가 존재하지않습니다.
Docker만 사용한다면 간단한 CLI를 사용할 수 있겠지만, 개발할때 매우 불편할것입니다.
2. Devcontainer
VSCode 에서 Devcontainer, Remote ssh 플러그인을 설치한 이후
Python 이미지 중, python:3.9-bookworm 이미지를 사용하도록 지정하였습니다.
.devcontainer/devcontainer.json
파일이 이 생겼습니다.
./devcontainer/devcontainer.json
은 Devcontainer 로 띄울때에 사용하는 정보(옵션)파일입니다.- 해당 파일을 수정하여 Devcontainer 에서 제공하는 다양한 기능을 추가, 제거, 관리할 수 있습니다.
이후 cmd+shift+p
를 눌러 명령창을 켜고, Open Folder in Container
로 해당 디렉토리를 열어줍니다.
Devcontainer 로 해당폴더가 열렸다면, 다음의 화면으로 바뀌게됩니다.
환경이 열리고 난 뒤, Docker로 파일을 띄웠을 때처럼 다양한 명령어를 테스트해봅니다.
여기서 주목해야 할 점은 code .
명령어가 작동했다는 점입니다.
(사진에선 이미 열려 있는 워크스페이스여서 VSCode 창이 열리진 않았으나, 에러가 발생하지 않았다는것에 주목해야합니다)
Devcontainer 는 Container image 에서 VSCode Server 를 설치하고, 설치된 VSCode Server 에서 Local 폴더(혹은 Workspace) 를 마운트해서 사용합니다.
즉, VScode 가 갖고있는 다양한 플러그인 또한 설치하여 사용가능합니다(VScode Server에 설치되는 플러그인 한정)
VSCode 에서 Devcontainer 로 환경을 띄운 상태에서, docker 프로세스 상태(docker ps
)를 확인해보면
이미지 하나가 띄워져 있는것을 확인할 수 있는데, 이는 VSCode 로 띄운 이미지라는것을 확인할 수 있습니다.
또한, VSCode 에서 사용하는 python:3.9-bookworm 이미지는 터미널에서 사용한 python:3.9-bookworm 이미지가 아님을 확인할 수 있습니다.
Devcontainer 를 사용해서 개발생산성 높일수 있는 경우 (주관적)
Devcontainer를 사용하여 개발생산성을 높일 수 있는 상황은 2가지였습니다.
상황1: Dockerfile에 내용을 추가하며 테스트하여 Dockerfile에 기능을 추가시킬 때
상황2: Dockerfile은 놔두고, 프로젝트의 소스코드를 변경시킬 때
위의 상황에서는 Devcontainer를 사용함으로써 얻는 이점이 많았으나
그 외 상황에서는 Devcontainer를 사용함으로써 얻는 이점이 상대적으로 적었습니다.
또한, Devcontainer를 직접 사용하면서 Docker-Devcontainer와 관련하여 몇 가지 버그가 있음을 알게 되었고
꽤나 애를 먹었던 경험이 있습니다.
결론
지금까지 Devcontainer를 소개했고, Devcontainer를 사용하면 Docker만 사용했을 때보다 개발생산성이 높아질 수 있다고 생각합니다.
그러나, Devcontainer는 아직까지 완벽한 프로그램(플러그인)은 아니라고 생각되며, 무조건적으로 도입하기에는 아직 무리가 있다라고 생각합니다. Devcontainer를 사용하기 위한 효율적인 상황인지 따져보고, 도입하는 것이 좋다고 생각합니다.
가장 좋은방법은, 회사에서 도깎노(도커파일 깎는 노인) 를 담당하시는 분들께서 다양한 실험을 하시고, Stable 한 이미지를 지정해서
사용하는게 제일 Best하다고 생각합니다.
Reference
- Docker: https://www.docker.com/resources/what-container/
- Devcontainer: https://code.visualstudio.com/docs/devcontainers/containers
- Devcontainer: https://code.visualstudio.com/remote/advancedcontainers/overview
'프로젝트의 고민들' 카테고리의 다른 글
글또 Middle (4) | 2024.10.06 |
---|---|
실패 후기: KEDA + HTTP add on (3) | 2024.01.24 |
소 잃고 외양간 고치기 (3) | 2023.12.15 |
글또 Opening (0) | 2023.12.09 |
티스토리 포스팅 할때 동글(Dong-gle) 사용해본 후기 (2) | 2023.11.13 |