본문 바로가기
개발/Tools

[VS Code] Devcontainer 설정하기

by BENGGRI 2024. 3. 21.
반응형

참고자료

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

https://learn.microsoft.com/ko-kr/training/modules/use-docker-container-dev-env-vs-code/

 


 

Devcontainer 란?

Visual Studio Code Dev Containers Extension 을 사용하여 컨테이너 기반 개발 환경을 가져오고 만들고 구성합니다

Microsoft 가 제안한 개발 환경 컨테이너 입니다

장점

  • 개발환경을 빠르게 구축할 수 있습니다
  • 가상머신보다 적은 자원만을 필요로 합니다
  • 참여하는 개발자들이 동일한 개발 환경을 사용할 수 있습니다
  • 소스코드와 함께 개발 환경을 공유 할 수 있습니다
  • 적은 오버헤드로 다른 장비에서 사용할 수 있습니다
  • 개발/테스트/스테이징/운영 환경을 동일하게 구성할 수 있습니다
  • 호스트 운영체제를 손상시키지 않습니다

제 생각

  • 모든 개발자가 동일한 개발 환경을 사용하게되어 "제 자리에선 되는돼요?" 를 차단할 수 있습니다

VS Code 설치

https://code.visualstudio.com/

특별한 설정없이 바로 설치하세요

 

Docker Desktop 설치

https://www.docker.com/products/docker-desktop/

특별한 설정없이 바로 설치하세요

 

VS Code Extension 설치

VS Code 에서 Extension 을 설치하세요

Dev Containers 라고 검색하시면 Microsoft 에서 만든 Extension 이 나옵니다

 

Devcontainer 설정

Devcontainer 를 설정할 폴더를 하나 만드세요

저의 경우는 devcontainer_test 라는 폴더를 하나 만들었습니다

참고로 저는 Docker Desktop 라이센스 문제로 Windows 의 WSL 에 UBUNTU 를 설치하고 진행했습니다만 

Docker Desktop 라이센스 문제가 없다면 그냥 Windows 혹은 Mac 에 바로 폴더를 만들고 진행하시면 됩니다

 

그리고 Ctrl + Shift + P 를 눌러 Dev Containers: Add Dev Container Configuration Files... 를 검색한 후 엔터를 치세요

그러면 아래와 같이 개발 환경을 선택할 수 있는 창이 나옵니다

Spring boot 2.7.X 버전을 개발하는 Sample 이기 때문에  Java 를 검색합니다

상황에 따라 Java 혹은 Java & PostgreSQL 을 선택합니다

Java 언어만 선택하느냐 DB 도 같이 선택하느냐를 선택하느냐 차이입니다

Java 버전을 선택하는 창이 나옵니다

Spring boot 2.7.X 버전이기 때문에 JDK 11 인 11-bullseye  를 선택합니다

참고로 Spring boot 3.X 는 JDK 17 입니다

그런 다음 Maven 이냐 Gradle 이냐를 선택하는 창이 나오는데 선택하지 않고 OK 를 누릅니다

다음 나오는 창에서도 아무것도 선택하지 않고 OK 를 누릅니다

그러면 아래 그림과 같이 폴더가 생성됩니다

.github 폴더는 필요하지 않아서 그냥 삭제를 하셔도 됩니다

.devcontainer 하위에 있는 파일 내용을 수정해야합니다

하위 파일들에 대한 설명은 추후에 추가로 작성하겠습니다

 

.devcontainer/devcontainer.json 파일 내용입니다

{
  "name": "Devcontainer test",
  "dockerComposeFile": "docker-compose.yml",
  "service": "app",
  "workspaceFolder": "/workspaces/devcontainer_test",
  "features": {
    "ghcr.io/devcontainers-contrib/features/zsh-plugins:0": {
      "plugins": "",
      "omzPlugins": "https://github.com/zsh-users/zsh-autosuggestions",
      "username": "vscode"
    },
    "github-cli": "latest"
  },
  "forwardPorts": [25432],
  "postCreateCommand": "sh .devcontainer/startup.sh",
  "customizations": {
    "vscode": {
      "extensions": [
        "dbaeumer.vscode-eslint",
        "eamodio.gitlens",
        "esbenp.prettier-vscode",
        "octref.vetur",
        "Orta.vscode-jest",
        "ritwickdey.LiveServer",
        "bradlc.vscode-tailwindcss",
        "mechatroner.rainbow-csv",
        "vmware.vscode-boot-dev-pack",
        "vscjava.vscode-java-pack",
        "vscjava.vscode-lombok",
        "vscjava.vscode-gradle",
        "bierner.markdown-mermaid"
      ],
      "settings": {
        "files.eol": "\n",
        "editor.tabSize": 4,
        "editor.renderWhitespace": "all",
        "typescript.validate.enable": false,
        "eslint.alwaysShowStatus": true,
        "editor.formatOnSave": true,
        "eslint.workingDirectories": [{ "mode": "auto" }],
        "editor.codeActionsOnSave": {
          "source.fixAll.eslint": true
        },
        "spring-boot.ls.java.vmargs": [
          "-Xmx512M"
        ],
        "remote.localPortHost": "allInterfaces",
        "git.detectSubmodulesLimit": 70,
        "editor.tabCompletion": "on",
        "java.format.settings.profile": "GoogleStyle"
      }
    }
  },
  "remoteUser": "vscode"
}

