Docker 를 이용한 웹 서버 배포 방법

DockerBeginner
지금 연습하기

소개

Docker 는 애플리케이션 배포 및 관리를 간소화하는 널리 사용되는 컨테이너화 플랫폼입니다. 이 튜토리얼에서는 컨테이너화의 이점을 탐색하고 Docker 개발 환경을 설정하는 방법을 배우면서 Docker 를 사용하여 웹 서버를 배포하는 방법을 배웁니다.

Docker 이해

Docker 란 무엇인가?

Docker 는 개발자가 컨테이너 환경에서 애플리케이션을 구축, 배포 및 실행할 수 있도록 하는 오픈소스 플랫폼입니다. 컨테이너는 애플리케이션 실행에 필요한 코드, 런타임, 시스템 도구 및 라이브러리 등 모든 것을 포함하는 경량의 독립 실행형 실행 가능 패키지입니다. Docker 는 애플리케이션을 패키징하고 배포하는 일관되고 안정적인 방법을 제공하여 소프트웨어 개발, 테스트 및 배포를 더욱 용이하게 합니다.

Docker 사용의 이점

  1. 일관된 환경: Docker 컨테이너는 기본 인프라에 관계없이 애플리케이션이 동일한 방식으로 실행되도록 보장하여 일관되고 안정적인 개발 및 배포 환경을 제공합니다.
  2. 증가된 효율성: Docker 컨테이너는 경량이며 빠르게 시작 및 중지할 수 있으므로 기존 가상 머신에 비해 시스템 리소스를 더 효율적으로 사용할 수 있습니다.
  3. 향상된 확장성: Docker 는 필요에 따라 애플리케이션을 확장하거나 축소하기 쉽게 여러 컨테이너를 생성 및 관리할 수 있도록 합니다.
  4. 향상된 이식성: Docker 컨테이너는 다양한 플랫폼 및 환경에서 쉽게 공유 및 배포할 수 있으므로 개발, 테스트 및 프로덕션 환경 간에 애플리케이션을 쉽게 이동할 수 있습니다.

Docker 아키텍처

Docker 아키텍처는 다음과 같은 주요 구성 요소로 구성됩니다.

  1. Docker 클라이언트: Docker 데몬과 상호 작용할 수 있도록 하는 사용자 인터페이스입니다.
  2. Docker 데몬: 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리하는 백그라운드 프로세스입니다.
  3. Docker 이미지: 애플리케이션 실행에 필요한 코드, 런타임, 시스템 도구, 라이브러리 및 종속성을 포함하는 변경 불가능한 파일입니다.
  4. Docker 컨테이너: Docker 이미지의 실행 가능한 인스턴스로, 고유한 파일 시스템, 네트워크 및 프로세스 공간을 갖습니다.
  5. Docker 레지스트리: Docker 이미지를 저장하고 배포하는 저장소입니다.
graph TD A[Docker 클라이언트] --> B[Docker 데몬] B --> C[Docker 이미지] B --> D[Docker 컨테이너] B --> E[Docker 레지스트리]

Docker 시작하기

Docker 를 시작하려면 시스템에 Docker 엔진을 설치해야 합니다. 설치 과정은 운영 체제에 따라 다르지만 일반적으로 공식 Docker 웹사이트에서 지침을 찾을 수 있습니다.

Docker 를 설치한 후에는 애플리케이션을 구축하고 실행하는 데 사용할 수 있습니다. 여기에는 Docker 를 사용하여 Nginx 웹 서버를 실행하는 간단한 예가 있습니다.

## Docker 레지스트리에서 Nginx 이미지를 가져옵니다.
docker pull nginx

## Nginx 컨테이너를 실행합니다.
docker run -d -p 80:80 --name my-nginx nginx

이 명령은 Docker 레지스트리에서 Nginx 이미지를 가져온 다음 해당 이미지를 기반으로 새 컨테이너를 실행하고 호스트의 포트 80 을 컨테이너의 포트 80 으로 노출합니다.

Docker 개발 환경 설정

Docker 설치

Docker 개발 환경을 설정하려면 먼저 시스템에 Docker 엔진을 설치해야 합니다. Ubuntu 22.04 에서 설치하는 방법은 다음과 같습니다.

## 패키지 인덱스 업데이트
sudo apt-get update

## apt가 HTTPS를 통해 리포지토리를 사용할 수 있도록 패키지 설치
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

## Docker 공식 GPG 키 추가
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

## Docker 리포지토리 설정
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

## Docker Engine, containerd 및 Docker Compose 설치
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

개발용 Docker 설정

Docker 설치 후 개발 환경에 맞게 설정할 수 있습니다. 일반적인 설정은 다음과 같습니다.

  1. 볼륨 마운팅: 호스트 시스템의 디렉토리들을 Docker 컨테이너에 마운팅하여 파일 및 데이터를 공유합니다.
  2. 네트워킹: 컨테이너들이 서로 및 호스트 시스템과 통신할 수 있도록 Docker 네트워크를 설정합니다.
  3. 환경 변수: 애플리케이션을 구성하기 위해 Docker 컨테이너에 환경 변수를 전달합니다.
  4. 빌드 인수: 이미지를 커스터마이즈하기 위해 Docker 빌드 프로세스에 빌드 타임 인수를 전달합니다.

다음은 이러한 설정을 보여주는 Docker Compose 파일의 예입니다.

version: "3"
services:
  web:
    build:
      context: .
      args:
        - ENV=development
    ports:
      - 8080:80
    volumes:
      - ./app:/var/www/html
    environment:
      - DB_HOST=database
  database:
    image: mysql:5.7
    volumes:
      - db-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=secret
volumes:
  db-data:

