PromleeBlog
sitemap
aboutMe

posting thumbnail
Docker 실습 Nginx 웹 서버 띄우기 - DevOps 컨테이너에서 클러스터까지 2편
Docker Hands-on Deploying an Nginx Web Server - DevOps from Containers to Clusters Part 2

📅

들어가기 전에 🔗

지난 시간에는 Docker의 기본 개념을 배우고, hello-world 컨테이너를 실행해보았습니다.
화면에 메시지를 출력하는 간단한 작업이었지만, Docker의 작동 원리를 이해하는 좋은 시작이었습니다.
이제 한 걸음 더 나아가, 단순히 메시지를 출력하는 것을 넘어
실제로 동작하는 웹 서버
를 컨테이너로 직접 띄워보겠습니다.
이번 시간에는 가장 인기 있는 웹 서버 중 하나인 Nginx를 Docker를 이용해 실행하는 방법을 알아봅니다.
이 과정에서 컨테이너의 핵심 기능인
포트 매핑
볼륨 마운트
에 대해 배우고, 마지막에는 우리가 직접 만든 웹 페이지를 담은
나만의 Nginx 이미지
를 만들어보는 실습까지 진행하겠습니다.

Nginx 공식 이미지로 웹 서버 띄우기 🔗

가장 먼저, Docker Hub에 이미 만들어져 있는 공식 Nginx 이미지를 사용해서 웹 서버를 실행해보겠습니다.
터미널을 열고 아래 명령어를 입력해 주세요.
docker run --name my-nginx -d -p 8080:80 nginx
명령어가 조금 길어졌지만, 하나씩 뜯어보면 어렵지 않습니다.
명령어를 실행했다면, 웹 브라우저를 열고 주소창에 http://localhost:8080 이라고 입력해보세요.
"Welcome to nginx!" 라는 문구가 보인다면 성공적으로 Nginx 웹 서버를 컨테이너로 띄운 것입니다.
Nginx 웹 서버 실행 성공
Nginx 웹 서버 실행 성공

정적 웹페이지 직접 서빙하기 🔗

기본 Nginx 페이지를 봤으니, 이제 우리가 직접 만든 HTML 파일을 웹 서버에 올려보겠습니다.

1. 나만의 웹페이지 만들기 🔗

먼저 컴퓨터에 my-nginx-page 라는 이름의 폴더를 하나 만듭니다.
그리고 그 안에 index.html 파일을 만들고, 아래와 같이 간단한 내용을 작성해 저장해주세요.
/Users/promlee/Documents/my-nginx-page/index.html
<!DOCTYPE html>
<html>
<head>
<title>My Webpage</title>
</head>
<body>
<h1>Hello! This is my webpage created with Docker.</h1>
<p>Isn't it cool?</p>
</body>
</html>

2. 볼륨 마운트로 내 파일 연결하기 🔗

컨테이너는 격리된 공간이라고 했습니다.
그렇다면 방금 만든 index.html 파일을 어떻게 컨테이너 안으로 전달할 수 있을까요?
이때 사용하는 기술이 바로
볼륨 마운트
입니다.
볼륨 마운트는 내 컴퓨터의 특정 폴더와 컨테이너 안의 특정 폴더를 실시간으로 연결해주는 기능입니다.
기존에 실행했던 my-nginx 컨테이너는 중지하고 삭제한 뒤 (docker stop my-nginx, docker rm my-nginx), 다음 명령어를 실행해봅시다.
my-nginx 컨테이너 중지 및 삭제
docker stop my-nginx
docker rm my-nginx
이제 다시 Nginx 컨테이너를 실행하는데, 이번에는 방금 만든 index.html 파일을 컨테이너와 연결해보겠습니다.
docker run --name my-nginx-vol -d -p 8080:80 -v /Users/promlee/Documents/my-nginx-page:/usr/share/nginx/html nginx
여기서 -v 옵션이 바로 볼륨 마운트 설정입니다.
이제 다시 브라우저에서 http://localhost:8080 으로 접속해보세요.
이번에는 "Welcome to nginx!" 대신 우리가 직접 만든 "Hello! This is my webpage created with Docker." 메시지가 보일 것입니다.
나만의 웹페이지가 보이는 화면
나만의 웹페이지가 보이는 화면

나만의 이미지 만들기: Dockerfile 🔗

