
Code-server는 Visual Studio Code (VSCode)를 웹 브라우저에서 사용할 수 있게 해주는 서비스입니다. 즉, 로컬에 VSCode를 설치하지 않고도 인터넷만 있으면 어디서든, 어떤 기기에서든 VSCode 환경을 이용할 수 있는 강력한 도구입니다.
VSCode는 이미 개발자들 사이에서 가장 인기 있는 코드 편집기 중 하나로 자리 잡았습니다. 그러나 개발 환경을 구동하는 데 필요한 도구와 설정이 많고, 종종 개인 컴퓨터나 서버에 직접 설치해야 하다 보니, 여러 개발 환경을 관리하는 데 번거로움이 따를 수 있습니다. Code-server는 이러한 문제를 해결하며, 개발 환경을 클라우드나 원격 서버에 구축하여 언제 어디서나 접속할 수 있게 해줍니다.
언제 어디서나 접근 가능: Code-server는 클라우드 서버나 원격 머신에서 실행되므로, 인터넷만 있으면 어떤 디바이스에서든 개발 환경에 접근할 수 있습니다. 예를 들어, 집에서 작업하던 내용을 출근길의 노트북에서, 혹은 모바일 장치에서 이어서 작업할 수 있습니다.
개발 환경의 일관성: 로컬 머신에 VSCode를 설치하고 설정하는 대신, Code-server를 통해 하나의 서버에서 설정을 공유하며 일관된 개발 환경을 유지할 수 있습니다. 팀 프로젝트에서 여러 사람이 동일한 개발 환경을 사용하게 되어 환경 차이로 인한 문제를 최소화할 수 있습니다.
리소스 절약: 클라우드 기반으로 실행되기 때문에, 로컬 머신의 리소스를 절약할 수 있습니다. CPU나 메모리가 부족한 저사양의 로컬 컴퓨터에서도 서버의 성능을 활용하여 개발을 이어갈 수 있습니다.
서버 기반 확장성: Code-server는 서버에서 실행되므로 필요한 리소스를 유동적으로 확장할 수 있습니다. 클라우드 서버에서 고성능 개발 환경을 구축하거나, 대규모 프로젝트에서 발생하는 리소스 수요를 손쉽게 처리할 수 있습니다.
다양한 플랫폼에서 호환: Code-server는 여러 운영 체제에서 실행할 수 있습니다. 리눅스, macOS, Windows 등 다양한 플랫폼에서 손쉽게 설정하고 사용할 수 있기 때문에, 다양한 환경에서 개발 작업을 일관되게 이어갈 수 있습니다.
이처럼, Code-server는 클라우드 기반의 개발 환경을 구현하고, 언제 어디서든 작업을 이어갈 수 있도록 하며, 팀 협업과 리소스 관리 측면에서도 큰 장점을 제공합니다.
이번 실습에서는 Code-server를 설정하고, 이를 기반으로 Docker와 같은 강력한 도구들을 설치해, 더욱 효율적이고 확장성 있는 개발 환경을 만드는 방법을 배워보겠습니다.
docker pull linuxserver/code-server:4.90.3
설명:
docker pull: Docker Hub에서 이미지를 다운로드하는 명령어입니다.linuxserver/code-server:4.90.3: 다운로드하려는 Docker 이미지와 해당 태그입니다.linuxserver/code-server는 브라우저에서 Visual Studio Code를 실행할 수 있는 Docker 이미지입니다.4.90.3은 사용하려는 이미지의 버전입니다.이미지 다운로드 후, 로컬에서 사용할 수 있게 됩니다.
mkdir mk_code-server
설명:
mkdir mk_code-server: mk_code-server라는 디렉토리를 생성합니다. 이 디렉토리는 나중에 docker run 명령어로 생성한 컨테이너의 파일을 관리하는 데 사용될 수 있습니다.cd mk_code-server
설명:
cd mk_code-server: mk_code-server 디렉토리로 이동합니다. 이 디렉토리 내에서 이후 작업을 진행할 예정입니다.src 디렉토리 생성mkdir src
설명:
mkdir src: src라는 하위 디렉토리를 생성합니다. 이 디렉토리는 로컬 파일 시스템에서 코드 작업을 할 공간입니다./code 디렉토리와 연결하여, 로컬에서 작성한 코드를 컨테이너 내에서 사용하고 편집할 수 있습니다.code-server 컨테이너 실행docker run -d \
--name ide \
-p 8443:8443 \
-e PASSWORD=password \
-e DEFAULT_WORKSPACE=/code \
-e PUID=0 \
-e PGID=0 \
-e TZ="Asia/Seoul" \
-v ./src:/code \
-v /var/run/docker.sock:/var/run/docker.sock \
linuxserver/code-server:4.90.3
설명:
이 명령어는 Docker에서 code-server 컨테이너를 실행하는 명령어입니다. 각 부분을 분리하여 설명하겠습니다:
docker run -d: 컨테이너를 백그라운드에서 실행합니다. d는 "detached mode"를 의미하며, 실행 후 터미널로 돌아가게 합니다.
-name ide: 컨테이너에 ide라는 이름을 부여합니다. 이렇게 하면 나중에 컨테이너를 관리할 때 ide라는 이름으로 쉽게 참조할 수 있습니다.
p 8443:8443: 로컬 머신의 8443 포트를 컨테이너의 8443 포트에 연결합니다. code-server는 기본적으로 8443 포트를 사용하므로, 브라우저에서 localhost:8443으로 접근할 수 있게 됩니다.
e PASSWORD=password: 컨테이너 내에서 사용될 환경 변수 PASSWORD를 설정합니다. 이 비밀번호는 code-server 로그인 시 사용됩니다. password를 입력하면 로그인할 수 있습니다.
e DEFAULT_WORKSPACE=/code: 기본 작업 공간을 /code로 설정합니다. 이는 컨테이너 내에서 코드 파일을 저장하고 작업할 디렉토리입니다.
e PUID=0: 컨테이너 내 사용자 ID를 0으로 설정합니다. 이는 root 사용자로 설정하여, 시스템 파일에 대한 모든 권한을 부여하고, 로컬 파일 시스템과의 권한 충돌을 방지하기 위해 설정합니다.
e PGID=0: 컨테이너 내 그룹 ID를 0으로 설정합니다. 이는 root 그룹으로 설정하여, 컨테이너 내에서 발생할 수 있는 권한 문제를 피하고, 호스트 시스템과의 파일 권한 일치를 보장하기 위해 설정합니다.
e TZ="Asia/Seoul": 컨테이너 내 시간대(TZ)를 Asia/Seoul로 설정합니다. 이 설정을 통해 컨테이너 내에서 시간대가 올바르게 설정됩니다.
v ./src:/code: 로컬 디렉토리 ./src를 컨테이너 내의 /code 디렉토리에 마운트합니다. 이렇게 하면 로컬 src 디렉토리의 파일을 컨테이너 내에서 작업하고 편집할 수 있습니다.
v /var/run/docker.sock:/var/run/docker.sock: 로컬 시스템의 Docker 소켓을 컨테이너 내로 마운트합니다. 이를 통해 컨테이너 내에서 Docker 명령어를 실행할 수 있으며, 다른 컨테이너를 관리하거나 실행할 수 있게 됩니다.
linuxserver/code-server:4.90.3: 사용할 Docker 이미지의 이름과 태그입니다. 이 이미지는 code-server를 실행하는 데 사용됩니다.

