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를 이용해 이들을 한 번에 관리하는 방법을 배워보겠습니다.

참고 🔗