카테고리 없음

Docker(도커)를 활용한 웹 서버 컨테이너화 및 배포 기초 가이드

14722 2026. 8. 9. 20:46

웹사이트나 애플리케이션을 개발하다 보면 개발자의 컴퓨터에서는 정상적으로 실행되는데 실제 서버에 배포했을 때 문제가 발생하는 경우가 있습니다.

운영체제의 차이, 프로그램 버전, 설치된 라이브러리, 환경설정 등이 서로 다르기 때문입니다.

이런 문제를 줄이는 방법 중 하나가 바로 Docker(도커)를 이용한 컨테이너화입니다.

Docker를 사용하면 애플리케이션과 실행에 필요한 환경을 하나의 이미지로 구성하고, 이를 컨테이너로 실행할 수 있습니다. Docker 공식 문서에서도 컨테이너를 호스트 시스템과 격리된 프로세스로 설명하고 있으며, 자체 파일 시스템과 네트워크 등을 이용해 애플리케이션을 독립적으로 실행할 수 있도록 합니다.

이번 글에서는 Docker를 처음 접하는 분들을 위해 웹 애플리케이션을 컨테이너로 만드는 기본 개념부터 Dockerfile 작성, 이미지 생성, 컨테이너 실행, Docker Compose를 이용한 관리와 서버 배포 과정까지 순서대로 알아보겠습니다.

1. Docker란 무엇인가?

Docker를 쉽게 설명하면 프로그램을 실행하는 데 필요한 환경을 통째로 포장해서 어디서든 비슷한 방식으로 실행할 수 있도록 도와주는 도구라고 생각하면 됩니다.

예를 들어 웹사이트를 만들었다고 가정해보겠습니다.

개발자의 컴퓨터에는 특정 버전의 Python과 라이브러리가 설치되어 있습니다. 그런데 서버에는 다른 버전이 설치되어 있다면 프로그램이 정상적으로 실행되지 않을 수 있습니다.

Docker에서는 애플리케이션 실행에 필요한 환경을 이미지로 만들고, 그 이미지를 이용해 컨테이너를 실행할 수 있습니다.

여기서 세 가지 개념을 먼저 이해하면 좋습니다.

이미지(Image)는 컨테이너를 만들기 위한 실행 환경의 설계도와 비슷합니다.

컨테이너(Container)는 이미지를 실제로 실행한 것입니다.

Dockerfile은 이미지를 어떻게 만들 것인지 작성하는 설정 파일입니다.

즉,

Dockerfile → 이미지 → 컨테이너

순서로 이해하면 쉽습니다.

2. 컨테이너와 가상머신은 무엇이 다를까?

Docker를 처음 접하면 가상머신과 비슷하다고 생각하기 쉽습니다.

하지만 둘은 같은 개념은 아닙니다.

가상머신은 하나의 물리 서버 안에서 별도의 운영체제를 실행하는 방식입니다.

반면 Docker 컨테이너는 호스트 운영체제의 커널을 공유하면서 애플리케이션을 격리된 환경에서 실행합니다.

따라서 일반적으로 컨테이너는 가상머신보다 가볍게 실행할 수 있고, 필요한 애플리케이션을 빠르게 배포하는 데 활용할 수 있습니다.

물론 컨테이너가 가상머신을 완전히 대체한다는 의미는 아닙니다. 프로젝트의 보안 요구사항과 운영 환경에 따라 적절한 방식을 선택해야 합니다.

3. Docker 설치하기

실제 서버에 Docker를 설치하기 전에 사용하는 운영체제와 Docker 공식 설치 방법을 확인하는 것이 좋습니다.

Ubuntu 같은 리눅스 서버를 사용하는 경우 Docker Engine을 설치해 사용할 수 있습니다.

설치가 끝난 후에는 다음 명령으로 Docker가 정상적으로 설치되었는지 확인할 수 있습니다.

docker --version

Docker Compose를 사용할 수 있는 환경이라면 다음 명령도 확인합니다.

docker compose version

현재 Docker에서는 Compose를 이용해 여러 컨테이너로 구성된 애플리케이션을 하나의 YAML 파일로 정의하고 관리할 수 있습니다.

4. 가장 먼저 컨테이너 실행해보기

Docker가 정상적으로 설치되었다면 간단한 컨테이너를 실행해볼 수 있습니다.

docker run hello-world