1. root 사용자로 설정하기
root@6e2432c5b5ef:/code#라는 프롬프트는 현재 컨테이너 내에서 root 사용자로 작업하고 있다는 것을 의미합니다. 이는 컨테이너 내 사용자와 그룹을 root로 설정했기 때문입니다.
PUID=0: 컨테이너 내 사용자 ID를 root로 설정 (0은 root의 ID).PGID=0: 컨테이너 내 그룹 ID를 root로 설정 (0은 root 그룹).2. 왜 PUID=0, PGID=0을 설정할까?
1) 파일 권한 충돌 방지
src 디렉토리의 파일을 컨테이너에 마운트하면, 사용자 ID가 다르면 권한 문제가 생길 수 있습니다.PUID=0과 PGID=0으로 설정하면 모든 파일을 root 권한으로 다루기 때문에 권한 문제 없이 파일을 자유롭게 수정할 수 있습니다.2) 컨테이너 내에서 권한 부족 문제 방지
docker.sock을 마운트하고 Docker 명령어를 실행하거나 시스템 파일을 수정할 때 권한이 부족할 수 있습니다.root 사용자로 설정하면 모든 권한을 가진 관리자로 작업할 수 있어, 권한 부족으로 인한 오류 없이 작업을 진행할 수 있습니다.3. root 사용자로 설정할 때의 장점
root 권한을 사용하면, 컨테이너 내에서 모든 작업을 자유롭게 수행할 수 있습니다. 예를 들어, 시스템 파일 수정이나 Docker 명령어 실행에 제약이 없습니다.root 사용자로 실행되는 경우가 많기 때문에, 권한을 관리자 권한으로 설정하는 것이 간편하고 일관성 있게 동작합니다.4. 주의할 점: root 사용자 사용 시 보안 위험
root 사용자로 실행하면 시스템의 모든 권한을 가지므로, 악성 코드나 잘못된 명령어 실행으로 시스템에 큰 영향을 미칠 수 있습니다.root 권한을 사용할 수 있습니다.5. 결론: 왜 root 사용자로 설정하는가?
PUID=0과 PGID=0을 설정하면, 컨테이너 내에서 root 권한을 사용하여 파일 권한 문제를 방지하고, 모든 작업을 자유롭게 수행할 수 있게 됩니다. 특히, 로컬 시스템과 컨테이너 간의 파일 공유나 Docker 명령어 실행에서 발생할 수 있는 권한 충돌을 방지할 수 있습니다.
보안을 고려해야 하는 경우, 최소 권한을 설정하는 것이 이상적이지만, 개발 환경에서는 편의성을 위해 root 권한을 사용할 수 있습니다.
실행 후 출력된 컨테이너 ID (67e09658132af5680348b39b26fda992deab62b819c6ecc4b3f6704a3261c833)를 통해 컨테이너가 성공적으로 실행되었는지 확인할 수 있습니다. 이 ID는 나중에 컨테이너를 관리할 때 사용할 수 있습니다.
http://localhost:8443에 접속합니다.
PASSWORD=password로 설정한 비밀번호를 입력하여 로그인합니다.
/code 디렉토리가 기본 작업 공간으로 설정된 code-server의 웹 기반 IDE를 사용할 수 있습니다.
docker.desktop에서 ( Containers → ide Container → Bind mounts )에서 로컬 시스템에서 만든 디렉토리와 컨테이너 내 디렉토리가 올바르게 연결되었는지 확인해야 합니다.
1) /Users/sjcaptain/Desktop/cloudwave/Docker/0103/problems/mk_code-server/src (호스트) → /code (컨테이너)
/Users/sjcaptain/Desktop/cloudwave/Docker/0103/problems/mk_code-server/srccode-server 컨테이너와 공유할 파일들이 저장되는 곳입니다./codeDEFAULT_WORKSPACE=/code 환경 변수를 설정한 대로, code-server가 파일 작업을 할 디렉토리입니다. 이 디렉토리는 로컬의 src 디렉토리와 연결되어, 컨테이너 내에서 이 디렉토리의 파일을 편집하고 작업할 수 있습니다.이 의미는:
src 디렉토리에서 작업한 파일이 컨테이너 내 /code로 실시간 반영됩니다. 즉, 로컬에서 파일을 추가하거나 수정하면, 컨테이너 내 /code에서도 그 내용이 바로 반영됩니다. 마찬가지로, 컨테이너 내에서 /code 디렉토리에서 작업한 내용은 로컬 시스템의 src 디렉토리에도 바로 반영됩니다. 2) /var/run/docker.sock (호스트) → /var/run/docker.sock (컨테이너)
/var/run/docker.sock/var/run/docker.sockcode-server 내에서 Docker 명령어를 사용하거나 다른 컨테이너를 관리하는 작업이 가능해집니다.이 의미는:
docker.sock을 컨테이너에 마운트함으로써, 컨테이너 내에서도 Docker를 사용할 수 있게 됩니다. 예를 들어, code-server 내에서 Docker 명령어를 실행하여 다른 컨테이너를 만들거나 관리할 수 있습니다. 이는 code-server가 다른 Docker 컨테이너를 관리하거나 Docker 명령을 실행할 수 있게 해주는 매우 중요한 설정입니다.위 명령어들을 통해 linuxserver/code-server를 Docker 컨테이너로 실행하고, 로컬 시스템의 src 디렉토리를 컨테이너 내 /code와 연결하여 코드 편집 환경을 구축할 수 있습니다. 이 실습을 통해 브라우저에서 언제든지 Visual Studio Code를 실행하고, Docker 환경에서 작업할 수 있는 환경을 쉽게 만들 수 있습니다.