Docker로 Nginx 설치하고 첫 웹서버 열어보기
드디어 실전이다.
지금까지 리눅스를 설치하고, Docker도 준비했다면
이제는 진짜 ‘서버’를 돌려볼 차례다.
이번 글에서는 Nginx(엔진엑스) 웹서버를 Docker로 설치하고,
브라우저에서 직접 접속해 “Welcome to nginx!” 페이지를 확인해본다.
📌 Nginx란? 왜 Apache가 아니라 Nginx인가?
Nginx는 가볍고 빠른 오픈소스 웹서버다.
정적 파일(HTML, 이미지 등)을 빠르게 제공하며,
리버스 프록시, 로드 밸런서 역할도 한다.
많은 기업의 실제 서버 환경에서도 Apache보다 Nginx를 선호한다.
👉 우리가 앞으로 워드프레스를 돌릴 때도,
Nginx가 앞단에서 웹 요청을 처리해줄 것이다.
Nginx vs Apache 비교
| 항목 | Nginx | Apache |
|---|---|---|
| 아키텍처 | 이벤트 기반 (비동기) | 프로세스 기반 (동기) |
| 메모리 사용 | 적음 (50MB 이하) | 많음 (200MB 이상) |
| 동시 접속 처리 | 매우 우수 (1만+ 동시 연결) | 제한적 (수백 개) |
| 정적 파일 속도 | 빠름 ⭐⭐⭐⭐⭐ | 보통 ⭐⭐⭐ |
| 설정 난이도 | 쉬움 (간결한 문법) | 복잡함 (.htaccess 등) |
| 홈서버 적합도 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
결론: 홈서버에는 Nginx 강력 추천!
🎯 이번 실습 목표
- Nginx 컨테이너 실행
- 브라우저로 웹서버 접속 확인
- 사용자 정의 HTML 페이지 서빙
- 컨테이너 로그 확인 및 관리
- 포트 변경 및 다중 웹서버 운영
🚀 Step 1: Nginx 컨테이너 기본 실행
명령어 실행
# Nginx 컨테이너 실행
docker run -d -p 8080:80 --name my-nginx nginx
명령어 옵션 상세 설명
| 옵션 | 의미 | 설명 |
|---|---|---|
-d | detached mode | 백그라운드 실행 (터미널 유지) |
-p 8080:80 | port mapping | 호스트 8080 → 컨테이너 80 |
--name my-nginx | container name | 컨테이너 이름 지정 (쉬운 관리) |
nginx | image name | Docker Hub 공식 이미지 |
실행 과정 이해하기
명령어 실행 시 일어나는 일:
- 이미지 확인
Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx - 자동 다운로드
a803e7c4b030: Pull complete 8b625c47d697: Pull complete 4d3239651a63: Pull complete ...약 50~100MB 다운로드 (인터넷 속도에 따라 1~2분)
- 컨테이너 생성 및 실행
8f3c49f0a30d3e1c9b...긴 ID가 출력되면 성공!
실행 확인
# 실행 중인 컨테이너 확인
docker ps
정상 출력 예시:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8f3c49f0a30d nginx "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 0.0.0.0:8080->80/tcp my-nginx
확인 포인트:
- STATUS가 “Up” 상태인가?
- PORTS에
0.0.0.0:8080->80/tcp표시되는가? - NAMES에 “my-nginx” 보이는가?
🌐 Step 2: 웹 브라우저로 접속
접속 방법 3가지
방법 1: localhost (서버 내부에서)
# 터미널에서 확인
curl http://localhost:8080
# 또는 브라우저에서
http://localhost:8080
방법 2: 내부 IP (같은 네트워크에서)
# 서버 IP 확인
ip addr show | grep "inet "
# 브라우저에서 접속
http://192.168.0.100:8080 # 내 서버 IP
방법 3: 외부 IP (인터넷에서 – 포트포워딩 필요)
- 공유기 포트포워딩 설정 필요 (나중에 다룸)
- 외부 IP 확인:
curl ifconfig.me
성공 화면
정상 접속 시 보이는 화면:
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.
Thank you for using nginx.
✅ 이 메시지가 떴다면 성공!
축하합니다! 내 홈서버에서 실제 웹서버가 작동 중입니다!
🎨 Step 3: 사용자 정의 HTML 페이지 만들기
기본 Nginx 페이지 대신 내가 만든 HTML을 띄워보자.
방법 1: 볼륨 마운트로 호스트 파일 사용
# 1. HTML 파일 생성
mkdir ~/my-website
cd ~/my-website
cat > index.html << 'EOF'
내 홈서버 %MINIFYHTML61dc14e46faab7507e4aefdc036cb2fa71f99f98b667269f7681af519d03547fdbc9eb2640780cbed89a5492bc81f928eada04d884780212a5ad2cf63c59bd9e37%
🏠 내 홈서버
Docker + Nginx로 만든 첫 웹사이트
서버 가동 시간:
%MINIFYHTML61dc14e46faab7507e4aefdc036cb2fa71f99f98b667269f7681af519d03547fdbc9eb2640780cbed89a5492bc81f928eada04d884780212a5ad2cf63c59bd9e6%%MINIFYHTML61dc14e46faab7507e4aefdc036cb2fa71f99f98b667269f7681af519d03547fdbc9eb2640780cbed89a5492bc81f928eada04d884780212a5ad2cf63c59bd9e7%%MINIFYHTML61dc14e46faab7507e4aefdc036cb2fa71f99f98b667269f7681af519d03547fdbc9eb2640780cbed89a5492bc81f928eada04d884780212a5ad2cf63c59bd9e8%%MINIFYHTML61dc14e46faab7507e4aefdc036cb2fa71f99f98b667269f7681af519d03547fdbc9eb2640780cbed89a5492bc81f928eada04d884780212a5ad2cf63c59bd9e9%%MINIFYHTML61dc14e46faab7507e4aefdc036cb2fa71f99f98b667269f7681af519d03547fdbc9eb2640780cbed89a5492bc81f928eada04d884780212a5ad2cf63c59bd9e10%%MINIFYHTML61dc14e46faab7507e4aefdc036cb2fa71f99f98b667269f7681af519d03547fdbc9eb2640780cbed89a5492bc81f928eada04d884780212a5ad2cf63c59bd9e11%%MINIFYHTML61dc14e46faab7507e4aefdc036cb2fa71f99f98b667269f7681af519d03547fdbc9eb2640780cbed89a5492bc81f928eada04d884780212a5ad2cf63c59bd9e12%%MINIFYHTML61dc14e46faab7507e4aefdc036cb2fa71f99f98b667269f7681af519d03547fdbc9eb2640780cbed89a5492bc81f928eada04d884780212a5ad2cf63c59bd9e13%%MINIFYHTML61dc14e46faab7507e4aefdc036cb2fa71f99f98b667269f7681af519d03547fdbc9eb2640780cbed89a5492bc81f928eada04d884780212a5ad2cf63c59bd9e14%%MINIFYHTML61dc14e46faab7507e4aefdc036cb2fa71f99f98b667269f7681af519d03547fdbc9eb2640780cbed89a5492bc81f928eada04d884780212a5ad2cf63c59bd9e15%%MINIFYHTML61dc14e46faab7507e4aefdc036cb2fa71f99f98b667269f7681af519d03547fdbc9eb2640780cbed89a5492bc81f928eada04d884780212a5ad2cf63c59bd9e16%
EOF
# 2. 기존 컨테이너 삭제
docker stop my-nginx
docker rm my-nginx
# 3. 볼륨 마운트로 새 컨테이너 실행
docker run -d -p 8080:80 --name my-nginx \
-v ~/my-website:/usr/share/nginx/html:ro \
nginx
옵션 설명:
-v ~/my-website:/usr/share/nginx/html: 호스트 폴더를 컨테이너에 마운트:ro: read-only (읽기 전용)
브라우저 새로고침하면 내가 만든 페이지가 보인다!
방법 2: 실시간 편집 가능하게 만들기
# read-only 제거 (쓰기 가능)
docker run -d -p 8080:80 --name my-nginx \
-v ~/my-website:/usr/share/nginx/html \
nginx
# 이제 ~/my-website/index.html 파일 수정하면
# 브라우저 새로고침만으로 바로 반영됨!
nano ~/my-website/index.html
📊 Step 4: 컨테이너 로그 및 상태 확인
1. 실시간 로그 보기
# 실시간 로그 (Ctrl+C로 종료)
docker logs -f my-nginx
접속 시 로그 예시:
192.168.0.50 - - [03/Nov/2025:10:30:15 +0000] "GET / HTTP/1.1" 200 615
192.168.0.50 - - [03/Nov/2025:10:30:16 +0000] "GET /favicon.ico HTTP/1.1" 404 153
2. 최근 로그 일부만 보기
# 최근 50줄
docker logs --tail 50 my-nginx
# 최근 10분간의 로그
docker logs --since 10m my-nginx
3. 컨테이너 리소스 사용량
# 실시간 모니터링
docker stats my-nginx
출력 예시:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O
8f3c49f0a30d my-nginx 0.02% 3.5MiB / 7.7GiB 0.04% 2.5kB / 1.8kB
4. 컨테이너 내부 접속
# 컨테이너 셸 접속
docker exec -it my-nginx bash
# 내부에서 명령어 실행 가능
root@8f3c49f0a30d:/# ls /usr/share/nginx/html
root@8f3c49f0a30d:/# cat /etc/nginx/nginx.conf
root@8f3c49f0a30d:/# exit
🔧 Step 5: 포트 변경 및 다중 웹서버 운영
시나리오: 여러 웹사이트 동시 운영
# 첫 번째 사이트 (8080 포트)
docker run -d -p 8080:80 --name site1 \
-v ~/website1:/usr/share/nginx/html nginx
# 두 번째 사이트 (8081 포트)
docker run -d -p 8081:80 --name site2 \
-v ~/website2:/usr/share/nginx/html nginx
# 세 번째 사이트 (8082 포트)
docker run -d -p 8082:80 --name site3 \
-v ~/website3:/usr/share/nginx/html nginx
# 확인
docker ps
접속:
http://localhost:8080→ 사이트1http://localhost:8081→ 사이트2http://localhost:8082→ 사이트3
포트 충돌 해결
문제:
Error response from daemon: driver failed programming external connectivity:
Bind for 0.0.0.0:8080 failed: port is already allocated
해결:
# 1. 어떤 프로세스가 포트 사용 중인지 확인
sudo lsof -i :8080
# 2. 기존 컨테이너 중지
docker stop 컨테이너ID
# 3. 다른 포트 사용
docker run -d -p 8090:80 --name my-nginx nginx
💡 포트번호 전략 – 왜 8080?
일반적인 포트 사용 현황
| 포트 | 용도 | 비고 |
|---|---|---|
| 80 | HTTP (기본 웹) | 루트 권한 필요, 공유기 기본 차단 |
| 443 | HTTPS (보안 웹) | SSL 인증서 필요 |
| 8080 | 대체 HTTP | ⭐ 가장 흔한 대안 |
| 8000-8090 | 개발/테스트 | 여러 서비스 운영 시 |
| 3000 | Node.js 앱 | 개발 서버 기본값 |
포트 선택 권장사항
- 로컬 테스트: 8080, 8000, 3000
- 실제 서비스: 80 (HTTP), 443 (HTTPS)
- 다중 서비스: 8080, 8081, 8082…
나중에 도메인 연결 시 80/443 포트로 전환할 예정!
🛠️ Step 6: 컨테이너 관리 명령어 모음
시작/중지/재시작
# 컨테이너 중지
docker stop my-nginx
# 컨테이너 시작
docker start my-nginx
# 컨테이너 재시작
docker restart my-nginx
# 강제 종료
docker kill my-nginx
삭제
# 컨테이너 삭제 (중지 상태에서만 가능)
docker rm my-nginx
# 실행 중인 컨테이너 강제 삭제
docker rm -f my-nginx
# 모든 중지된 컨테이너 삭제
docker container prune
상태 확인
# 실행 중인 컨테이너만
docker ps
# 모든 컨테이너 (중지된 것 포함)
docker ps -a
# 특정 컨테이너 상세 정보
docker inspect my-nginx
# 컨테이너 안의 프로세스
docker top my-nginx
⚠️ 자주 발생하는 문제 해결
문제 1: 브라우저 접속 안 됨
체크리스트:
# 1. 컨테이너 실행 확인
docker ps
# 2. 포트 맵핑 확인
docker port my-nginx
# 3. 서버 방화벽 확인
sudo ufw status
sudo ufw allow 8080
# 4. 로그 확인
docker logs my-nginx
문제 2: “Address already in use”
# 포트 사용 중인 프로세스 확인
sudo lsof -i :8080
# 종료 또는 다른 포트 사용
docker run -d -p 8888:80 --name my-nginx nginx
문제 3: 볼륨 마운트 권한 에러
# 폴더 권한 확인
ls -la ~/my-website
# 권한 수정
chmod 755 ~/my-website
chmod 644 ~/my-website/index.html
📝 정리하며
이번 글에서 배운 내용:
핵심 요약
- Docker 명령어 한 줄로 웹서버 실행 가능
- 브라우저로 내 서버 접속 → 실제 작동 확인
- 볼륨 마운트로 사용자 정의 HTML 서빙
- 컨테이너 로그와 리소스 모니터링
- 포트 설정만 잘하면 동시에 여러 앱도 운영 가능
실전 활용 팁
- 개발 환경: 8080 포트 + 볼륨 마운트 (실시간 편집)
- 테스트 환경: 여러 포트로 다중 사이트 운영
- 프로덕션: 80/443 포트 + 도메인 연결 (다음 단계)
다음 단계
이제 “서버가 돌아간다”는 걸 눈으로 확인했다.
그 다음은? 데이터 저장 공간, DB를 다룰 차례다.
다음 글에서는 Docker로 MySQL (또는 MariaDB)를 설치하고,
워드프레스를 위한 데이터베이스 환경을 준비해보자.
이제 퍼즐이 하나씩 맞춰지고 있다! 🧩
댓글 남기기