infra
Platform

모듈 맵

[Linux] 개발자가 왜 리눅스 서버와 커맨드라인을 반드시 배워야 하는가

0 / 37 완료

펼치기
0 / 37 완료0%

리눅스 서버 운영 · 01 / 37

[Linux] 개발자가 왜 리눅스 서버와 커맨드라인을 반드시 배워야 하는가

클라우드 인프라의 95%가 Linux 위에서 돌아갑니다. 왜 지금 당장 Linux를 배워야 하는지, 실무 관점에서 설명합니다.

초급301 / 37
[Linux] 개발자가 왜 리눅스 서버와 커맨드라인을 반드시 배워야 하는가 개념 다이어그램
🚨INCIDENT ALERT
HIGH

입사 첫 주. 선임이 Slack으로 메시지를 보냈습니다. "프로덕션 서버 들어가서 Nginx 로그 좀 확인해봐요." AWS 콘솔을 열고 EC2 인스턴스를 찾았지만, 연결 버튼을 누르면 검은 화면에 커서만 깜빡입니다. 마우스로 클릭할 아이콘도, 메뉴도 없습니다. 여기가 Linux 서버입니다. 클라우드 인프라를 다루는 순간 Linux는 선택이 아닌 현실이 됩니다.

이번 챕터에서 배울 것
  • 1Linux가 서버 시장을 지배하는 이유를 비용·성능·생태계로 설명할 수 있다
  • 2커널과 배포판의 차이를 구분하고, 배포판별 패키지 관리자를 말할 수 있다
  • 3cat /etc/os-release로 현재 서버의 배포판을 확인할 수 있다
  • 4--help와 man 페이지를 사용해 모르는 명령어를 스스로 찾을 수 있다

Linux가 서버를 지배하는 이유

💡개념

비용·성능·생태계 — Linux가 서버 시장을 장악한 3가지 이유

Linux 서버 시장 장악 3가지 이유 — 비용·성능·생태계 비교확대

회사에서 처음으로 서버 비용 청구서를 받아보면 OS 라이선스 항목에서 놀라게 됩니다. 100대가 넘는 서버에 Windows Server를 올리면 컴퓨팅 비용과 별개로 OS 비용이 두 배 가까이 붙습니다. 인프라 팀에서 비용 최적화 업무를 맡으면 가장 먼저 손대는 항목 중 하나가 OS 선택입니다.

1. 비용: 라이선스 없음

Windows Server는 코어당 라이선스 비용이 발생합니다. 32코어 서버라면 수백만 원의 OS 비용이 추가됩니다. Ubuntu, Amazon Linux, Rocky Linux는 모두 무료입니다.

OUTPUT
# AWS EC2 가격 비교 (us-east-1, m5.large, 2024년)
Amazon Linux 2023:  $0.096/시간  ← OS 라이선스 비용 없음
Windows Server:     $0.192/시간  ← OS 라이선스 포함
→ 동일 사양에서 월 ~$70 차이, 100대면 ~$7,000/월 절감

2. 성능: GUI가 없어서 빠르다

서버용 Linux는 그래픽 인터페이스를 아예 설치하지 않습니다. 이 환경을 "헤드리스(headless)"라고 부릅니다. OS 자체가 차지하는 메모리가 줄어든 만큼 애플리케이션에 더 많은 RAM이 할당됩니다.

OUTPUT
# 신규 부팅 직후 메모리 사용량
Ubuntu 22.04 Server:    ~300 MB
Windows Server 2022:    ~2,000 MB
→ 남은 1.7 GB가 앱·DB·컨테이너에 할당됨

3. 생태계: 모든 도구가 Linux 우선

Docker, Kubernetes, Nginx, PostgreSQL, Kafka, Redis — 인프라 주요 도구는 전부 Linux에서 먼저 만들어졌습니다. 문서, 이슈 트래커, 커뮤니티 지식이 Linux 기준으로 쌓여 있습니다.

OUTPUT
Docker 최초 지원 OS: Linux (2013)
Windows 지원:       2016년 (3년 후)
macOS Docker:       내부적으로 Linux VM 위에서 실행됨

