Skip to content

Latest commit

 

History

History
164 lines (127 loc) · 7.69 KB

README.ko.md

File metadata and controls

164 lines (127 loc) · 7.69 KB

Visual Studio Code - DevContainer

English | 한국어

시작하기

Visual Studio Code Remote - Containers extension lets us use a Docker container as a full-featured development environment.

프로그램 개발에 필요한 여러 구성요소 사이의 의존성을 맞추고 업데이트하는 것은 매우 복잡한 일입니다. 잘 구성된 개발환경을 따로 저장해두고 필요할 때 해당 환경을 호출해 사용하면, 개발환경을 재현하거나 여러 개발자들 사이에 개발환경을 공유하기 매우 용이합니다.

이 문서에서는 DockerDocker Compose, Visual Studio Code를 이용하여 위와 같은 개발환경을 이미지로 저장하고, 필요에 따라 컨테이너로 호출하여 사용하는 방법에 대해 설명합니다.

Docker Desktop이 없는 Windows 환경에서는 'Remote - SSH'로 접속가능하게하는 CLI 스크립트도 제공합니다.


요구사항

Docker, Docker Compose, Visual Studio Code, Remote - Containers (VSCode 확장프로그램)가 컴퓨터에 설치되어 있어야 합니다. (Linux PC 기준) (Windows PC의 경우 Visual Studio Code가 설치되어 있어야하며, Docker와 Docker Compose가 설치된 Linux PC가 별도로 있어야 합니다)


구성요소

DevContainer 구동을 위해서는 대개 아래 세 가지 파일이 필요합니다.

Dockerfile

Dockerfile은 도커 이미지를 빌드하기 위한 파일입니다. 컨테이너 구동 시에 해당 스크립트로 만들어진 도커 이미지를 사용해서 컨테이너를 띄우게 됩니다. 이미 만들어져있는 도커 이미지를 사용만 할 때에는 해당 파일이 필요하지 않습니다.

본래 위 파일의 이름은 보통 'Dockerfile'이라고 작성하지만, 여기서는 개발용 이미지와 릴리즈용 이미지의 구분을 위해 아래와 같이 구분하여 사용합니다.

docker-compose.yml

docker-compose.yml파일은 Docker Compose 구동을 위한 설정파일입니다. .yml, .yaml 확장자를 가지는 YAML 파일은 설정 작성에 자주 사용되는 키-값 구조를 가지는 파일포맷으로, 여러 컨테이너를 동시에 띄우거나 컨테이너 구동에 필요한 Docker argument를 저장해두고 사용하기 위해 사용합니다.

devcontainer.json

devcontainer.json파일은 Visual Studio Code의 DevContainer 구동을 위한 설정파일입니다. 이 곳에서는 컨테이너 구동시 Dockerfile만 사용할 지, docker-compose를 사용할 지, 컨테이너 내부 workspace경로, 어떤 쉘을 사용할 지, 어떤 formatter나 extension을 기본으로 사용할 지 등을 결정할 수 있습니다.


DevContainer 실행하기 (Linux OS)

위 설정이 모두 완료되어 있으면, 다음 설명을 따라 컨테이너 내부에서 개발을 시작할 수 있습니다.

https://code.visualstudio.com/docs/remote/containers


DevContainer 실행하기 (Windows OS)

Windows OS를 이용하여 개발환경을 구성하는 데에 여러 제약이 있습니다. WSL과 Docker Desktop을 조합하여 Windows PC에서도 Linux PC와 거의 유사한 개발환경을 구축할 수 있었으나, 해당 방법을 통해 GPU 개발환경을 구성하기는 여전히 복잡합니다.

WSL과 Docker Desktop을 조합하여 Windows PC만을 이용해 개발을 진행할 수 있지만, 여러 한계점이나 디버깅의 난해함으로 인해 추천하지 않습니다. 여기서는 오직 Linux PC에서 컨테이너를 실행한 뒤, 이를 윈도우 PC를 통해 원격으로 접속(Remote - SSH)하여 개발하는 방법에 대해서만 다룹니다.

CLI (compose.sh)

Docker Compose 전체 명령어를 입력할 필요 없이 자주 쓰는 명령어를 쉽게 호출하기 위한 CLI 스크립트입니다. 이 스크립트는 개발의 편의성을 위해 단 하나의 컨테이너만을 만들고 사용/제거합니다.

  • 기본 사용법

    $ .devcontainer/compose.sh -b
      -b : build an image
      -r : run a container
      -l : print a log of the container
      -s : connect to shell(bash)
      -k : kill container (attach and kill)
      -d : down container (kill container and remove container, network and volumes)
      -p : push image to remote repository
      --service=? : specify service name of docker-compose to run
      --tag=? : tag image version
      --release : use image for release
      --no-cache : build an image without caching
    
      This script makes ONLY 1 CONTAINER
  • 컨테이너의 쉘에 접속하기 (이미지가 없을 시 자동으로 빌드, 컨테이너가 없을 시 자동으로 실행해 줌)

    $ .devcontainer/compose.sh -s
  • 다른 이름의 서비스 컨테이너에 접속하기

    $ .devcontainer/compose.sh -s --service=new_service
  • 릴리즈용 컨테이너에 접속하기

    $ .devcontainer/compose.sh -s --release
  • 태그를 붙여 원격 레포지토리에 푸시하기

    $ .devcontainer/compose.sh --tag=v1.0.1-a0 --service=release -p

Remote - SSH

Linux PC에 위 스크립트를 사용하여 컨테이너를 구동한 뒤 VSCode의 'Remote-SSH'를 통해 원격으로 접속합니다.

여기서 SSH(Secure Shell) 접속에 사용할 port는 docker-compose.yml에 포트를 지정해두어야 합니다.

docker-compose.yml

services:
  dev:
    build:
      network: host
      context: .
      dockerfile: dev.Dockerfile
    image: "${COMPOSE_IMAGE_NAME}:${USER}"
    hostname: ${COMPOSE_IMAGE_NAME}
    container_name: ${COMPOSE_IMAGE_NAME}_dev
      - '922:22'
    volumes:
      - .:/app/${COMPOSE_IMAGE_NAME}:rw
      - /var/run/docker.sock:/var/run/docker.sock  # for docker-in-docker

또한, SSH(Secure Shell) 접속에 사용할 사용자계정은 이미지 기본값을 사용하거나 이미지 빌드 시에 지정해두어야 합니다.

services:
  dev:
    build:
      network: host
      context: .
      dockerfile: dev.Dockerfile
      args:
        USER: ${USER}
        PUID: ${PUID}
        PGID: ${PGID}
        DOCKER_GID: ${DOCKER_GID}
        LC: ko_KR.UTF-8
        TZ: Asia/Seoul
        COMPOSE_IMAGE_NAME: ${COMPOSE_IMAGE_NAME}
    image: "${COMPOSE_IMAGE_NAME}:${USER}"
    hostname: ${COMPOSE_IMAGE_NAME}
    container_name: ${COMPOSE_IMAGE_NAME}_dev
    user: ${USER}
    environment:
      - USER=${USER}
      - PUID=${PUID}
      - PGID=${PGID}
      - DOCKER_GID=${DOCKER_GID}
      - COMPOSE_IMAGE_NAME=${COMPOSE_IMAGE_NAME}

위처럼 설정된 컨테이너를 실행 후에 'Remote - SSH'를 통해 해당 컨테이너에 접속하여 개발을 진행하면 됩니다. https://code.visualstudio.com/docs/remote/ssh