이 Docker Compose 파일은 웹 서비스와 데이터베이스 서비스를 설정하며 다음과 같은 구성을 갖습니다.

  • 웹 서비스는 로컬 Dockerfile 에서 ENV=development라는 빌드 타임 인수를 사용하여 구축됩니다.
  • 웹 서비스는 호스트의 ./app 디렉토리를 컨테이너의 /var/www/html 디렉토리에 마운팅하여 호스트에서 애플리케이션 코드를 직접 편집할 수 있도록 합니다.
  • 웹 서비스와 데이터베이스 서비스는 네트워크를 통해 연결되며, 웹 서비스는 DB_HOST 환경 변수를 사용하여 데이터베이스에 접근할 수 있습니다.
  • 데이터베이스 서비스는 지정된 볼륨 db-data를 사용하여 데이터베이스 데이터를 유지합니다.

Docker 컨테이너 관리

개발 환경을 설정한 후에는 Docker 명령어를 사용하여 컨테이너를 관리할 수 있습니다. 일반적인 명령어는 다음과 같습니다.

  • docker run: 새 컨테이너 시작
  • docker stop: 실행 중인 컨테이너 중지
  • docker rm: 컨테이너 제거
  • docker logs: 컨테이너 로그 보기
  • docker exec: 실행 중인 컨테이너 내에서 명령 실행

예를 들어, 위의 Docker Compose 파일에서 웹 서비스를 시작하려면 다음을 실행할 수 있습니다.

docker-compose up -d web

이렇게 하면 웹 서비스가 분리된 모드로 시작되어 터미널을 계속 사용할 수 있습니다.

Docker 를 이용한 웹 서버 배포

Dockerfile 생성

Docker 를 사용하여 웹 서버를 배포하려면 먼저 Dockerfile 을 생성해야 합니다. Dockerfile 은 Docker 이미지를 빌드하는 지침이 포함된 텍스트 파일입니다. 간단한 Nginx 웹 서버를 위한 Dockerfile 예제는 다음과 같습니다.

## 공식 Nginx 이미지를 기본 이미지로 사용
FROM nginx:latest

## 기본 Nginx 구성 파일 복사
COPY default.conf /etc/nginx/conf.d/default.conf

## 웹 애플리케이션 코드 컨테이너로 복사
COPY app/ /usr/share/nginx/html/

## HTTP 트래픽을 위해 포트 80 노출
EXPOSE 80

## Nginx 서버 시작
CMD ["nginx", "-g", "daemon off;"]

이 Dockerfile 은 다음과 같이 작동합니다.

  1. 공식 Nginx 이미지를 기본 이미지로 사용합니다.
  2. 기본 Nginx 구성 파일을 컨테이너로 복사합니다.
  3. 웹 애플리케이션 코드를 컨테이너의 웹 루트 디렉토리로 복사합니다.
  4. HTTP 트래픽을 위해 포트 80 을 노출합니다.
  5. Nginx 서버를 시작합니다.

Docker 이미지 빌드 및 실행

Dockerfile 이 준비되면 docker build 명령을 사용하여 Docker 이미지를 빌드할 수 있습니다.

## Docker 이미지 빌드
docker build -t my-nginx-server .

이 명령은 현재 디렉토리의 Dockerfile 을 사용하여 태그 my-nginx-server가 있는 Docker 이미지를 빌드합니다.

이미지 빌드 후 docker run 명령을 사용하여 이미지 기반의 컨테이너를 실행할 수 있습니다.

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

이 명령은 다음과 같이 작동합니다.

  1. 컨테이너를 분리된 모드 (-d) 로 실행합니다.
  2. 호스트의 포트 80 을 컨테이너의 포트 80 으로 매핑합니다 (-p 80:80).
  3. 컨테이너에 이름 my-nginx-server를 할당합니다.
  4. my-nginx-server 이미지를 사용하여 컨테이너를 생성합니다.

확장 및 로드 밸런싱

웹 서버를 확장하려면 Docker 컨테이너의 여러 인스턴스를 실행하고 로드 밸런서를 사용하여 트래픽을 인스턴스 간에 분산할 수 있습니다. Docker Compose 를 사용하는 예는 다음과 같습니다.

version: "3"
services:
  web:
    build: .
    ports:
      - 80:80
    deploy:
      replicas: 3
  load-balancer:
    image: nginx:latest
    ports:
      - 8080:80
    depends_on:
      - web
    configs:
      - source: nginx-config
        target: /etc/nginx/conf.d/default.conf
configs:
  nginx-config:
    file: ./nginx.conf

이 Docker Compose 파일은 다음과 같이 작동합니다.

  1. 현재 디렉토리의 Dockerfile 을 사용하여 web 서비스를 빌드합니다.
  2. web 서비스의 3 개 레플리카를 배포합니다.
  3. 포트 8080 에서 수신하여 web 서비스 인스턴스로 트래픽을 전달하는 Nginx 로드 밸런서 서비스를 실행합니다.
  4. 사용자 정의 Nginx 구성 파일을 로드 밸런서 컨테이너에 마운트합니다.

Docker Compose 와 로드 밸런싱을 사용하면 웹 서버를 쉽게 확장하고 고가용성 및 장애 허용성을 보장할 수 있습니다.

요약

이 튜토리얼을 마치면 Docker 에 대한 확실한 이해와 웹 서버 배포에 Docker 를 활용하는 방법을 익히게 될 것입니다. Docker 개발 환경을 설정하고 웹 서버를 위한 Docker 컨테이너를 생성하며 배포 프로세스를 관리하는 방법을 배울 것입니다. 이 지식은 웹 애플리케이션 개발 및 배포에 Docker 의 강력한 기능을 활용할 수 있도록 돕습니다.