VMware 없이 Docker로 띄우는 리눅스 마스터 1급/2급 실습 환경
Rocky Linux 8 (RHEL 계열) + systemd 기반으로 실제 시험 환경과 최대한 유사하게 구성했습니다.
서버 2대(server1 / server2)가 같은 네트워크 안에서 통신하며, systemctl, 패키지 관리, 네트워크 서비스 등 시험 항목을 그대로 실습할 수 있습니다.
┌─────────────────────────────────────────────────────┐
│ study_net (172.30.0.0/24) │
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ server1 │ │ server2 │ │
│ │ 172.30.0.10 │◄──►│ 172.30.0.20 │ │
│ │ │ │ │ │
│ │ httpd / mariadb │ │ 클라이언트 역할 │ │
│ │ vsftpd / samba │ │ (samba, nfs, │ │
│ │ nfs / bind │ │ ftp 등 접속 │ │
│ │ postfix / ssh │ │ 연습용) │ │
│ └──────────────────┘ └──────────────────┘ │
│ SSH: 2201 SSH: 2202 │
│ HTTP: 8080 │
└─────────────────────────────────────────────────────┘
| 계정 | 비밀번호 | 권한 |
|---|---|---|
| root | toor | 관리자 |
| linux | linux | sudo 가능 (wheel 그룹) |
| user1 | user1 | 일반 사용자 (devteam 그룹) |
| user2 | user2 | 일반 사용자 (webteam 그룹) |
| user3 | user3 | 일반 사용자 |
- Docker Desktop (Mac/Windows) 또는 Docker Engine (Linux)
- Docker Compose v2 이상
- GNU Make
주의:
docker compose up을 직접 사용하지 마세요.
Docker Compose v5가cgroupns_mode속성을 거부하기 때문에 systemd가 정상 동작하지 않습니다.
반드시 아래make명령어를 사용하세요.
# 최초 빌드 (이미지 빌드, 5~10분 소요)
make build
# 컨테이너 시작 (빌드 후 또는 재시작 시)
make up
# 빌드 + 시작 한 번에
make rebuild
# 종료 (데이터 유지)
make down
# 완전 초기화 (볼륨·이미지·네트워크 모두 삭제, 연습 데이터 삭제됨)
make clean# ── 방법 1: SSH 접속 (실제 서버처럼) ──────────────────
make ssh1 # server1 (비밀번호: toor)
make ssh2 # server2 (비밀번호: toor)
# 또는 직접
ssh root@localhost -p 2201 # server1
ssh root@localhost -p 2202 # server2
# ── 방법 2: docker exec 직접 진입 ─────────────────────
make exec1 # server1 bash
make exec2 # server2 bash
# 또는 직접
docker exec -it linux-server1 bash
docker exec -it linux-server2 bash
# ── 로그 확인 ─────────────────────────────────────────
make logs # server1 로그 스트림| 서비스 | 패키지 | 기본 상태 |
|---|---|---|
| 웹 서버 | httpd, mod_ssl |
비활성 |
| 데이터베이스 | mariadb, mariadb-server |
비활성 |
| FTP 서버 | vsftpd |
비활성 |
| 파일 공유 (Windows) | samba, samba-client |
비활성 |
| 파일 공유 (Unix) | nfs-utils |
비활성 |
| DNS | bind, bind-utils |
비활성 |
| 메일 서버 | postfix |
비활성 |
| SSH | openssh-server |
활성 |
| 크론 | cronie, at |
활성 |
| 로그 | rsyslog, logrotate |
활성 |
| 방화벽 | firewalld, iptables |
비활성 |
| 수퍼 데몬 | xinetd |
비활성 |
대부분 서비스를 비활성 상태로 둔 이유:
systemctl enable/start실습 자체가 시험 항목이기 때문입니다.
| 분류 | 패키지 |
|---|---|
| 네트워크 | net-tools, iproute, nmap, tcpdump, bind-utils, telnet |
| 프로세스 | procps-ng, psmisc, lsof, sysstat, htop |
| 파일시스템 | lvm2, e2fsprogs, xfsprogs, parted, gdisk |
| 접근 제어 | quota, acl, attr |
| 개발 | gcc, make, python3, git |
| 기타 | vim, nano, wget, curl, tar, man, bash-completion |
# 시작
systemctl enable --now httpd
# 설정 파일
vi /etc/httpd/conf/httpd.conf
vi /etc/httpd/conf.d/vhost.conf # 가상 호스트
# 웹 루트
ls /var/www/html/
# 로그
tail -f /var/log/httpd/access_log
tail -f /var/log/httpd/error_log
# 확인 (호스트 머신 브라우저에서)
# http://localhost:8080# 시작 및 초기 보안 설정
systemctl enable --now mariadb
mysql_secure_installation
# 접속
mysql -u root -p
# 기본 실습
CREATE DATABASE testdb;
CREATE USER 'dbuser'@'localhost' IDENTIFIED BY 'pass';
GRANT ALL ON testdb.* TO 'dbuser'@'localhost';# 설정 파일
vi /etc/vsftpd/vsftpd.conf
# 주요 설정 항목
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
systemctl enable --now vsftpd
# server2에서 접속 테스트
ftp 172.30.0.10# 설정 파일
vi /etc/samba/smb.conf
# 공유 설정 예시 추가
[share]
path = /srv/samba/share
writable = yes
valid users = linux
# Samba 전용 비밀번호 설정
smbpasswd -a linux
systemctl enable --now smb nmb
# server2에서 접속 테스트
smbclient //172.30.0.10/share -U linux# 공유 디렉토리 생성
mkdir -p /srv/nfs/share
echo "/srv/nfs/share 172.30.0.0/24(rw,sync,no_root_squash)" >> /etc/exports
systemctl enable --now nfs-server
exportfs -arv
# server2에서 마운트 테스트
showmount -e 172.30.0.10
mount -t nfs 172.30.0.10:/srv/nfs/share /mnt# 설정 파일
vi /etc/named.conf
vi /etc/named.rfc1912.zones
# 정방향 존 파일 예시
vi /var/named/linux.local.zone
systemctl enable --now named
# 테스트
nslookup server1.linux.local 127.0.0.1
dig @127.0.0.1 server1.linux.local# firewalld
systemctl enable --now firewalld
firewall-cmd --add-service=http --permanent
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all
# iptables (직접 규칙)
systemctl enable --now iptables
iptables -L -n -v
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables-save > /etc/sysconfig/iptables# crontab 편집
crontab -e
# 예시: 매일 새벽 2시에 스크립트 실행
# 0 2 * * * /home/linux/backup.sh
# /etc/cron.d/ 에 시스템 크론 작성
vi /etc/cron.d/myjob
# at: 특정 시각에 1회 실행
at now + 5 minutes
at> echo "test" > /tmp/at_test.txt
at> Ctrl+D
atq # 대기 중인 작업 확인
atrm 1 # 작업 삭제# 사용자 생성
useradd -m -s /bin/bash testuser
passwd testuser
# 사용자 정보 수정
usermod -aG devteam testuser # 그룹 추가
usermod -L testuser # 계정 잠금
usermod -U testuser # 계정 잠금 해제
# 그룹 관리
groupadd newgroup
groupdel newgroup
gpasswd -a testuser newgroup
# 사용자 정보 확인
id testuser
cat /etc/passwd | grep testuser
cat /etc/shadow | grep testuser
cat /etc/group | grep testuser# 기본 권한
chmod 755 /srv/share
chown linux:devteam /srv/share
# ACL 설정 (quota, acl 패키지)
setfacl -m u:user1:rwx /srv/share
getfacl /srv/share
# 특수 권한
chmod u+s /usr/bin/program # setuid
chmod g+s /srv/share # setgid
chmod +t /tmp/sticky # sticky bit# 물리 볼륨 확인
pvdisplay
vgdisplay
lvdisplay
# LVM 생성 흐름
pvcreate /dev/sdb
vgcreate myvg /dev/sdb
lvcreate -L 1G -n mylv myvg
mkfs.ext4 /dev/myvg/mylv
mount /dev/myvg/mylv /mntserver2에서 server1의 서비스에 접근하는 실습:
# server2 진입
docker exec -it linux-server2 bash
# server1으로 SSH
ssh root@172.30.0.10
ssh root@server1.linux.local
# FTP 접속
ftp 172.30.0.10
# 웹 서버 접근
curl http://172.30.0.10
# DNS 조회
nslookup server1.linux.local 172.30.0.10
# NFS 마운트
mount -t nfs 172.30.0.10:/srv/nfs/share /mnt
# Samba 접속
smbclient //172.30.0.10/share -U linux# 시스템 로그 (systemd journal)
journalctl -xe
journalctl -u httpd -f # 특정 서비스 로그
# 전통적인 syslog
tail -f /var/log/messages
tail -f /var/log/secure # 인증 로그
tail -f /var/log/maillog # 메일 로그
# 서비스별
tail -f /var/log/httpd/access_log
tail -f /var/log/httpd/error_log
tail -f /var/log/mariadb/mariadb.log# 서비스 관리
systemctl start|stop|restart|reload <service>
systemctl enable|disable <service>
systemctl status <service>
systemctl list-units --type=service
# 패키지 관리 (dnf/rpm)
dnf install <package>
dnf remove <package>
dnf search <keyword>
dnf list installed
rpm -qa # 설치된 패키지 전체
rpm -qi <package> # 패키지 상세 정보
rpm -ql <package> # 패키지 파일 목록
rpm -qf /usr/bin/vim # 파일이 속한 패키지 확인
# 네트워크
ip addr show
ip route show
ss -tnlp # 열려 있는 포트 확인
netstat -tnlp # (net-tools)
# 프로세스
ps aux
ps -ef
top / htop
kill -9 <PID>
killall <process_name>
# 디스크
df -h
du -sh /var/log
fdisk -l
lsblklinux-master-docker/
├── Dockerfile # Rocky Linux 8 기반 이미지 정의
├── docker-compose.yml # 이미지 빌드 및 네트워크/볼륨 정의 (컨테이너 실행은 Makefile 사용)
├── Makefile # 빌드 · 시작 · 종료 · SSH 접속 단축 명령어
├── docs/
│ └── troubleshooting.md # 자주 발생하는 문제 해결 가이드
└── README.md # 이 문서
문제가 발생하면 docs/troubleshooting.md 를 참고하세요.
자주 발생하는 문제:
| 증상 | 원인 요약 | 문서 |
|---|---|---|
cgroupns_mode not allowed 오류 |
Docker Compose v5 스키마 제한 | #1 |
| SSH 연결이 즉시 끊김 | systemd가 cgroup 생성 실패 (freeze) | #2 |
| SSH 비밀번호 인증 실패 | shadow 권한·nsswitch·PAM 복합 문제 | #3 |
xinetd 설치 실패 |
Rocky Linux 9에서 패키지 제거됨 | #4 |
REMOTE HOST IDENTIFICATION HAS CHANGED |
이미지 재빌드 후 호스트키 변경 | #5 |
privileged: true모드로 실행되므로 호스트 시스템에 영향을 줄 수 있는 명령어 (예:rm -rf /, 커널 파라미터 변경)는 주의해서 사용하세요.- 컨테이너 내부에서 LVM 실습 시 실제 블록 디바이스가 없으므로 루프 디바이스(
losetup)를 활용하거나docker volume을 마운트해야 합니다. make down은 볼륨을 삭제하지 않아 연습 데이터가 유지됩니다. 완전 초기화는make clean을 사용하세요.docker compose up을 직접 실행하면 systemd가 cgroup을 생성하지 못해 SSH 접속이 불가능합니다. 반드시make up을 사용하세요.