Hybrid 플랫폼에서 도커기반 개발환경 구성(VS Code)

leesj·2021년 11월 8일
0

Infra

목록 보기
4/9
  • 클라우드와 온프레미스 인프라에서 사용자별 도커기반 개발환경 구성을 통해 현대적 방식의 개발환경을 구현하고 개발 사이클 전체에서 이슈관리와 형상관리를 통합적으로 수행하도록 구현을 진행
  • 필요한 사항: Jira, GitLab, Docker registry, vs code, Public cloud platform, docker
  • 참고자료
  • https://code.visualstudio.com/docs/remote/containers

Containers extension 이 제공하는 두가지 운영모델

Quick start
1) Try a development container
시작하는 가장 쉬운 방법은 샘플 개발 컨테이너 중 하나를 시도하는 것

2) Open an existing folder in a container
파일 시스템의 기존 소스 코드를 사용하여 정규 개발 환경으로 사용할 기존 프로젝트의 개발 컨테이너를 설정하는 방법

3) Open a Git repository or GitHub PR in an isolated container volume
컨테이너에서 로컬로 복제된 리포지토리를 열 수 있지만 PR 검토를 위해 리포지토리의 격리된 복사본으로 작업하거나 작업에 영향을 주지 않고 다른 브랜치를 조사할 수 있습니다.

창이 다시 로드되면서 컨테이너가 아직 존재하지 않기 때문에 vs code 는 컨테이너를 생성하고 샘플리포지토리를 격리된 컨테이너 볼륨에 복제한다.

1.VS code remote container 확장 사용

사전준비

원격개발 확장 플러그인 설치

Key base Remote SSH 연결 설정을 진행함

F1 실행 > 설정 파일을 오픈

Docker Desktop install

사전 준비 과정으로 도커 Desktop 이 설치 되어있어야 한다.
도커가 실행중인 상태여야 원격 개발 기능을 사용할 수 있으므로 도커 실행.

확장기능 설치/실행(Optional)

도커 확장기능 설치하고 도커 메뉴 선택하면 로컬의 컨테이너와 이미지가 노출됨

1) 로컬에서 Sample project 테스트

Get the sample

Local Docker 를 사용한 컨테이너 개발 환경 설정 테스트
Remote-Containers: Try a Development Container Sample 메뉴를 통해 github 에서 언어별 sample 프로젝트를 체크아웃해 컨테이너를 테스트 한다.

Build, Debugging

체크아웃 이후 자동으로 빌드 및 이미지 생성, 컨테이너 실행이 진행되며 완료 후 Dev Containers 에 Container 가 생성되는 것을 확인 할 수 있다.

도커 컨테이너 내부 작업 진행가능하도록 터미널이 생성됨

컨테이너가 빌드되면 VS Code 가 자동으로 컨테이너에 연결하고 로컬 파일 시스템의 프로젝트 폴더를 컨테이너에 매핑한다.

Run the application - F5
컨테이너 내부에서 어플리케이션 실행은 F5 버튼으로 진행
localhost 에 Sample project 에 매핑된 포트로 진입하면 실행된 웹 페이지를 볼 수 있음

작동방식

  • 체크아웃 된 소스코드는 로컬 머신이 아닌 docker container 내에 위치하게 됨
  • Remote - Containers 확장을 사용하면 특정 기술 스택 또는 종속성이 이미 설정된 개발 컨테이너를 가져와 프로젝트를 열고, 로컬 컴퓨터에 아무것도 다운로드하지 않고도 코드가 제대로 작동하는지 확인할 수 있습니다. Remote - Containers는 실행 중인 컨테이너에 Visual Studio Code를 연결하는 방식으로 작동합니다. 작업 영역 파일은 로컬 파일 시스템에서 탑재되거나 컨테이너에 복사 또는 복제

컨테이너 빌드 완료 상태 icon

컨테이너 빌드 후 컨테이너 실행 상태 icon

컨테이너 실행 후 디버깅 상태 icon

devcontainer.json 파일 생성

각 설정 항목의 세부 컬럼은 아래 공식 링크에서 확인

2) 사용자 Git repo를 활용한 테스트(Full time 개발환경)

방1) Quick start: Open a Git repository or GitHub PR in an isolated container volume

깃 레포지토리에서 코드를 클론하고 클론된 코드는 실제 컨테이너 내부에 위치하게 됨

F1 > Remote-Containers: Clone Repository in Container Volume...

레포지토리 입력

빌드가 정상적으로 완료되면 이미지가와 컨테이너가 생성되고 실행됨

예제

사용자 프로젝트

동작 원리

리모트 호스트에 도커 볼륨이 생성되고

실행된 컨테이너 내부에 vscode-server 와 workspace 가 위치하게 됨

실행된 컨테이너 세부정보

리모트 메뉴를 통해 원격에 생성된 컨테이너의 어플리케이션을 디버깅

F5 버튼 클릭~!

Local 에서 3000 포트로 접속시 리모트에서 빌드 및 실행되는 컨테이너의 결과물을 확인 할 수 있음

컨테이너 변경사항 발생시 아래와 같이 rebuild 를 수행하여 변경사항 적용

방2) F1 > Open an existing folder in a container

Step1) Remote-Containers: Open Folder in Container...

컨테이너 내에서 폴더 열기를 선택

기존에 clone 이 완료된 코드 directory 를 선택

F1 > Remote-Containers: Add Development Container Configuration Files...

기존 프로젝트에 개발 컨테이너 추가 - devcontainer.json 파일을 통해 컨테이너 세부 정보를 설정함

컨테이너 구성 파일 추가를 선택하거나