docker run 명령은 지정한 이미지를 이용해 새로운 컨테이너를 만들고 실행합니다. 이미지가 로컬에 없다면 Docker가 필요한 이미지를 가져온 후 실행할 수 있습니다.

이 과정을 통해 Docker가 정상적으로 작동하는지 확인할 수 있습니다.

5. Nginx 웹서버를 Docker로 실행하기

이번에는 실제 웹서버를 컨테이너로 실행해보겠습니다.

Nginx 이미지를 이용하면 간단한 웹서버를 실행할 수 있습니다.

docker run -d -p 8080:80 --name my-nginx nginx

각 옵션은 다음과 같은 의미를 가지고 있습니다.

-d는 백그라운드에서 컨테이너를 실행한다는 뜻입니다.

-p 8080:80은 서버의 8080번 포트를 컨테이너의 80번 포트와 연결합니다.

--name my-nginx는 컨테이너 이름을 지정합니다.

마지막의 nginx는 사용할 이미지입니다.

이제 웹브라우저에서 다음 주소로 접속할 수 있습니다.

http://서버IP:8080

Nginx 기본 페이지가 나타난다면 컨테이너 웹서버가 정상적으로 실행되고 있는 것입니다.

6. Dockerfile로 나만의 웹 애플리케이션 만들기

실제 프로젝트에서는 이미 만들어진 이미지를 사용하는 것뿐만 아니라 직접 이미지를 만들어야 하는 경우가 많습니다.

이때 사용하는 것이 Dockerfile입니다.

예를 들어 간단한 Nginx 웹사이트를 구성한다고 가정해보겠습니다.

프로젝트 폴더를 만들고 HTML 파일을 준비합니다.

mkdir my-web
cd my-web

다음으로 index.html 파일을 만듭니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Docker 웹사이트</title>
</head>
<body>
    <h1>Docker 웹서버 테스트</h1>
    <p>컨테이너에서 실행되는 웹페이지입니다.</p>
</body>
</html>

그리고 같은 폴더에 Dockerfile을 생성합니다.

FROM nginx:alpine

COPY index.html /usr/share/nginx/html/index.html

첫 번째 줄은 Nginx 이미지를 기반으로 새로운 이미지를 만들겠다는 의미입니다.

두 번째 줄은 우리가 만든 HTML 파일을 Nginx의 웹페이지 폴더로 복사합니다.

Docker 공식 학습 자료에서도 Dockerfile을 작성하고 이를 이용해 사용자 애플리케이션 이미지를 만드는 과정을 기본 학습 단계로 안내하고 있습니다.

7. Docker 이미지 만들기

Dockerfile을 작성했다면 이미지를 만들어야 합니다.

docker build -t my-web:1.0 .

여기에서 -t는 이미지 이름과 태그를 지정하는 옵션입니다.

마지막의 .은 현재 폴더를 빌드에 사용할 컨텍스트로 지정한다는 의미입니다.

이미지가 만들어졌는지 확인하려면 다음 명령을 실행합니다.

docker images

목록에 my-web이 나타난다면 이미지 생성이 완료된 것입니다.

8. 내가 만든 이미지로 컨테이너 실행하기

이제 방금 만든 이미지를 이용해 컨테이너를 실행합니다.

docker run -d -p 8080:80 --name my-web-container my-web:1.0

브라우저에서 서버 주소의 8080번 포트로 접속합니다.

http://서버IP:8080

작성한 HTML 페이지가 나타나면 Docker 이미지 생성부터 컨테이너 실행까지 정상적으로 완료된 것입니다.

9. 실행 중인 컨테이너 확인하기

현재 실행 중인 컨테이너는 다음 명령으로 확인할 수 있습니다.

docker ps

중지된 컨테이너까지 확인하려면 다음 명령을 사용합니다.

docker ps -a

컨테이너의 로그를 확인할 때는 다음 명령을 사용할 수 있습니다.

docker logs my-web-container

웹사이트에 문제가 발생했을 때 로그를 확인하는 습관은 서버 운영에서 매우 중요합니다.

10. Docker Compose를 활용하면 관리가 쉬워진다

웹서비스가 커지면 컨테이너 하나만 사용하는 경우보다 여러 서비스를 함께 사용하는 경우가 많습니다.

예를 들어 다음과 같은 구조를 생각할 수 있습니다.

  • Nginx 웹서버
  • 애플리케이션 서버
  • MySQL 데이터베이스
  • Redis 캐시 서버

이처럼 여러 컨테이너를 각각 명령어로 관리하면 점점 복잡해집니다.

