Docker 알랑말랑에서 알랑에 가까움

설현아·2025년 5월 10일

내가 이해한 도커
특정 실행 환경을 본떠서 이미지로 두는 거고, 협업하는 사람들과 혹은 내 다른 컴퓨터에서도 동일한 실행 환경을 가지고 싶을 떄 이 이미지를 받아와서 컨테이너로 실행하는거야.
컨테이너는 내 컴퓨터 OS 위에서 돌아가고, 내 컴퓨터 자원을 공유해. 그래서 훨씬 가볍고 빠르게 동작할 수 있지.

GPT가 첨언해준 도커
1. 도커 이미지 = 실행 환경을 본뜬 ‘설계도’
• 도커 이미지는 특정 애플리케이션이 실행되기 위해 필요한 OS, 라이브러리, 도구 등을 모두 포함한 불변의 템플릿이에요.
• 예: ubuntu + python3 + flask + 기타 설정이 포함된 이미지

  1. 도커 컨테이너 = 이미지로부터 만들어진 실행 인스턴스
    • 이미지를 실제로 실행하면 컨테이너가 생성돼요.
    • 컨테이너는 이미지에 정의된 환경을 그대로 따르며, 독립된 실행 공간을 가지죠.
    • 마치 “이미지 = 클래스”, “컨테이너 = 인스턴스”처럼 생각하면 좋아요.

  2. 컨테이너는 호스트(내 PC) 자원을 공유함
    • 완전한 VM처럼 별도의 OS를 설치하지 않아요.
    • 호스트 OS 커널을 공유해서 훨씬 가볍고 빠르게 실행돼요.
    • 파일 시스템, CPU, 메모리 등을 일정 부분 분리해서 쓰지만, 결국은 호스트 머신 위에서 돌아감.

  3. 협업 및 배포에 용이
    • 이미지 하나로 팀원들 모두가 동일한 실행 환경을 보장받을 수 있어요.
    • 운영체제가 달라도 동일하게 동작하는 게 가장 큰 장점이죠.


이번 pintos 과제에서는 Ubuntu 18.04 os환경에서 수행해야 한다.
어느 집단에 속해도 여전히 레거시를 사용하는 경우가 생기겠지? 그럴 때 이번에 공부한 내용이 유용하게 작용하기 바란다.

여튼,
여태까지는 정글에서 dockerfile을 다 세팅해주셔서(+ 우리반 똑똑이가 무언가 또 업그레이드도 해줌) vs code의 extention dev container를 사용하면 진짜 딸-깍이었다.
dockerfile은 아래와 같이 ubuntu 20.04 환경이었다.

FROM --platform=linux/amd64 ubuntu:20.04

ENV TZ=Asia/Seoul LANG=ko_KR.UTF-8 LANGUAGE=ko_KR.UTF-8

RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
    locales tzdata build-essential gdb vim curl git wget \
    cmake make gcc g++ \
    && locale-gen ko_KR.UTF-8 && update-locale LANG=ko_KR.UTF-8

RUN useradd -m -s /bin/bash jungle && usermod -aG sudo jungle

USER jungle
WORKDIR /home/jungle

그런데 문제는 이번 pintos는 ubuntu 18.04 환경이라는 점이다. 정글에서 세팅해주신 dockerfile 또한 이러헀다.

# Base image: Ubuntu x86_64
FROM --platform=linux/amd64 ubuntu:18.04

ENV TZ=Asia/Seoul LANG=ko_KR.UTF-8 LANGUAGE=ko_KR.UTF-8

# Install dependencies
RUN export DEBIAN_FRONTEND=noninteractive && \
    apt-get update \
    # && echo "tzdata tzdata/Areas select Asia" | debconf-set-selections \
    # && echo "tzdata tzdata/Zones/Asia select Seoul" | debconf-set-selections \
    && apt-get install -y \
    locales tzdata \
    build-essential \
    gcc \
    gdb \
    vim \
    git \
    sudo \
    qemu-system-x86 \
    python3 \
    && locale-gen ko_KR.UTF-8 && update-locale LANG=ko_KR.UTF-8 
# && apt-get clean \
# && rm -rf /var/lib/apt/lists/*

RUN useradd -m -s /bin/bash jungle && usermod -aG sudo jungle
RUN echo "jungle ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/jungle

USER jungle
WORKDIR /home/jungle

RUN echo "source /workspaces/pintos_lab_docker/pintos-kaist/activate" >> /home/jungle/.bashrc

# Clone the repository
# RUN git clone https://github.com/casys-kaist/pintos-kaist /home/jungle/pintos

# Set default shell for the `jungle` user

문제는 vscode의 특정 버전 이상부터는 ubuntu 18.04를 지원하지 않는다. 초초레거시 환경이다 허걱.
그래서 vscode를 사용하지 못하는 건가..? 생각했다.
근데 vscode 버전을 ubuntu 18.04를 지원하던 때로 다운그레이드 시켜주면 되니까 그냥 다운그레이드 했따.
근데 여전히 찝찝한 마음...