커널 vs 배포판

💡개념

배포판이 여러 개인 이유 — 커널은 하나, 위에 올라가는 것이 다르다

온보딩 중에 선임이 "이 서버는 Amazon Linux야"라고 했는데 apt install을 치면 "command not found"가 뜹니다. Ubuntu에서 배운 명령어가 안 먹히는 이유는 커널과 배포판을 구분하지 않았기 때문입니다.

Linux 커널: Linus Torvalds가 1991년 만든 OS의 핵심 엔진입니다. 하드웨어 제어, 메모리 관리, 프로세스 스케줄링을 담당합니다. 모든 배포판이 이 커널을 공유합니다.

배포판(Distribution): 커널 위에 패키지 관리자, 기본 도구, 기본 설정을 묶어 배포하는 완성된 OS입니다.

배포판패키지 관리자주로 쓰이는 곳
Ubuntu 22.04 LTSapt개발, 학습, 클라우드 범용
Amazon Linux 2023dnfAWS EC2 기본값
Rocky Linux / AlmaLinuxdnf엔터프라이즈 서버
Alpine LinuxapkDocker 컨테이너 경량 베이스

이 트랙은 Ubuntu 22.04 LTS 기준으로 진행합니다. 학습 자료가 가장 많고, 클라우드 인스턴스 기본값으로 자주 등장하며, 기업 서버에도 폭넓게 쓰입니다.

Linux 커널 하나 — 배포판은 여러 개 (apt/dnf/apk)확대

배포판 선택 기준 — 언제 무엇을 쓰나
처음 배우거나 자료·커뮤니티가 가장 많아야 할 때Ubuntu (Debian 계열, apt) — 문서·예제·Stack Overflow 답변이 가장 풍부. 입문·일반 서버 1순위
기업/금융 등 장기 안정성·상용 지원이 필요할 때RHEL 또는 Rocky/Alma (dnf) — 긴 지원주기·인증. RHEL은 유료 지원, Rocky/Alma는 호환 무료
최소 용량·빠른 컨테이너 이미지가 필요할 때Alpine (apk) — 수 MB 수준. 단 musl libc·busybox라 일부 바이너리 호환 이슈, 디버깅 도구 적음
사내 표준이 이미 정해져 있을 때표준을 따른다 — 배포판 통일이 운영·자동화·보안 패치 관리를 단순화. 취향보다 일관성
패키지 명령이 헷갈릴 때계열로 기억: Debian 계열=apt(.deb), RHEL 계열=dnf/yum(.rpm), Alpine=apk. 커널은 같고 패키지 관리·기본 설정이 다름

현재 배포판 확인하기

1배포판 정보 확인

모든 Linux 배포판은 /etc/os-release 파일에 자신의 정보를 기록합니다. 어떤 서버에 처음 접속했을 때 가장 먼저 실행하는 명령어 중 하나입니다.

로컬 터미널
cat /etc/os-release
OUTPUT
NAME="Ubuntu"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"

ID_LIKE=debian — Ubuntu는 Debian 계열이므로 apt를 사용한다는 뜻입니다.

cat /etc/os-release
🔍실행 후 확인할 것
  • 먼저 NAME 필드를 확인한다 — 그 다음 ID_LIKE 필드를 읽는다. ID_LIKE=debian이면 apt, ID_LIKE=rhel이면 dnf/yum 을 쓴다. 이 두 필드만 알면 처음 접속한 서버에서 패키지 관리자를 바로 선택할 수 있다
  • VERSION_ID 숫자가 22.04처럼 짝수 연도.짝수 월이면 LTS(장기지원) 버전 — 서버 운영에 권장. 비 LTS(예: 23.10)는 9개월만 지원된다
  • uname -a 출력 맨 앞이 커널 버전, 두 번째가 호스트명이다 — ID_LIKE가 debian인데 uname 출력에서 커널 버전이 5.x 이하이면 구버전 환경임을 의미하고, 최신 컨테이너 기능(cgroup v2 등)이 제한될 수 있다