.devcontainer/docker-compose.yml 파일 내용입니다

version: '3.8'
volumes:
  postgres-data:
services:
  app:
    container_name: devcontainer-test
    build: 
      context: .
      dockerfile: Dockerfile
    volumes:
      - ../..:/workspaces:cached
    command: sleep infinity
    network_mode: host
  db:
    container_name: postgresdb
    image: postgres:latest
    restart: unless-stopped
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
      POSTGRES_DB: postgres
    network_mode: host

.devcontainer/Dockerfile 파일 내용입니다

FROM mcr.microsoft.com/devcontainers/java:1-11-bullseye

# 시간 및 날짜 설정
ENV TZ Asia/Seoul

RUN apt-get update && \
    apt-get -y install wget curl && \
    echo "DONE"

.devcontainer 폴더 밑에 startup.sh 파일을 생성하고 아래 내용을 적습니다

sed -i 's/codespaces/agnoster/' ~/.zshrc && \
sed -i'' -r -e "/prompt_hg/a\  prompt_newline" ~/.oh-my-zsh/themes/agnoster.zsh-theme && \
echo $(pwd) && \
./gradlew clean && \ 
./gradlew build --refresh-dependencies && \
echo DONE

완료되면 아래 이미지와 같은 모습이 될 것 입니다

Ctrl + Shift + P 를 누르고

Dev containers: Rebuild Without Cache and Reopen in Container 를 검색한 후 엔터를 치세요

오른 쪽 아래 String Dev Container(Show log) 부분을 클릭하면 무슨 일이 벌어지는지 Log 를 확인하실 수 있습니다

 

완료가 되면 아래 이미지와 같은 모습이 됩니다

폴더 내 gradle 이 없으니 에러가 나는 것은 당연하니까 오른쪽 아래 TERMINAL 탭에서 엔터를 쳐주시구요

왼쪽 아이콘 Extensions 를 보시면 시계 모양이 생긴 것을 볼 수 있습니다

.devcontainer/devcontainer.json 파일 내용을 보시면 customizations > vscode > extensions 영역에 있는 extension 들을 설치하고 있는 것을 확인하실 수 있습니다

이제 Spring boot 를 설정할 차례입니다

Ctrl + Shift + P 를 누르시고 Spring Initializr: Create 를 검색하시면 아래와 같은 이미지가 표시됩니다

환경에 맞게 Gradle 혹은 Maven 을 선택합니다

저는 Gradle Project 로 했습니다

Spring boot 버전이 많이 올라서 2.7.X 버전이 보이지 않습니다

그래도 괜찮습니다

Google 에 많은 설정 파일 정보들이 있습니다

Java 할거라 Java 선택하시구요

Group Id 지정해주시구요

 

Artifact Id 지정해주시구요

 

Jar 혹은 War 선택해주세요

저는 Jar 를 선택했습니다

 

필요한 Dependency 들 선택하시고 엔터를 치세요

완료되면 아래 이미지와 같은 모습이 됩니다

생성된 Spring boot project 파일을 한단계 위로 이동시키세요

Move 눌러주시구요

아래 이미지와 같은 모습이 됩니다

빈폴더가 되어버린 devconatiner_test 는 삭제합니다

그리고 Ctrl + Shift + P 를 누르고 Dev Containers: Rebuild Container Without Cache 검색하고 엔터를 치세요

그러면 Devcontainer 가 다시 build 되어 개발환경이 완성됩니다

Google 에서 검색한 Spring boot 2.7.X 설정들을 옮겨주면 Spring boot 를 개발할 수 있습니다

반응형

댓글