다른 방법은 없을까.. 더 알아보자.


일단 dockerfile이 뭔지 먼저 알아보자.
dockerfile은 이미지를 만들기 위해 미리 정의해둔 명령어의 모음집이다.
어떤 이미지에서 시작해서(base image) 환경은 어떠하고 어떤 의존성을 설치할 것인지, 등의 설정을 정의해둔 파일이다.

그니까,
이미지를 만들기 위해 정의해둔 명령어의 묶음이 도커파일이고,
그 도커파일로 만들어지는 게 도커 이미지.
도커 이미지를 실행하면 도커 컨테이너라는 실행 환경의 흐름이 구성된다.

ok 이해완.

근데 내가 진짜 편하게 사용했던 dev-container extention은 도대체 어떤 역할을 하길래
알아서 이렇게 휘리릭 세팅되는 거지??

GPT 선생님의 말씀
좋아요, 딱 지금 당신이 보고 있는 게 VS Code + Dev Containers의 마법이에요 🧙‍♂️✨
간단히 말해서:
🧠 Dev Containers 개념

Dev Container는 도커 기반 개발 환경을 VS Code 안에서 바로 실행할 수 있게 해주는 기능이에요.

VS Code에서 devcontainer.json이나 Dockerfile을 인식하면:
1. VS Code가 자동으로 Dockerfile을 빌드해서,
2. 그 이미지로 컨테이너를 만들고,
3. VS Code 자체를 그 컨테이너 안에서 실행하게 해줘요!

즉, 로컬 환경 설정 하나도 안 건드리고도, 도커 안에서 완전한 개발 환경을 바로 사용할 수 있는 거예요.

[.devcontainer/devcontainer.json]
         |
         v
    [Dockerfile]   →    Docker Image   →   Container
         |                                 |
         v                                 v
   설치할 툴/확장들                   VS Code Server 실행

이후에는 컨테이너 안에서 VS Code가 돌아가고, 내 소스코드 폴더는 공유된 볼륨처럼 컨테이너에서 접근해요.


아하. 여태까지는 vscode가 알잘딱깔센. 자기가 도커파일을 인식하고 빌드하고 실행하고 접속해서 자기를 그 안에서 실행되도록 해준 거였다.
내가 보기에는 내 로컬에서 기존처럼 동작하지만, 사실 이는 컨테이너 안에서 vscode가 동작하고 있는 것을 내 모니터에서 보고 있는 것이었다.

정리하면 이렇게 말이다.
1. vscode가 Dockerfile과 devcontainer.json을 읽고
2. 그걸로 이미지를 빌드하고 컨테이너를 실행한 다음
3. 그 컨테이너 안에서 VS Code Server를 실행
4. 그리고 로컬 VS Code 클라이언트는 그 서버에 접속해서 사용
알지도 못하고 사용했는데 진짜 쩌는 extention이네..

만약 이 dev container 확장을 사용하지 않으면 터미널에서 이런 과정을 수행하게 된다.

  1. Dockerfile 작성
  2. image 빌드
docker build -t my-app-image .
  1. container 실행(내 로컬 파일을 컨테이너와 공유)
docker run -it --name my-container -v $(pwd):/app -p 5000:5000 my-app-image

-v $(pwd):/app : 로컬 소스 코드 공유
-p 5000:5000 : 호스트와 컨테이너 포트 연결
-it : 터미널로 들어가서 상호작용 가능하게

  1. vs code에서 맘껏 수정하고
  2. docker container에서 실행

오케이!
여기까지 이해가 되었다면
ubuntu 18.04 환경의 문제도 해결할 수 있다.

해당 환경으로 컨테이너를 실행하고, 내 로컬 폴더 pintos-lab 의 소스코드를 공유하게 연결해주면 된다.
vs code에서 지원하지 않는 건, ubuntu 18.04 환경이지 내 mac os환경이 아니다. 나는 mac os에서 돌아가는 vs code 위에서 코드를 수정하면,
컴파일, 실행은 컨테이너 위의 ubuntu os 환경에서 하면 된다!

“내 Mac에서 수정하고, 리눅스에서 실행한다. 둘은 도커가 연결한다.”

지금은 이미 vs code를 다운그레이드 한 상황이지만,
우선순위가 높은 이번 과제를 끝낸 이후에 시간이 남으면 업그레이드 하고 위의 방법으로 로컬 폴더를 마운트해주는 방법으로 변경할 것이다. 야호~

우리반 똑똑이모기선생님 블로그를 보고 이해해야겠다 싶어서 정리해봤다. 이제 실제 세팅은 이 블로그를 보고 하면 되겠다. ㅎㅅㅎ

profile
어서오세요! ☺️ 후회 없는 내일을 위해 오늘을 열심히 살아가는 개발자입니다.

0개의 댓글