Docker 기초 (1) - Prerequisites: Processes, Kernel, File System, and Networking
쉘과 환경 변수부터 프로세스, 커널, 파일 시스템, 포트, Python 가상환경까지 Docker 학습에 필요한 사전 지식을 정리합니다.
Docker 기초 시리즈의 1편입니다. 본문에 필요한 사전 지식을 점검하는 편이라, 아래 여섯 항목이 익숙하면 바로 2편으로 넘어가도 됩니다. 전체 목차는 0편에 있습니다.
왜 이 편이 있나
Docker의 개념은 전부 OS의 기본 개념 위에 서 있습니다. “container는 격리된 프로세스”라는 문장은 프로세스를 알아야 이해되고, “호스트 커널을 공유한다”는 커널이 무엇인지 알아야 의미가 잡힙니다. 시리즈 본문이 전제하는 배경을 여섯 항목으로 정리했고, 항목마다 시리즈의 어느 편에서 쓰이는지 적었습니다.
1. 쉘과 환경 변수
명령 한 줄은 프로그램 이름, 옵션, 인자의 조합입니다. 여기에 두 개념이 붙습니다.
- 환경 변수: 프로세스에 딸린 이름=값 형태의 설정.
export NAME=value로 정하고echo $NAME으로 확인합니다 - PATH: 쉘이 프로그램 파일을 찾는 디렉토리 목록.
docker라고만 쳐도 실행되는 이유입니다
1
2
echo $PATH
export DB_PASSWORD=dev && echo $DB_PASSWORD
시리즈에서 쓰이는 곳: 모든 편의 명령 실행, 4편의 -e 옵션(환경 변수 주입), 6편의 ENV 명령어입니다.
2. 프로세스와 표준 출력
- 프로세스: 실행 중인 프로그램 하나. 각자 PID라는 번호를 갖습니다
- 표준 출력(stdout)과 표준 에러(stderr): 프로세스가 텍스트를 내보내는 기본 통로. 파일이 아니라 이 통로로 나온 것이 터미널에 보입니다
- 종료 코드: 프로세스가 끝나며 남기는 숫자. 0이 정상 종료입니다
1
2
ps aux | head # 지금 도는 프로세스 목록
echo $? # 직전 명령의 종료 코드
백그라운드에 상주하며 요청을 기다리는 프로세스는 daemon이라고 부릅니다. 이름 끝에 d가 붙는 프로그램(sshd, dockerd)이 대개 이것이고, 시리즈에서 계속 나오는 개념이라 별도 글로 정리해 두었습니다.
시리즈에서 쓰이는 곳: container가 격리된 프로세스라는 정의(2편), 메인 프로세스가 container 수명을 정하는 원리(3편, 4편), docker logs가 stdout을 보여주는 이유(4편)입니다.
3. 커널과 사용자 공간
- 커널: 하드웨어를 다루고 프로세스, 메모리, 파일, 네트워크를 관리하는 OS의 핵심. 모든 프로세스가 커널을 통해 자원을 씁니다
- 사용자 공간: 커널 위에서 도는 나머지 전부. 시스템 라이브러리(glibc), 쉘, 설치된 프로그램이 여기 속합니다
- Ubuntu와 Debian 같은 배포판의 차이는 대부분 사용자 공간의 차이이고, 커널은 같은 Linux입니다
1
uname -r # Linux 서버에서 커널 버전 확인
시리즈에서 쓰이는 곳: “커널은 공유하고 사용자 공간만 격리한다”는 container의 정의와 base image의 OS가 호스트와 달라도 되는 이유(모두 2편)입니다.
4. 파일 시스템과 마운트
- 파일 시스템은 루트(
/)에서 시작하는 하나의 트리이고, 경로는 절대 경로(/app/data)와 상대 경로(./data)로 적습니다 - 마운트: 트리의 한 지점에 다른 저장 공간을 붙이는 것. 외장 디스크를 꽂으면 macOS에서
/Volumes아래에 나타나는 것이 마운트입니다
시리즈에서 쓰이는 곳: image가 파일 시스템 스냅샷이라는 정의(2편), WORKDIR와 COPY의 경로(6편), volume과 bind mount(7편)입니다.
5. IP, 포트, localhost
- IP 주소가 네트워크에서 머신을 가리키고, 포트 번호가 그 머신 안에서 프로세스를 가리킵니다. “5432 포트로 접속한다”는 그 포트를 듣고 있는 프로세스(PostgreSQL)에 접속한다는 뜻입니다
- localhost(127.0.0.1)는 “이 머신 자신”입니다. 어느 머신에서 부르는지에 따라 가리키는 대상이 달라진다는 점이 뒤에서 중요해집니다
- hostname: IP 대신 쓰는 이름. 이름을 IP로 바꿔주는 체계가 DNS입니다
1
lsof -i :5432 # 이 포트를 쓰는 프로세스 확인 (macOS)
시리즈에서 쓰이는 곳: -p 호스트:컨테이너 옵션(4편), container 안의 localhost 함정과 이름 기반 통신(7편), service 이름으로 접속하는 Compose(8편)입니다.
6. Python 가상환경
- venv: 프로젝트별로 패키지를 분리 설치하는 도구입니다. 격리 범위는 Python 패키지까지이고, 그 아래의 인터프리터와 시스템 라이브러리는 격리하지 못합니다
1
2
3
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
시리즈에서 쓰이는 곳: 시리즈의 출발점인 “가상환경이 못 막는 것”(2편), requirements.txt를 먼저 COPY하는 cache 설계(6편)입니다. 가상환경 자체는 Python 개발 환경 정리 글에서 다뤘습니다.
점검
여섯 항목이 낯설지 않으면 준비는 끝났습니다. 다음 편부터 본문입니다.
다음 글: Docker 기초 (2) - What is Docker: Container, Image, and Registry