소개
Docker 는 애플리케이션 배포 및 관리를 간소화하는 널리 사용되는 컨테이너화 플랫폼입니다. 이 튜토리얼에서는 컨테이너화의 이점을 탐색하고 Docker 개발 환경을 설정하는 방법을 배우면서 Docker 를 사용하여 웹 서버를 배포하는 방법을 배웁니다.
Docker 이해
Docker 란 무엇인가?
Docker 는 개발자가 컨테이너 환경에서 애플리케이션을 구축, 배포 및 실행할 수 있도록 하는 오픈소스 플랫폼입니다. 컨테이너는 애플리케이션 실행에 필요한 코드, 런타임, 시스템 도구 및 라이브러리 등 모든 것을 포함하는 경량의 독립 실행형 실행 가능 패키지입니다. Docker 는 애플리케이션을 패키징하고 배포하는 일관되고 안정적인 방법을 제공하여 소프트웨어 개발, 테스트 및 배포를 더욱 용이하게 합니다.
Docker 사용의 이점
- 일관된 환경: Docker 컨테이너는 기본 인프라에 관계없이 애플리케이션이 동일한 방식으로 실행되도록 보장하여 일관되고 안정적인 개발 및 배포 환경을 제공합니다.
- 증가된 효율성: Docker 컨테이너는 경량이며 빠르게 시작 및 중지할 수 있으므로 기존 가상 머신에 비해 시스템 리소스를 더 효율적으로 사용할 수 있습니다.
- 향상된 확장성: Docker 는 필요에 따라 애플리케이션을 확장하거나 축소하기 쉽게 여러 컨테이너를 생성 및 관리할 수 있도록 합니다.
- 향상된 이식성: Docker 컨테이너는 다양한 플랫폼 및 환경에서 쉽게 공유 및 배포할 수 있으므로 개발, 테스트 및 프로덕션 환경 간에 애플리케이션을 쉽게 이동할 수 있습니다.
Docker 아키텍처
Docker 아키텍처는 다음과 같은 주요 구성 요소로 구성됩니다.
- Docker 클라이언트: Docker 데몬과 상호 작용할 수 있도록 하는 사용자 인터페이스입니다.
- Docker 데몬: 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리하는 백그라운드 프로세스입니다.
- Docker 이미지: 애플리케이션 실행에 필요한 코드, 런타임, 시스템 도구, 라이브러리 및 종속성을 포함하는 변경 불가능한 파일입니다.
- Docker 컨테이너: Docker 이미지의 실행 가능한 인스턴스로, 고유한 파일 시스템, 네트워크 및 프로세스 공간을 갖습니다.
- 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 설치 후 개발 환경에 맞게 설정할 수 있습니다. 일반적인 설정은 다음과 같습니다.
- 볼륨 마운팅: 호스트 시스템의 디렉토리들을 Docker 컨테이너에 마운팅하여 파일 및 데이터를 공유합니다.
- 네트워킹: 컨테이너들이 서로 및 호스트 시스템과 통신할 수 있도록 Docker 네트워크를 설정합니다.
- 환경 변수: 애플리케이션을 구성하기 위해 Docker 컨테이너에 환경 변수를 전달합니다.
- 빌드 인수: 이미지를 커스터마이즈하기 위해 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 은 다음과 같이 작동합니다.
- 공식 Nginx 이미지를 기본 이미지로 사용합니다.
- 기본 Nginx 구성 파일을 컨테이너로 복사합니다.
- 웹 애플리케이션 코드를 컨테이너의 웹 루트 디렉토리로 복사합니다.
- HTTP 트래픽을 위해 포트 80 을 노출합니다.
- 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
이 명령은 다음과 같이 작동합니다.
- 컨테이너를 분리된 모드 (
-d) 로 실행합니다. - 호스트의 포트 80 을 컨테이너의 포트 80 으로 매핑합니다 (
-p 80:80). - 컨테이너에 이름
my-nginx-server를 할당합니다. 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 파일은 다음과 같이 작동합니다.
- 현재 디렉토리의 Dockerfile 을 사용하여
web서비스를 빌드합니다. web서비스의 3 개 레플리카를 배포합니다.- 포트 8080 에서 수신하여
web서비스 인스턴스로 트래픽을 전달하는 Nginx 로드 밸런서 서비스를 실행합니다. - 사용자 정의 Nginx 구성 파일을 로드 밸런서 컨테이너에 마운트합니다.
Docker Compose 와 로드 밸런싱을 사용하면 웹 서버를 쉽게 확장하고 고가용성 및 장애 허용성을 보장할 수 있습니다.
요약
이 튜토리얼을 마치면 Docker 에 대한 확실한 이해와 웹 서버 배포에 Docker 를 활용하는 방법을 익히게 될 것입니다. Docker 개발 환경을 설정하고 웹 서버를 위한 Docker 컨테이너를 생성하며 배포 프로세스를 관리하는 방법을 배울 것입니다. 이 지식은 웹 애플리케이션 개발 및 배포에 Docker 의 강력한 기능을 활용할 수 있도록 돕습니다.