2모르는 명령어는 --help로 확인

Linux에서는 명령어를 외울 필요가 없습니다. 모르는 옵션이 생기면 --help를 붙이면 됩니다.

로컬 터미널
ls --help | head -20
OUTPUT
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
...
  -a, --all           do not ignore entries starting with .
  -l                  use a long listing format
  -h, --human-readable  with -l, print sizes like 1K 234M 2G

더 자세한 설명이 필요하면 man ls를 실행합니다. q를 누르면 종료됩니다.

ls --help | head -20
🔍실행 후 확인할 것
  • 먼저 --help 출력 첫 줄(Usage)에서 명령어 형식을 읽는다 — 그 다음 대괄호([OPTION])는 선택, 점 세 개(...)는 반복 가능을 뜻한다. 이 규칙을 알면 모든 --help 출력을 같은 방식으로 읽을 수 있다
  • -h(--human-readable)는 -l과 함께 써야만 효과가 있다 — ls -h 단독 실행 시 크기 단위가 바이트 그대로 출력된다. 옵션 조합 조건이 있는 경우 --help 설명에 'with -l' 같은 전제가 명시되어 있다
  • man ls 에서 검색은 / + 키워드, 다음 결과는 n키다 — 옵션 설명이 --help보다 3배 이상 길기 때문에 검색 없이 스크롤만 하면 시간이 오래 걸린다. q로 종료 후 명령이 그대로 유지된다

트러블슈팅

상황: Ubuntu에서 배운 대로 apt install nginx를 입력했는데 "command not found" 에러가 납니다. Amazon Linux나 CentOS 서버에서 자주 만나는 상황입니다.

원인: apt는 Ubuntu/Debian 계열에서만 사용하는 패키지 관리자입니다. Amazon Linux 2023, CentOS, Rocky Linux는 dnf 또는 yum을 사용합니다. 배포판마다 패키지 관리자가 다르기 때문에, 서버에 접속하면 먼저 배포판을 확인하는 습관이 중요합니다.

진단 — 배포판을 먼저 확인하세요:

로컬 터미널
cat /etc/os-release | grep -E "^NAME|^ID="
OUTPUT
NAME="Amazon Linux"
ID="amzn"

해결:

로컬 터미널
# Ubuntu/Debian 계열
sudo apt install nginx

# Amazon Linux 2023 / RHEL 8+ / Rocky Linux
sudo dnf install nginx

# CentOS 7 / Amazon Linux 2 (구버전)
sudo yum install nginx

# Alpine (컨테이너 환경)
apk add nginx

배포판을 확인한 후 해당 패키지 관리자를 사용하면 됩니다. dnfyum은 기본 사용법이 거의 동일합니다.

상황: 온라인 튜토리얼을 따라하다가 "command not found"가 떴습니다. 설치가 필요한 도구인지, 철자가 틀린 것인지, 아니면 다른 이름으로 있는 건지 알 수 없습니다.

원인: 세 가지 경우가 있습니다. ① 타이포 (ls를 sl로 입력 등) ② 해당 도구가 미설치 ③ 다른 배포판에서만 사용하는 명령어

진단 — 어느 경우인지 확인하세요:

로컬 터미널
# 1. 명령어 위치 확인 — 설치는 됐지만 경로 문제?
which nginx
type nginx

# 2. 패키지 이름 검색 — 설치 가능한 패키지가 있는가?
apt search nginx         # Ubuntu
dnf search nginx         # Amazon Linux/RHEL

해결:

로컬 터미널
# 타이포 → 올바른 명령어 입력
# 미설치 → apt/dnf install 로 설치
# 경로 문제 → which 결과의 전체 경로로 실행 (/usr/sbin/nginx)

명령어를 모를 때는 man <명령어> 또는 <명령어> --help로 사용법을 먼저 확인하는 습관을 들이세요.

심화 — 커널은 하나, userspace는 여럿: 컨테이너로 이어지는 다리

💡개념

심화: 컨테이너는 왜 '같은 커널, 다른 배포판'이 가능한가

