Docker로 Nginx 설치하고 첫 웹서버 열어보기

Docker로 Nginx 설치하고 첫 웹서버 열어보기

드디어 실전이다.
지금까지 리눅스를 설치하고, Docker도 준비했다면
이제는 진짜 ‘서버’를 돌려볼 차례다.

이번 글에서는 Nginx(엔진엑스) 웹서버를 Docker로 설치하고,
브라우저에서 직접 접속해 “Welcome to nginx!” 페이지를 확인해본다.

📌 Nginx란? 왜 Apache가 아니라 Nginx인가?

Nginx는 가볍고 빠른 오픈소스 웹서버다.
정적 파일(HTML, 이미지 등)을 빠르게 제공하며,
리버스 프록시, 로드 밸런서 역할도 한다.

많은 기업의 실제 서버 환경에서도 Apache보다 Nginx를 선호한다.

👉 우리가 앞으로 워드프레스를 돌릴 때도,
Nginx가 앞단에서 웹 요청을 처리해줄 것이다.

Nginx vs Apache 비교

항목NginxApache
아키텍처이벤트 기반 (비동기)프로세스 기반 (동기)
메모리 사용적음 (50MB 이하)많음 (200MB 이상)
동시 접속 처리매우 우수 (1만+ 동시 연결)제한적 (수백 개)
정적 파일 속도빠름 ⭐⭐⭐⭐⭐보통 ⭐⭐⭐
설정 난이도쉬움 (간결한 문법)복잡함 (.htaccess 등)
홈서버 적합도⭐⭐⭐⭐⭐⭐⭐⭐

결론: 홈서버에는 Nginx 강력 추천!

🎯 이번 실습 목표

  1. Nginx 컨테이너 실행
  2. 브라우저로 웹서버 접속 확인
  3. 사용자 정의 HTML 페이지 서빙
  4. 컨테이너 로그 확인 및 관리
  5. 포트 변경 및 다중 웹서버 운영

🚀 Step 1: Nginx 컨테이너 기본 실행

명령어 실행

# Nginx 컨테이너 실행
docker run -d -p 8080:80 --name my-nginx nginx

명령어 옵션 상세 설명

옵션의미설명
-ddetached mode백그라운드 실행 (터미널 유지)
-p 8080:80port mapping호스트 8080 → 컨테이너 80
--name my-nginxcontainer name컨테이너 이름 지정 (쉬운 관리)
nginximage nameDocker Hub 공식 이미지

실행 과정 이해하기

명령어 실행 시 일어나는 일:

  1. 이미지 확인
    Unable to find image 'nginx:latest' locally
    latest: Pulling from library/nginx
    
  2. 자동 다운로드
    a803e7c4b030: Pull complete
    8b625c47d697: Pull complete
    4d3239651a63: Pull complete
    ...

    약 50~100MB 다운로드 (인터넷 속도에 따라 1~2분)

  3. 컨테이너 생성 및 실행
    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 → 사이트1
  • http://localhost:8081 → 사이트2
  • http://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?

일반적인 포트 사용 현황

포트용도비고
80HTTP (기본 웹)루트 권한 필요, 공유기 기본 차단
443HTTPS (보안 웹)SSL 인증서 필요
8080대체 HTTP⭐ 가장 흔한 대안
8000-8090개발/테스트여러 서비스 운영 시
3000Node.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 서빙
  • 컨테이너 로그와 리소스 모니터링
  • 포트 설정만 잘하면 동시에 여러 앱도 운영 가능

실전 활용 팁

  1. 개발 환경: 8080 포트 + 볼륨 마운트 (실시간 편집)
  2. 테스트 환경: 여러 포트로 다중 사이트 운영
  3. 프로덕션: 80/443 포트 + 도메인 연결 (다음 단계)

다음 단계

이제 “서버가 돌아간다”는 걸 눈으로 확인했다.
그 다음은? 데이터 저장 공간, DB를 다룰 차례다.

다음 글에서는 Docker로 MySQL (또는 MariaDB)를 설치하고,
워드프레스를 위한 데이터베이스 환경
을 준비해보자.

이제 퍼즐이 하나씩 맞춰지고 있다! 🧩

댓글 남기기

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.