이때 사용할 수 있는 것이 Docker Compose입니다.

Docker Compose에서는 여러 서비스를 하나의 compose.yaml 파일에 정의하고 함께 실행할 수 있습니다. Docker 공식 문서에서도 Compose를 여러 컨테이너 애플리케이션을 정의하고 실행하는 도구로 설명하고 있습니다.

11. 간단한 compose.yaml 작성하기

예를 들어 Nginx 웹서버를 Compose로 실행한다면 다음과 같이 작성할 수 있습니다.

services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"

파일 이름은 compose.yaml로 저장합니다.

그리고 다음 명령을 실행합니다.

docker compose up -d

이 명령으로 서비스를 백그라운드에서 실행할 수 있습니다.

Docker 공식 문서에서도 docker compose up -d를 이용해 Compose로 정의된 서비스를 백그라운드에서 실행하는 방법을 안내하고 있습니다.

실행 상태는 다음 명령으로 확인할 수 있습니다.

docker compose ps

로그는 다음과 같이 확인할 수 있습니다.

docker compose logs -f

서비스를 중지하고 정리하려면 다음 명령을 사용할 수 있습니다.

docker compose down

12. 실제 서버에 배포할 때 주의할 점

Docker를 이용하면 개발 환경과 서버 환경을 비슷하게 구성하기 쉽지만, 컨테이너를 실행하는 것만으로 배포가 끝나는 것은 아닙니다.

실제 운영 환경에서는 몇 가지를 추가로 고려해야 합니다.

첫째, 중요한 데이터를 컨테이너 내부에만 저장하지 않는 것이 좋습니다.

컨테이너가 삭제되고 다시 만들어질 수 있기 때문에 데이터베이스와 같은 중요한 데이터는 볼륨 등을 이용해 별도로 보존해야 합니다.

둘째, 비밀번호와 API 키 같은 민감한 정보를 Dockerfile에 직접 기록하지 않는 것이 좋습니다.

셋째, 사용하지 않는 포트를 외부에 공개하지 않아야 합니다.

넷째, 사용하는 이미지와 패키지를 최신 보안 상태로 관리해야 합니다.

다섯째, 웹서비스라면 HTTPS 적용도 함께 고려해야 합니다.

13. Docker 배포의 기본 흐름

지금까지의 내용을 실제 프로젝트 흐름으로 정리하면 다음과 같습니다.

1단계

웹 애플리케이션을 개발합니다.

2단계

Dockerfile을 작성합니다.

3단계

Docker 이미지를 생성합니다.

4단계

이미지를 이용해 컨테이너를 실행합니다.

5단계

필요한 경우 Docker Compose로 여러 서비스를 구성합니다.

6단계

서버에 이미지를 배포하고 컨테이너를 실행합니다.

7단계

로그와 상태를 확인하면서 서비스를 관리합니다.

이 과정을 반복하면 개발 환경에서 만든 애플리케이션을 서버 환경으로 옮기는 작업을 보다 일관되게 관리할 수 있습니다.

마무리

Docker는 처음 접하면 이미지, 컨테이너, Dockerfile, Compose 같은 새로운 용어 때문에 어렵게 느껴질 수 있습니다.

하지만 핵심 개념은 생각보다 간단합니다.

Dockerfile은 이미지를 만드는 방법이고, 이미지는 컨테이너를 만들기 위한 실행 환경이며, 컨테이너는 실제로 실행되는 프로그램입니다.

그리고 애플리케이션에 여러 서비스가 필요하다면 Docker Compose를 이용해 웹서버, 데이터베이스, 애플리케이션 등을 하나의 구성 파일로 관리할 수 있습니다.

Docker의 가장 큰 장점은 단순히 웹서버를 실행하는 데 있는 것이 아닙니다.

개발 환경과 서버 환경의 차이를 줄이고, 애플리케이션을 일정한 형태로 배포하고 관리할 수 있다는 점에서 의미가 있습니다.

처음 Docker를 공부한다면 복잡한 프로젝트부터 시작하기보다는 Nginx 컨테이너 실행 → Dockerfile 작성 → 이미지 생성 → 직접 만든 컨테이너 실행 → Docker Compose 사용 순서로 하나씩 경험해보는 것을 추천합니다.

이 과정을 익혀두면 이후에는 Node.js, Python, PHP 같은 애플리케이션 서버와 MySQL 같은 데이터베이스를 함께 구성하는 방법으로 자연스럽게 확장할 수 있습니다.