앞에서 '커널은 하나, 배포판은 그 위의 userspace'라고 했습니다. 이 구분을 한 단계만 더 밀고 나가면, Docker 컨테이너가 왜 우분투 호스트 위에서 알파인·CentOS 컨테이너를 돌릴 수 있는지가 설명됩니다.

  • 컨테이너는 가상머신이 아니다: 가상머신(VM)은 자기 커널을 따로 부팅합니다. 반면 컨테이너는 호스트의 커널을 공유하고, 그 위에 다른 userspace(배포판의 파일들)만 얹습니다. 그래서 alpine 이미지를 우분투 호스트에서 실행하면 커널은 호스트 우분투의 것이고, 셸·라이브러리·패키지 관리자(apk)만 알파인의 것입니다.
  • 그래서 생기는 한계 ①: 커널을 공유하므로 컨테이너 안의 커널 버전은 항상 호스트와 같습니다. 컨테이너를 바꿔도 커널은 못 바꿉니다(호스트에서 uname -r, 컨테이너 안에서 uname -r이 같게 나오는 이유).
  • 그래서 생기는 한계 ②: userspace가 다르므로 배포판 관습(패키지 매니저·경로·기본 셸)이 이미지마다 다릅니다. 알파인엔 aptbash도 기본으로 없습니다.
  • 더 깊은 함정 — C 라이브러리까지 다르다: 알파인은 glibc가 아니라 musl libc를 씁니다. glibc로 컴파일한 바이너리를 알파인에 그냥 올리면 실행이 안 될 수 있습니다. '같은 리눅스'라도 userspace의 표준 C 라이브러리까지 다를 수 있다는 뜻입니다.

정리하면, '커널 하나 위에 userspace 여럿'이라는 그림을 이해하면 배포판 차이도, 컨테이너도 같은 원리의 다른 표현임을 알게 됩니다. 이 그림이 뒤에 나올 Docker로 넘어가는 다리가 됩니다.

상황: 처음으로 docker run -it alpine sh로 알파인 컨테이너에 들어가, 우분투에서 하던 대로 apt-get install을 치고 bash도 실행했는데 둘 다 command not found입니다. 분명 '리눅스'인데 아는 명령이 하나도 안 먹힙니다.

원인: 컨테이너는 호스트의 커널을 공유하지만 userspace(배포판)는 이미지가 정합니다. 알파인은 apt가 아니라 apk를, 기본 셸로 bash가 아니라 ash(=sh)를 씁니다. 우분투 습관이 안 통하는 것은 배포판 계열이 다르기 때문이고, 컨테이너 안에서 os-release를 보면 이유가 바로 드러납니다.

진단: 컨테이너 안에서 cat /etc/os-release로 배포판을 확인합니다(NAME="Alpine Linux", ID=alpine). which apkwhich apt로 무엇이 있는지 봅니다. 호스트에서 uname -r, 컨테이너 안에서 uname -r을 비교하면 커널 버전이 '같다'는 것도 확인됩니다 — 커널을 공유한다는 증거입니다.

해결: 알파인에선 apk를 씁니다 — apk add <패키지>로 설치하고, bash가 필요하면 apk add bash로 넣습니다. 애초에 익숙한 환경이 필요하면 ubuntu/debian 베이스 이미지를 고르는 것이 답입니다. 만약 glibc 전용 바이너리를 알파인에 올려 실행 오류가 난다면, 이는 musl libc 차이 때문이니 glibc 계열 이미지로 바꾸거나 정적(static) 빌드를 사용합니다.

💼
실무 맥락
현업 패턴

상황: 새벽 모니터링 알림이 울렸습니다. 프로덕션 웹 서버 CPU가 95%를 넘겼습니다. 선임이 Slack으로 "EC2 들어가서 프로세스 확인해봐요"라고 합니다.

