컨테이너에서 Docker 또는 Kubernetes 사용
개발 컨테이너 내에서 애플리케이션을 빌드, 배포 및 디버깅할 수 있지만, 프로덕션과 유사한 컨테이너 세트에서 실행하여 테스트해야 할 수도 있습니다. 다행히 필요한 Docker 또는 Kubernetes CLI를 설치하고 로컬 Docker 소켓을 마운트하면 개발 컨테이너 내에서 앱의 컨테이너 이미지를 빌드하고 배포할 수 있습니다.
필요한 CLI가 준비되면 Container Tools 확장 또는 Kubernetes 확장을 사용하여 적절한 컨테이너 클러스터로 작업할 수도 있습니다.
특정 시나리오에 대한 추가 정보는 다음 예제 개발 컨테이너 템플릿을 참조하세요. 이를 프로젝트에 추가하려면 VS Code에서 작업하려는 **폴더를 열고** 명령 팔레트(F1)에서 **Dev Containers: Add Dev Container Configuration Files...** 명령을 실행합니다.
폴더의 내용을 기반으로 정렬된 필터링 가능한 목록에서 첫 번째 파티 및 커뮤니티 인덱스의 미리 정의된 컨테이너 구성을 선택하라는 메시지가 표시됩니다. VS Code UI에서 아래 섹션에 설명된 템플릿 중 하나를 선택할 수 있습니다.
개발 컨테이너에서 Docker 또는 Minikube 실행
-
Docker-in-Docker - 컨테이너 내에서 Docker(또는 Moby)를 실행하는 방법을 보여줍니다. 개발 컨테이너 내의 모든 폴더를 바인드 마운트하는 지원을 제공하지만 로컬 머신의 캐시를 재사용할 수 없습니다.
-
Kubernetes - Minikube-in-Docker - Docker-in-Docker와 유사한 이점 및 제한 사항으로 컨테이너 내에서 Minikube를 실행하는 방법을 보여줍니다.
컨테이너에서 기존 Docker 또는 Minikube 인스턴스에 액세스
-
Docker outside of Docker - 개발 컨테이너에서 Docker(또는 Moby) CLI를 사용하여 Docker Unix 소켓을 바인드 마운트하여 호스트의 Docker 데몬에 연결하는 방법을 보여줍니다. 오버헤드가 낮고 머신 캐시를 재사용할 수 있지만 바인드 마운트 제한 사항이 있습니다.
-
Docker outside of Docker Compose - 단일 Dockerfile 대신 Docker Compose를 사용하는 경우에 대한 Docker outside of Docker의 변형입니다.
-
Kubernetes - Local Configuration - Docker outside of Docker 모델을 사용하고 kubectl 및 Helm을 추가하여 로컬 Minikube 또는 Docker에서 제공하는 Kubernetes 클러스터에 액세스하는 방법을 보여줍니다.
또한 Docker-in-Docker, Docker outside of Docker 및 Kubernetes 설치 스크립트에 대한 문서도 있으며, 이는 위에 언급된 샘플에서 참조됩니다.
컨테이너 내부에서 Docker를 사용하여 호스트 볼륨 마운트
Docker-in-Docker 모델을 따를 때 개발 컨테이너 내부에서 Docker CLI를 사용하면 동일한 위치에서 실행되는 Docker 데몬과 상호 작용하게 됩니다. 이는 생성하는 "내부" 컨테이너에 모든 것을 "바인드" 마운트할 수 있음을 의미합니다.
예를 들어, 다음과 같이 "그냥 작동"합니다.
docker run -v /workspace/examplefile.txt:/incontainer/path debian
하지만 호스트 폴더를 이 내부 컨테이너에 바인드 마운트하려면 먼저 개발 컨테이너에 마운트해야 합니다.
Docker outside of Docker를 사용하면 기본적으로 작동하는 바인드 마운트 유형이 반전됩니다. 여기서는 컨테이너 내부의 Docker CLI가 대신 호스트의 Docker 데몬과 상호 작용합니다. 이는 컨테이너 내부에서 디렉토리를 마운트하는 방식에 영향을 미치는데, 컨테이너 내부의 경로는 호스트의 디렉토리와 일치하지 않을 수 있습니다.
위의 동일한 예제는 호스트 외부의 경로는 /workspace/...가 아니기 때문에 실패합니다. 또한 일부 폴더는 컨테이너에만 존재하므로 마운트할 수 없습니다. 이 경우 Docker-in-Docker 모델이 더 적합할 수 있습니다.
컨테이너에서 폴더를 여는 경우 호스트 디렉토리를 환경 변수로 컨테이너에 전달하여 작업 공간 폴더를 마운트할 수 있습니다. (하지만 볼륨을 사용하는 경우에는 작동하지 않습니다. 이 경우에는 Docker-in-Docker가 최선의 선택입니다.) 이렇게 하려면 devcontainer.json에 다음을 추가합니다.
"remoteEnv": {
// Pass in the host directory for Docker mount commands from inside the container
"HOST_PROJECT_PATH": "${localWorkspaceFolder}"
}
아래 예제는 makefile에서 가져온 것으로, 개발 컨테이너의 KUBECONFIG 파일을 새로 시작하는 Docker 컨테이너로 마운트합니다.
docker run -p 8089:8089 -p 9090:9090 -v $(shell echo ${KUBECONFIG} | sed s#/workspace#${HOST_PROJECT_PATH}#):/kubeconfig.json -e KUBECONFIG=/kubeconfig.json ${IMG} -f behaviours/run_submit_locust.py