아니 핀토스 3주차가 되어가는데 도커를 아직 못 쓰면 안 되자나요 !
누군가의 도움 없이 도커 환경을 실행시키고 싶어서 한 번 정리해봅니당.
처음 도커 사용법을 알려준 지성이와 항상 내 도커 문제를 해결해준 윤호 덕분에 많이 배운 것 같다.
진짜 고마운 사람덜.. ૮₍っ⸝⸝ o̴̶̷᷄ ̫ o̴̶̷̥᷅⸝⸝ ₎ა
도커가 필요한 이유에 대해서는 이전 포스팅을 참고하자.
VM을 통해 별도의 OS를 실행할 환경을 만드는 것이다.
가상화(Virtualization)
Virtualization?Use a single machines' hardware to run multiple virtual machines in it. Key point:Use a system's Hardware.Allocate CPU/RAM/Storage to VMs.Cannot exceed the CPU/RAM/Storage that is available on physical hardware.Benefits:Better use on H/W res
nkdev.tistory.com
먼저 자주 쓰게 되는 기본적인 명령어에 대해서 정리해보자
기본 명령어
docker ps
지금 실행 중인 도커 컨테이너 목록 보기
docker ps -a
지금 실행 중인 + 이전에 실행하다가 종료된 도커 컨테이너 목록 보기
docker images
도커 이미지 보기
docker rmi [이미지 id 또는 이름]
특정 도커 이미지 삭제
docker start [컨테이너 id]
전에 실행했었던 컨테이너를 재활용할 때 사용하는 명령어.
전에 실행했던 컨테이너의 목록은 docker ps -a로 볼 수 있다.
docker attach [컨테이너 id]
현재 실행 중인 컨테이너의 쉘을 현재 cmd창에 attach하는 명령어이다.
컨테이너 환경으로 들어갈 수 있다.
docker stop [컨테이너 id]
도커 컨테이너 중지
docker rm [컨테이너 id]
도커 컨테이너 삭제
docker run -it --name [컨테이너 이름 지정] [사용할 이미지] [실행할 프로그램]
특정 이미지로 새 컨테이너 만들고 실행
이미지 사용 vs 도커파일 사용
(1) 이미지 사용
docker run -it [이미지 이름]
이미 존재하는 도커 이미지(ubuntu)를 기반으로 컨테이너를 실행할 수 있다. 이미지 이름만 주면 도커 이미지가 자동으로 다운받아짐.
이 때 Dockerfile은 필요 없음
(2) 도커파일 사용
docker build -t [내가 지정하고 싶은 이미지 이름] [도커파일이 존재하는 경로]
이미지를 따로 만들고 싶다면 Dockerfile 작성해서 빌드하면 된다.
docker build -t myapp . 이라고 치면
myapp이라는 이름의 도커 이미지를 현재 디렉토리(.)에 있는 Dockerfile의 내용 대로 생성할 수 있다.
* Pintos는 ubuntu 18.04환경에서 컴파일해야 해서 예전에 그 버전의 우분투 이미지를 pull로 가져와서 시도해봤는데 뭔가 잘 안 됐던 기억이 있다.. 그래서 이번에도 도커파일로 이미지를 새로 생성해서 그걸로 컨테이너를 실행할 예정이다.
docker run [이미지 이름]
그리고 docker run으로 실행한다.
pintos-week2 안에 Dockerfile 생성
# 베이스 이미지
FROM --platform=linux/amd64 ubuntu:18.04
# 로케일과 타임존 설정
ENV TZ=Asia/Seoul \
LANG=ko_KR.UTF-8 \
LANGUAGE=ko_KR.UTF-8
# 필수 패키지 설치
RUN export DEBIAN_FRONTEND=noninteractive && \
apt-get update && \
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 && \
# 캐시 정리
rm -rf /var/lib/apt/lists/*
# 비-root 사용자 jungle 생성 및 sudo 권한 부여
RUN useradd -m -s /bin/bash jungle && \
usermod -aG sudo jungle && \
echo "jungle ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/jungle
# 이후 jungle 사용자로 전환
USER jungle
WORKDIR /home/jungle
# Pintos 개발 환경 activate 스크립트 로드 설정
RUN echo "source /home/jungle/pintos-kaist/activate" >> /home/jungle/.bashrc
# 컨테이너 시작 시 bash 실행
CMD ["bash"]

pintos-week2 경로 즉 Dockerfile 있는 경로에서
docker build -t pintos-lab . 로 도커파일 이미지 생성

docker images로 생성 확인!
그리고 이 이미지를 사용해서 컨테이너를 생성하면 되는데
docker run pintos-lab
docker run sweet_booth
docker run -it sweet_booth
docker run -it pintos-lab
docker run -it pintos-lab /bin/bash
다 시도해봤는데 안 됨




??
그래서 pintos 첫 주차때는 어떻게 했나 봤더니 이렇게 했더라...
docker run -it \
-v $(pwd):/home/jungle/pintos-kaist \
-w /home/jungle/pintos-kaist \
pintos-dev
-v : 호스트 디렉토리를 컨테이너 안으로 연결
docker run -v [호스트 경로]:[컨테이너 경로] ...
호스트 경로는 내 로컬 경로 기준, 컨테이너 경로는 실제 로컬경로와는 상관 없이 컨테이너 안에서 어디에 마운트할지 결정하는 부분
예) docker run -v $(pwd):/app -it ubuntu
현재 내 로컬 디렉토리(pwd)를 컨테이너의 /app에 연결. 즉, 내 컴퓨터에서 만든 파일이 컨테이너 안에서도 보이고, 컨테이너에서 만든 파일도 내 컴퓨터에서 보임. 이것을 볼륨 마운트라고 함
-w : 컨테이너 안에서 작업 디렉토리 지정
doker run -w [컨테이너 내 디렉토리 경로] ...
예) docker run -it -v $(pwd):/app -w /app ubuntu
/app 디렉토리를 작업 디렉토리로 지정하고 시작됨. 즉, 컨테이너 안에서 자동으로 cd /app한 상태로 bash가 열림
이미 만들어뒀던 컨테이너를 다시 실행하면 그 때 설정한 -v, -w가 유지된다.
이 내용을 참고해서 다시 시도해보자.
내가 project week2에서 사용할 pwd와 도커 이미지 id를 지피티한테 주고 받아온 run명령어이다.
docker run -it \
-v /Users/soyoung/git/pintos-week2:/home/pintos \
-w /home/pintos \
12c8edb0a3dd \
bash

왕 이제된당
이제 루트 디렉토리에서 source ./activate 해주고
userprog에서 make 명령어로 build 파일 생성해주고
build 파일 안에서 make check 해주면 끝 ~

깃 클론한 코드 잘 돌아가는 것 확인 완뇨

태그 사용하기
이제 pintos-week1, pintos-week2 두 프로젝트의 도커 환경을 어떻게 관리할지 고민할 차례다
두 프로젝트는 내부에 구현된 코드만 다르지 같은 앱이므로, Dockerfile도 똑같은걸 쓰면 된다.
그래서 굳이 도커파일 두개 만들고 각각 이미지 생성해서 컨테이너도 각각 만들 필요가 없고
아까 project2에서 생성한 이미지를 사용해서 project1을 위한 컨테이너를 새로 만들면 된다.
이미지의 용도/시점/버전을 구분할 때 TAG를 사용할 수 있는데 아래처럼 실행하면
docker tag 825587e981d9 pintos-lab:pintos-week1
이렇게 이미지 한개에 태그를 두 개 생성할 수 있다.
하나는 project1, 하나는 project2를 위해 사용하자


week1, week2용 컨테이너를 이렇게 각각 만들고 실행할 수 있다.
docker run -it \
--name pintos-week1-container \
-v /Users/soyoung/git/pintos-week1:/home/pintos \
-w /home/pintos \
pintos-lab:pintos-week1 \
bash
docker run -it \
--name pintos-week2-container \
-v /Users/soyoung/git/pintos-week2:/home/pintos \
-w /home/pintos \
pintos-lab:pintos-week2 \
bash
그러면 같은 이미지이지만 태그(pintos-week1, pintos-week2)가 다른 두 이미지를 기반으로,
서로 다른 디렉토리를 마운트하고 작업 디렉토리를 설정한 컨테이너 2개가 만들어진다.
- 두 컨테이너는 같은 이미지 ID를 기반으로 하지만,
서로 다른 과제 디렉토리를 마운트해서 완전히 독립적인 개발 환경을 구성할 수 있다. - 컨테이너 안에서 ls 해보면 각자의 /home/pintos 안에 week1 또는 week2 소스가 있을 것이다.
'정글 > Pintos' 카테고리의 다른 글
| [pintos] 3주차 - 유저풀, 커널풀 / pml4 / KVA, UVA, KERN_BASE (5) | 2025.06.05 |
|---|---|
| [pintos] 3주차 - VM의 Unallocated, Cached, Uncached 상태 / Anonymous page / Lazy Loading (0) | 2025.06.03 |
| [pintos] gdb를 사용해보세요 - gdb 사용법 (0) | 2025.05.29 |
| [pintos] 내 Argument Passing 좀 어떻게 해봐 (ㅠㅠ) (0) | 2025.05.29 |
| [pintos] 2주차 - User Memory, System Calls 구현 과정 (1) | 2025.05.28 |