이 순간 Linux를 모르면 아무것도 할 수 없습니다. 반대로, 이 트랙을 마치면 다음 흐름이 자연스럽게 됩니다:

  1. AWS 콘솔에서 인스턴스 퍼블릭 IP 확인
  2. ssh -i ~/.ssh/prod-key.pem ubuntu@<IP> — 서버 접속
  3. top 또는 htop — CPU 점유율 높은 프로세스 확인
  4. 원인 파악 후 로그 확인
  5. Grafana 대시보드에서 CPU 추이 모니터링

"Linux를 배운다"는 것은 이 흐름을 혼자 해낼 수 있게 되는 것입니다.


명령어·단축키 빠른 참조

이 모듈에서 다룬 "낯선 서버 첫 접속·배포판 확인·도움말 찾기" 명령을 모았습니다. 배포판 계열부터 확인하는 습관이 핵심입니다.

명령어/단축키용도자주 쓰는 예
cat /etc/os-release배포판·버전 확인(첫 접속 시 1순위)cat /etc/os-release | grep -E "^NAME|^ID="
uname -r / uname -a커널 버전 / 전체 시스템 정보호스트·컨테이너에서 각각 실행해 커널 공유 확인
apt (Debian 계열)Ubuntu/Debian 패키지 관리sudo apt install nginx / apt search nginx
dnf / yum (RHEL 계열)Amazon Linux·Rocky·RHEL 패키지 관리sudo dnf install nginx / dnf search nginx
apk (Alpine)컨테이너 경량 이미지 패키지 관리apk add nginx / apk add bash
<명령> --help옵션·사용법 빠른 확인ls --help | head -20
man <명령>상세 매뉴얼(/=검색, n=다음, q=종료)man ls/human 검색
which / type명령 설치 여부·경로 확인which nginx / type nginx
ssh -i <키> <user>@<IP>원격 서버 접속ssh -i ~/.ssh/prod-key.pem ubuntu@<IP>

관련 모듈로 더 깊이:

다음 모듈에서는 실제 터미널에 접속하는 방법을 실습합니다. WSL(Windows), SSH(원격 서버), 클라우드 콘솔 — 세 가지 접속 방법을 직접 연결해봅니다.

지식 확인

퀴즈 — 10문제

Q1

AWS EC2 인스턴스를 생성할 때 기본 OS로 Amazon Linux를 선택하는 가장 큰 실무적 이유는?

Q2

동일한 하드웨어에서 Ubuntu 서버를 운영할 때, 'Linux가 Windows Server보다 리소스를 적게 사용한다'는 말의 실질적 의미는?

Q3

Ubuntu, CentOS, Amazon Linux, Alpine Linux는 모두 'Linux'인데도 명령어나 패키지 관리자가 다른 근본 이유는?

Q4

처음 보는 서버에서 apt install이 'command not found'다. /etc/os-release를 보니 'Amazon Linux 2023'이다. 올바른 패키지 설치 명령은?

Q5

AWS EC2에서 같은 사양인데 Windows Server 인스턴스가 Linux보다 시간당 요금이 비싼 주된 이유는?

Q6

낯선 리눅스 서버에 SSH로 접속했다. 배포판과 버전을 가장 정확히 확인하는 명령은?

Q7

[심화] 우분투 호스트에서 alpine이나 CentOS 컨테이너를 실행할 수 있는 근본 이유는?

Q8

[심화] docker run -it alpine sh로 알파인 컨테이너에 들어가 apt-get install과 bash를 쳤더니 둘 다 command not found입니다. 원인과 조치로 가장 정확한 것은?

Q9

[1급] 리눅스 커널 버전 표기에서 2.x 시절 두 번째 숫자(minor)가 홀수인 커널이 의미한 것은?

Q10

[1급] 전통적 SysV init에서 기본 실행 상태를 그래픽 로그인으로 두는 런레벨과, systemd에서 이에 대응하는 타깃이 옳게 짝지어진 것은?

0 / 10 답변

🧪 실습으로 확인하기

새 서버 인수인계 — 처음 30분

초급

낯선 Linux 서버를 인수받았을 때 OS, 서비스, 로그를 빠르게 파악하는 루틴을 직접 수행한다.

30📋 3단계💻 직접 환경
실습 시작하기 →

이것도 배워보세요