오픈된 프로젝트의 도커파일을 기반으로 설정파일을 생성

개발에 활용 가능한 컨테이너가 다양하게 노출됨


해당하는 부분을 모두 선택 후 확인

확인 이후 아래와 같이 .devcontainer 하부에 devcontainer.json 과 Dockerfile 이 생성됨

Docekrfile 과 devcontainer.json 파일을 프로젝트에 맞게 수정 후 저장

명령 팔레트를 통해 아래 reopen in container 를 입력하여 메뉴 선택

새로운 vs_code 편집기가 오픈되며 빌드 작업을 자동으로 수행함

Trouble shooting

10114 ms] Command failed: docker run --sig-proxy=false -a STDOUT -a STDERR --mount source=/Users/leesj/Documents/vs_code/mlops_poc/myRepo,target=/workspaces,type=bind,consistency=delegated --mount type=volume,src=vscode,dst=/vscode -l vsch.local.folder=/Users/leesj/Documents/vs_code/mlops_poc -l vsch.quality=stable -l vsch.remote.devPort=0 --entrypoint /bin/sh vsc-mlops_poc-8bbbc3a2a756c5fc1f18dfee2d141797 -c echo Container started
trap "exit 0" 15

while sleep 1 & wait $!; do :; done




[6087 ms] Start: Run: docker run --sig-proxy=false -a STDOUT -a STDERR --mount source=/Users/leesj/Documents/vs_code/mlops_poc,target=/workspaces,type=bind,consistency=delegated --mount type=volume,src=vscode,dst=/vscode -l vsch.local.folder=/Users/leesj/Documents/vs_code/mlops_poc -l vsch.quality=stable -l vsch.remote.devPort=0 --entrypoint /bin/sh vsc-mlops_poc-8bbbc3a2a756c5fc1f18dfee2d141797 -c echo Container started

빌드 작업 완료 후 터미널을 통해 파이썬 버전을 확인해 보면 아래와 같이 설정단계에서 지정한 버전이 노출됨

vscode ➜ /workspaces/mlops_poc (master ✗) $ python --version
Python 3.10.0

아래와같이 실행 명령을 수행하고 브라우저를 통해 샘플 페이지에 접근

vscode ➜ /workspaces/mlops_poc/app (master ✗) $ python src/app.py 
 * Serving Flask app 'app' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on all addresses.
   WARNING: This is a development server. Do not use it in a production deployment.
 * Running on http://172.17.0.2:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 873-964-937
127.0.0.1 - - [08/Nov/2021 07:15:47] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [08/Nov/2021 07:15:47] "GET /favicon.ico HTTP/1.1" 404 -

종속성 설치 자동화 설정

devcontainer.json 의 주석부분을 해제

	// "postCreateCommand": "pip3 install --user -r requirements.txt",

3) 기존 컨테이너에 접근

host 에서 머신러닝 개발을 위한 docker container 실행

  • https://www.tensorflow.org/install/docker
  • 상기 링크에서 CPU 만 포함하는 이미지와 GPU 를 포함하는 이미지를 통해 GCP(CPU only) 와 On-premise(With GPU) 용을 구분하여 컨테이너 실행, 개발환경 설정에 사용
  • 컨테이너를 통해 개발환경을 설정하므로 호스트 머신에 있는 CUDA 를 사용하지 않고 컨테이너 내부의 CUDA 버전을 설정

GPU 가 포함된 Tensorflow image pull

이미지를 실행

bash 실행

백그라운드 실행

remote host 정보를 설정에 추가

아래 접속하고자 하는 도커가 실행되고 있는 호스트를 추가

"docker.host": "ssh://[계정]@[host IP]"

vs_code 에서 remote docker 접근

앞에서 실행시킨 도커 컨테이너가 노출됨. 클릭시 새로운 vs_code 편집창이 오픈됨

호스트에 접근되면 아래와 같이 컨테이너 목록이 노출됨-1

실행중인 컨테이너 정보 노출-2

기존 컨테이너중 하나를 선택하여 진입하기 시도하면 새로운 vs_code 편집창이 열림

정상적으로 컨테이너에 접근하여 컨테이너가 실행되면 아래와 같은 로그가 터미널에 출력

원격에서 실행중인 도커 내에서 구현 할 수 있는 준비가 완료됨

파일 또는 폴더 열기를 선택하여 remote 작업할 remote 디렉터리를 오픈

컨테이너 내의 리모트 디렉터리가 오픈됨

디렉터리에서 테스트 파일을 생성하여 디버깅을 확인

4) GCP 대상 Container 개발환경 설정

SSH host 연결

Docker install

생성된 GCP VM에 Docker install

Tensorflow Container 실행

GPU 를 사용하지 않는 Tensorflow 도커 이미지를 컨테이너화

컨테이너에 접속

Tensorflow 컨테이너 내부로 접근된 새로운 창이 확인됨

원하는 디렉터리에 접근하여 작업 수행

깃기반 프로젝트 실행

리모트 Container 접근하여 Git 기반 컨테이너 배포 선택

새로운 창이 오픈되고 컨테이너 빌드를 시작함
내부망과 VPN 연결되어있지 않은 인스턴스에서는 사내 깃랩 접근 할 수 없어 clone 작업이 진행되지 않음

깃 레포지토리 기반 컨테이너 배포

설정파일을 추가 할 방식을 선택

정상적으로 컨테이너가 배포되면 아래와 같이 vs code 에서 확인 가능

도커 레지스트리 등록

깃랩 호스팅 사설 레지스트리 등록 불가능한듯..

0개의 댓글