가장 먼저, Docker Hub에 이미 만들어져 있는 공식 Nginx 이미지를 사용해서 웹 서버를 실행해보겠습니다.
터미널을 열고 아래 명령어를 입력해 주세요.
docker run --name my-nginx -d -p 8080:80 nginx
명령어가 조금 길어졌지만, 하나씩 뜯어보면 어렵지 않습니다.
docker run: 1편에서 배운 것처럼 컨테이너를 생성하고 실행하는 명령어입니다.
--name my-nginx: 컨테이너에 my-nginx라는 이름을 붙여줍니다. 이름을 지정해두면 나중에 관리하기가 편합니다.
-d:
detached mode
의 약자로, 컨테이너를 백그라운드에서 실행하라는 의미입니다. 이 옵션이 없으면 터미널이 컨테이너에 계속 붙어있게 되어 다른 작업을 할 수 없습니다. 마치 스마트폰에서 음악을 튼 채로 다른 앱을 쓰는 것과 같습니다.
-p 8080:80:
port mapping
설정입니다. 컨테이너는 격리된 공간이라서 외부에서 직접 접근할 수 없습니다. 이 옵션은 내 컴퓨터(Host)의 8080번 문(포트)과 컨테이너의 80번 문(포트)을 연결해주는 역할을 합니다. 즉, 내 컴퓨터의 8080 포트로 오는 요청을 컨테이너의 80 포트로 전달해줍니다.
nginx: 실행할 이미지의 이름입니다.
명령어를 실행했다면, 웹 브라우저를 열고 주소창에 http://localhost:8080 이라고 입력해보세요.
"Welcome to nginx!" 라는 문구가 보인다면 성공적으로 Nginx 웹 서버를 컨테이너로 띄운 것입니다.
먼저 컴퓨터에 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>
컨테이너는 격리된 공간이라고 했습니다.
그렇다면 방금 만든 index.html 파일을 어떻게 컨테이너 안으로 전달할 수 있을까요?
이때 사용하는 기술이 바로
볼륨 마운트
입니다.
볼륨 마운트는 내 컴퓨터의 특정 폴더와 컨테이너 안의 특정 폴더를 실시간으로 연결해주는 기능입니다.
기존에 실행했던 my-nginx 컨테이너는 중지하고 삭제한 뒤 (docker stop my-nginx, docker rm my-nginx), 다음 명령어를 실행해봅시다.
my-nginx 컨테이너 중지 및 삭제
docker stop my-nginxdocker 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 옵션이 바로 볼륨 마운트 설정입니다.
-v [내 컴퓨터의 폴더 경로]:[컨테이너 안의 폴더 경로] 형식으로 사용합니다.
/Users/promlee/Documents/my-nginx-page: 방금 만든 index.html 파일이 있는 내 컴퓨터의
절대 경로
입니다. 경로는 각자 환경에 맞게 수정해야 합니다. (윈도우에서는 C:\Users\YourUser\my-nginx-page 와 같은 형태가 됩니다.)
/usr/share/nginx/html: 공식 Nginx 이미지가 기본적으로 웹 페이지 파일을 찾아 읽는 컨테이너 내부의 약속된 경로입니다.
이제 다시 브라우저에서 http://localhost:8080 으로 접속해보세요.
이번에는 "Welcome to nginx!" 대신 우리가 직접 만든 "Hello! This is my webpage created with Docker." 메시지가 보일 것입니다.
아까 만들었던 my-nginx-page 폴더 안에, Dockerfile이라는 이름으로 새 파일을 만듭니다. (확장자는 없습니다)
그리고 아래 내용을 그대로 입력하고 저장해주세요.
# 1. 베이스가 될 이미지를 선택합니다. (공식 Nginx 이미지)FROM nginx # 2. 내 컴퓨터의 파일을 컨테이너 안으로 복사합니다. # COPY [복사할 파일 경로] [컨테이너에 복사될 경로]COPY ./index.html /usr/share/nginx/html/index.html
FROM nginx: 어떤 이미지를 기반으로 새로운 이미지를 만들지 정합니다. 우리는 Nginx를 기반으로 할 것입니다.
COPY ./index.html ...: 내 컴퓨터의 현재 폴더(.은 현재 폴더를 의미)에 있는 index.html 파일을 컨테이너의 /usr/share/nginx/html/ 폴더 안으로 복사하라는 명령어입니다.
이제 이 Dockerfile 설계도를 이용해 실제 이미지를 만들어보겠습니다.
터미널에서 my-nginx-page 폴더로 이동한 뒤, 아래 명령어를 실행합니다.
docker build -t my-custom-nginx .
docker build: Dockerfile로 이미지를 만드는 명령어입니다.
-t my-custom-nginx: -t는 태그(tag)의 약자로, 새로 만들 이미지에 my-custom-nginx 라는 이름을 붙여줍니다.
.: Dockerfile이 있는 위치(현재 폴더)를 알려줍니다. 마지막에 점을 빠뜨리지 않도록 주의해야 합니다.
빌드가 완료되면 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 이미지만 있으면 어디서든 똑같은 웹 서버를 실행할 수 있습니다.
오늘은 Docker를 이용해 실제 Nginx 웹 서버를 실행하는 실습을 진행했습니다.
단순히 공식 이미지를 실행하는 것에서 시작해, -p 옵션으로
포트 매핑
을 하여 외부에서 컨테이너에 접속하는 법을 배웠습니다.
또한 -v 옵션으로
볼륨 마운트
를 하여 내 컴퓨터의 파일을 컨테이너와 실시간으로 공유하는 방법도 알아보았습니다.
이를 통해 우리는 재사용 가능하고 어디서든 동일하게 동작하는 애플리케이션 패키지를 만들 수 있게 되었습니다.
지금까지는 하나의 컨테이너만 다루었지만, 실제 서비스는 웹 서버, API 서버, 데이터베이스 등 여러 컨테이너가 함께 동작합니다.
다음 시간에는 여러 개의 컨테이너를 연결하고, Docker Compose를 이용해 이들을 한 번에 관리하는 방법을 배워보겠습니다.