볼륨 마운트는 개발할 때는 아주 편리하지만, 다른 사람에게 전달할 때는 내 컴퓨터의 파일까지 함께 전달해야 하는 번거로움이 있습니다.
만약 우리만의 index.html 파일이 처음부터 포함된 Nginx 이미지를 만들 수 있다면 어떨까요?
이때 사용하는 것이 바로
Dockerfile
입니다.

Dockerfile이란 무엇일까요? 🔗

Dockerfile은 나만의 이미지를 만들기 위한
설계도 또는 레시피
입니다.
어떤 재료(기반 이미지)를 가지고, 어떤 순서로 조리(명령어 실행, 파일 복사 등)해서 최종 결과물(새로운 이미지)을 만들지 적어놓은 텍스트 파일입니다.

Dockerfile 작성하기 🔗

아까 만들었던 my-nginx-page 폴더 안에, Dockerfile이라는 이름으로 새 파일을 만듭니다. (확장자는 없습니다)
그리고 아래 내용을 그대로 입력하고 저장해주세요.
 # 1. 베이스가 될 이미지를 선택합니다. (공식 Nginx 이미지)
FROM nginx
 
 # 2. 내 컴퓨터의 파일을 컨테이너 안으로 복사합니다.
 # COPY [복사할 파일 경로] [컨테이너에 복사될 경로]
COPY ./index.html /usr/share/nginx/html/index.html

이미지 빌드하고 실행하기 🔗

이제 이 Dockerfile 설계도를 이용해 실제 이미지를 만들어보겠습니다.
터미널에서 my-nginx-page 폴더로 이동한 뒤, 아래 명령어를 실행합니다.
docker build -t my-custom-nginx .
빌드가 완료되면 docker images 명령어로 my-custom-nginx 이미지가 생성된 것을 확인해보세요.
이제 이 이미지로 컨테이너를 실행해봅시다.
docker run --name my-final-nginx -d -p 8080:80 my-custom-nginx
이미지 빌드 - 확인 - 실행
이미지 빌드 - 확인 - 실행
볼륨 마운트를 위한 -v 옵션이 없는데도 http://localhost:8080에 접속하면 우리가 만든 페이지가 잘 보일 것입니다.
왜냐하면 index.html 파일이 이미 이미지 안에 구워져 있기 때문입니다. 이제 이 my-custom-nginx 이미지만 있으면 어디서든 똑같은 웹 서버를 실행할 수 있습니다.

문제해결 🔗

403 Forbidden 오류 🔗

만약 웹 페이지에 접속했을 때 "403 Forbidden" 오류가 발생한다면 컨테이너 내부의 파일 권한 문제일 수 있습니다.
이를 해결하기 위한 두 가지 방법이 있습니다.

1. Dockerfile에서 권한을 변경하는 방법 🔗

 # Dockerfile 가장 아랫줄에 추가
RUN chmod 644 /usr/share/nginx/html/index.html
이렇게 RUN 명령어를 사용하여 파일의 권한을 변경해줄 수 있습니다.

2. docker run 명령어에서 권한을 변경하는 방법 🔗

docker run --name my-nginx-vol -d -p 8080:80 -v /Users/promlee/Documents/my-nginx-page:/usr/share/nginx/html:ro nginx
이렇게 :ro 옵션을 추가하여 읽기 전용 모드로 마운트할 수 있습니다. 이 경우 컨테이너 내부에서 파일을 수정할 수는 없지만, 읽기 권한은 유지됩니다.
이 두 가지 방법 중 하나를 선택하여 문제를 해결할 수 있습니다.

결론 🔗

오늘은 Docker를 이용해 실제 Nginx 웹 서버를 실행하는 실습을 진행했습니다.
단순히 공식 이미지를 실행하는 것에서 시작해, -p 옵션으로
포트 매핑
을 하여 외부에서 컨테이너에 접속하는 법을 배웠습니다.
또한 -v 옵션으로
볼륨 마운트
를 하여 내 컴퓨터의 파일을 컨테이너와 실시간으로 공유하는 방법도 알아보았습니다.
이를 통해 우리는 재사용 가능하고 어디서든 동일하게 동작하는 애플리케이션 패키지를 만들 수 있게 되었습니다.
지금까지는 하나의 컨테이너만 다루었지만, 실제 서비스는 웹 서버, API 서버, 데이터베이스 등 여러 컨테이너가 함께 동작합니다.
다음 시간에는 여러 개의 컨테이너를 연결하고, Docker Compose를 이용해 이들을 한 번에 관리하는 방법을 배워보겠습니다.

참고 🔗