소개
이 포괄적인 튜토리얼에서는 강력한 docker-compose 도구를 사용하여 Docker 컨테이너를 신속하게 배포하는 방법을 배웁니다. Docker 아키텍처 이해, Docker 설치 및 구성, 그리고 Docker Compose 시작 과정을 안내해 드립니다. 이 튜토리얼을 마치면 다중 컨테이너 애플리케이션을 정의하고 구성하고, Compose 를 사용하여 Docker 컨테이너를 배포 및 관리하며, Docker 환경을 손쉽게 확장하고 네트워크할 수 있게 될 것입니다. "docker-compose up -d"의 힘을 경험하고 애플리케이션을 신속하게 구동해 보세요!
Docker 및 컨테이너화 소개
Docker 는 컨테이너화된 환경에서 애플리케이션을 개발, 배포 및 관리하는 인기 있는 오픈소스 플랫폼입니다. 컨테이너화는 애플리케이션과 그 종속성을 격리되고 자체적으로 포함된 단위인 컨테이너에 패키징하고 배포하는 방법입니다.
Docker 란 무엇인가요?
Docker 는 컨테이너 내에서 애플리케이션을 구축, 배포 및 실행할 수 있는 소프트웨어 플랫폼입니다. 컨테이너는 코드, 런타임, 시스템 도구 및 라이브러리와 같이 애플리케이션 실행에 필요한 모든 것을 포함하는 경량, 휴대용 및 자체 포함 환경입니다. 이 접근 방식은 개발자의 랩톱에서부터 프로덕션 서버까지 다양한 컴퓨팅 환경에서 애플리케이션이 일관되게 실행되도록 보장합니다.
Docker 및 컨테이너화의 이점
- 일관성: 컨테이너는 기본 인프라에 관계없이 애플리케이션이 동일한 방식으로 실행되도록 보장합니다.
- 확장성: 컨테이너는 변화하는 수요를 충족하기 위해 쉽게 확장하거나 축소할 수 있습니다.
- 효율성: 컨테이너는 기존 가상 머신보다 경량이며 리소스를 더 효율적으로 사용합니다.
- 이식성: 컨테이너는 개발자의 머신에서 프로덕션 서버와 같은 다른 컴퓨팅 환경으로 이동할 수 있습니다.
- 격리: 컨테이너는 높은 수준의 격리를 제공하여 한 컨테이너의 프로세스가 다른 컨테이너의 프로세스에 영향을 미치지 않도록 합니다.
Docker 아키텍처 및 구성 요소
Docker 의 아키텍처는 다음과 같은 몇 가지 주요 구성 요소로 구성됩니다.
- Docker Engine: 컨테이너를 관리하는 핵심 런타임
- Docker Images: 필요한 파일, 라이브러리 및 종속성을 포함하여 컨테이너를 생성하기 위한 청사진
- Docker Containers: 애플리케이션을 실행하는 Docker 이미지의 인스턴스
- Docker Registry: Docker 이미지를 저장하고 배포하는 저장소
graph TD
A[Docker Engine] --> B[Docker Images]
A --> C[Docker Containers]
A --> D[Docker Registry]
Docker 의 활용 사례
Docker 는 다양한 산업 및 시나리오에서 널리 사용됩니다.
- 웹 애플리케이션: 다양한 환경에서 웹 애플리케이션을 배포하고 확장합니다.
- 마이크로서비스: 작고 독립적인 서비스로 구성된 복잡하고 분산된 애플리케이션을 구축하고 관리합니다.
- 지속적인 통합 및 배포: 애플리케이션의 빌드, 테스트 및 배포를 자동화합니다.
- 머신 러닝 및 데이터 과학: 머신 러닝 모델 및 데이터 처리 파이프라인을 패키징하고 배포합니다.
- IoT 및 엣지 컴퓨팅: 네트워크 가장자리에서 애플리케이션과 서비스를 배포합니다.
Docker 및 컨테이너화의 기본 사항을 이해함으로써 애플리케이션 개발, 배포 및 관리 프로세스를 간소화하기 위해 이러한 강력한 도구를 활용할 수 있습니다.
Docker 아키텍처 및 구성 요소 이해
Docker Engine
Docker Engine 은 전체 Docker 생태계를 구동하는 핵심 런타임입니다. Docker 컨테이너의 수명주기를 관리하는 역할을 하며, 이는 컨테이너를 구축, 실행 및 모니터링하는 것을 포함합니다. Docker Engine 은 다음과 같은 주요 구성 요소로 구성됩니다.
- Docker Daemon: 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리하는 백그라운드 프로세스입니다.
- Docker API: 프로그램 및 도구가 Docker Daemon 과 상호 작용하는 데 사용하는 API 입니다.
- Docker CLI: 사용자가 Docker Daemon 과 상호 작용할 수 있도록 하는 명령줄 인터페이스입니다.
Docker Images
Docker 이미지는 Docker 컨테이너를 생성하기 위한 청사진입니다. 애플리케이션을 실행하는 데 필요한 파일, 라이브러리 및 종속성을 포함합니다. Docker 이미지는 Dockerfile 을 사용하여 구축됩니다. Dockerfile 은 이미지를 생성하는 단계를 정의하는 텍스트 기반 스크립트입니다.
다음은 예시 Dockerfile 입니다.
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y nginx
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
이 Dockerfile 은 Ubuntu 22.04 베이스 이미지를 기반으로 새로운 이미지를 생성하고, Nginx 웹 서버를 설치하며, index.html 파일을 컨테이너에 복사하고, 80 번 포트를 노출하며, Nginx 서버를 시작하는 기본 명령을 설정합니다.
Docker Containers
Docker 컨테이너는 Docker 이미지의 인스턴스입니다. 애플리케이션을 실행하는 실행 중인 격리된 환경입니다. 컨테이너는 애플리케이션과 그 종속성을 단일의 자체 포함 단위로 패키징하기 때문에 경량 및 휴대용입니다.
docker run 명령을 사용하여 새 컨테이너를 생성하고 실행할 수 있습니다.
docker run -d -p 80:80 --name my-nginx nginx
이 명령은 Nginx 이미지를 기반으로 새 컨테이너를 생성하고, 호스트의 80 번 포트를 컨테이너의 80 번 포트에 매핑하며, 컨테이너를 분리된 모드로 시작합니다.
Docker Registry
Docker Registry 는 Docker 이미지를 저장하고 배포하는 저장소입니다. Docker 이미지를 업로드, 다운로드 및 공유할 수 있습니다. 가장 인기 있는 공용 Docker 레지스트리는 Docker Hub 이지만, 개인 레지스트리를 설정할 수도 있습니다.
Docker 아키텍처의 주요 구성 요소를 이해함으로써 컨테이너화된 애플리케이션을 효과적으로 구축, 배포 및 관리할 수 있습니다.
시스템에 Docker 설치 및 구성
Ubuntu 22.04 에 Docker 설치
Ubuntu 22.04 시스템에 Docker 를 설치하려면 다음 단계를 따르세요.
패키지 인덱스를 업데이트하고 필요한 종속성을 설치합니다.
sudo apt-get update sudo apt-get install -y \ ca-certificates \ curl \ gnupg \ lsb-release공식 Docker GPG 키를 추가하고 Docker 리포지토리를 추가합니다.
sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg 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/nullDocker Engine, containerd 및 Docker Compose 패키지를 설치합니다.
sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugindocker version명령을 실행하여 설치를 확인합니다.sudo docker version
Docker 구성
Docker 설치 후 필요에 따라 구성할 수 있습니다. 다음은 몇 가지 일반적인 구성 작업입니다.
루트 사용자가 아닌 사용자로 Docker 관리
기본적으로 Docker 데몬은 루트 사용자로 실행됩니다. 루트 사용자가 아닌 사용자가 Docker 명령을 실행할 수 있도록 docker 그룹에 추가할 수 있습니다.
sudo usermod -aG docker $USER
newgrp docker
Docker 데몬 옵션 구성
/etc/docker/daemon.json 파일을 편집하여 Docker 데몬의 동작을 사용자 지정할 수 있습니다. 예를 들어, 기본 로그 드라이버를 변경하려면 다음과 같이 합니다.
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "5"
}
}
Docker Compose 사용 활성화
Docker Compose 는 여러 컨테이너 애플리케이션을 정의하고 실행하는 도구입니다. Docker 설치 시 함께 설치되지만 수동으로 활성화해야 할 수도 있습니다.
sudo systemctl enable docker-compose-plugin
이러한 단계를 따르면 Ubuntu 22.04 시스템에 Docker 를 성공적으로 설치하고 구성하여 Docker 및 Docker Compose 를 사용할 수 있는 기반을 마련할 수 있습니다.
Docker Compose 시작하기
Docker Compose 란 무엇인가요?
Docker Compose 는 여러 컨테이너로 구성된 Docker 애플리케이션을 정의하고 실행하는 도구입니다. 애플리케이션을 구성하는 서비스, 네트워크, 볼륨을 YAML 파일로 기술하고, 단일 명령으로 모든 서비스를 시작, 중지 및 관리할 수 있습니다.
Docker Compose 설치
Ubuntu 22.04 에서 Docker Compose 는 Docker 설치 시 함께 설치됩니다. 다음 명령을 실행하여 설치를 확인할 수 있습니다.
docker-compose version
Docker Compose 파일 작성
Docker Compose 파일은 YAML 파일로, 애플리케이션을 구성하는 서비스, 네트워크 및 볼륨을 정의합니다. 다음은 Nginx 웹 서버와 MySQL 데이터베이스로 구성된 간단한 웹 애플리케이션을 정의하는 예시 docker-compose.yml 파일입니다.
version: "3"
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
이 파일은 web 및 db 두 개의 서비스를 정의합니다. web 서비스는 최신 Nginx 이미지를 사용하고, 80 번 포트를 노출하며, 로컬 html 디렉터리를 Nginx 문서 루트에 마운트합니다. db 서비스는 MySQL 5.7 이미지를 사용하고, 루트 비밀번호를 설정하며, MySQL 데이터를 위한 이름이 지정된 볼륨을 마운트합니다.
Docker Compose 애플리케이션 관리
docker-compose 명령을 사용하여 Docker Compose 애플리케이션을 관리할 수 있습니다. 다음은 일반적인 명령입니다.
docker-compose up -d: 애플리케이션을 분리된 모드로 시작합니다.docker-compose down: 애플리케이션을 중지하고 제거합니다.docker-compose ps: 실행 중인 서비스를 나열합니다.docker-compose logs: 애플리케이션의 로그를 표시합니다.docker-compose scale web=3:web서비스를 3 개의 인스턴스로 확장합니다.
Docker Compose 를 사용하면 여러 컨테이너 애플리케이션을 쉽게 정의, 배포 및 관리할 수 있으므로 Docker 워크플로우를 간소화하는 강력한 도구입니다.
여러 컨테이너 애플리케이션 정의 및 구성
Docker Compose 에서 서비스 정의
Docker Compose 파일에서 애플리케이션의 서비스를 정의합니다. 서비스는 애플리케이션을 구성하는 개별 컨테이너를 나타냅니다. 각 서비스는 사용할 Docker 이미지, 환경 변수, 노출할 포트 및 마운트할 볼륨과 같은 고유한 구성을 갖습니다.
다음은 다중 서비스 Docker Compose 파일의 예입니다.
version: "3"
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
- mysql-data:/var/lib/mysql
redis:
image: redis:latest
ports:
- "6379:6379"
volumes:
mysql-data:
이 파일은 web, db, redis 세 가지 서비스를 정의합니다. 각 서비스는 사용할 Docker 이미지, 노출할 포트 및 마운트할 볼륨과 같은 고유한 구성을 갖습니다.
서비스 종속성 구성
Docker Compose 파일에서 depends_on 지시문을 사용하여 서비스 간 종속성을 정의할 수 있습니다. 이를 통해 서비스가 올바른 순서로 시작되고, 서비스가 시작되기 전에 종속성이 충족되는지 확인할 수 있습니다.
version: "3"
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
이 예제에서 web 서비스는 db 서비스에 종속됩니다. 따라서 웹 서버가 시작되기 전에 데이터베이스가 먼저 시작됩니다.
네트워크 및 볼륨 구성
서비스를 정의하는 것 외에도 Docker Compose 파일에서 네트워크와 볼륨을 구성할 수 있습니다. 네트워크를 통해 서비스가 서로 통신할 수 있고, 볼륨을 통해 애플리케이션 데이터에 대한 지속적인 저장소를 제공합니다.
version: "3"
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- frontend
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
- mysql-data:/var/lib/mysql
networks:
- backend
volumes:
mysql-data:
networks:
frontend:
backend:
이 예제에서 web 서비스는 frontend 네트워크에 연결되고, db 서비스는 backend 네트워크에 연결됩니다. 이를 통해 웹 서버가 데이터베이스와 통신할 수 있지만 데이터베이스가 공개 인터넷에 직접 노출되지 않습니다.
Docker Compose 를 사용하여 여러 컨테이너 애플리케이션을 정의하고 구성하는 방법을 이해함으로써 복잡하고 확장 가능하며 유지 관리 가능한 애플리케이션을 쉽게 구축할 수 있습니다.
Docker Compose 를 이용한 컨테이너 배포 및 관리
Docker Compose 애플리케이션 배포
Docker Compose 애플리케이션을 배포하려면 docker-compose up 명령어를 사용합니다. 이 명령어는 Docker Compose 파일을 읽고 필요한 네트워크와 볼륨을 생성한 후 지정된 서비스를 시작합니다.
docker-compose up -d
-d 플래그는 컨테이너를 백그라운드에서 실행하는 분리 모드로 실행합니다.
Docker Compose 컨테이너 관리
Docker Compose 애플리케이션이 실행되면 다음 명령어를 사용하여 컨테이너를 관리할 수 있습니다.
docker-compose ps: 실행 중인 컨테이너 목록을 표시합니다.docker-compose logs: 컨테이너의 로그를 표시합니다.docker-compose stop: 실행 중인 컨테이너를 중지합니다.docker-compose start: 중지된 컨테이너를 시작합니다.docker-compose down: 컨테이너, 네트워크 및 볼륨을 중지하고 제거합니다.
예를 들어 web 서비스의 로그를 보려면 다음과 같이 실행합니다.
docker-compose logs web
Docker Compose 서비스 확장
Docker Compose 는 서비스를 쉽게 확장하거나 축소할 수 있도록 지원합니다. docker-compose scale 명령어를 사용하여 특정 서비스의 인스턴스 수를 변경할 수 있습니다.
docker-compose scale web=3
이 명령어는 web 서비스를 3 개의 인스턴스로 확장합니다.
Docker Compose 애플리케이션 업데이트
Docker Compose 애플리케이션을 업데이트하려면 Docker Compose 파일을 수정한 후 docker-compose up 명령어를 사용하여 변경 사항을 적용합니다.
## Docker Compose 파일 업데이트
vim docker-compose.yml
## 변경 사항 적용
docker-compose up -d
Docker Compose 는 자동으로 새 이미지를 가져오고 새 컨테이너를 생성하며 실행 중인 애플리케이션을 업데이트합니다.
Docker Compose 의 기능을 활용하면 여러 컨테이너 애플리케이션을 쉽게 배포, 관리 및 확장할 수 있어 개발 및 배포 프로세스를 더욱 효율적이고 안정적으로 만들 수 있습니다.
Docker 컨테이너 확장 및 네트워킹
Docker 컨테이너 확장
Docker 를 사용하는 주요 이점 중 하나는 애플리케이션을 변화하는 수요에 맞춰 쉽게 확장하거나 축소할 수 있다는 것입니다. Docker Compose 는 scale 명령어를 제공하여 이 프로세스를 더욱 간단하게 만듭니다.
Docker Compose 애플리케이션에서 서비스를 확장하려면 다음 명령어를 사용할 수 있습니다.
docker-compose scale web=3
이 명령어는 web 서비스를 3 개의 인스턴스로 확장합니다. 확장하려는 서비스의 이름으로 web을 바꿔서 애플리케이션의 모든 서비스를 확장할 수 있습니다.
Docker 컨테이너 네트워킹
Docker Compose 는 애플리케이션에 기본 네트워크를 자동으로 생성하지만, 서비스 간 통신 방식을 제어하기 위해 사용자 정의 네트워크를 정의할 수도 있습니다.
다음은 두 개의 사용자 정의 네트워크 frontend와 backend를 정의하는 Docker Compose 파일 예제입니다.
version: "3"
services:
web:
image: nginx:latest
ports:
- "80:80"
networks:
- frontend
app:
image: myapp:latest
networks:
- frontend
- backend
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
networks:
- backend
networks:
frontend:
backend:
이 예제에서 web 및 app 서비스는 frontend 네트워크에 연결되고, app 및 db 서비스는 backend 네트워크에 연결됩니다. 이를 통해 웹 서버가 애플리케이션과 통신하고, 애플리케이션이 데이터베이스와 통신할 수 있지만, 데이터베이스가 공개 인터넷에 직접 노출되지 않습니다.
Docker Compose 파일의 networks 섹션을 사용하여 IP 주소 범위 및 DNS 설정과 같은 네트워크 수준 설정을 구성할 수도 있습니다.
Docker 컨테이너를 확장하고 네트워킹하는 방법을 이해함으로써 변화하는 수요와 요구 사항에 적응할 수 있는 고가용성, 확장성 및 보안성이 높은 애플리케이션을 구축할 수 있습니다.
Docker 배포 및 유지 관리 최적화 가이드
Docker 이미지 최적화
- 이미지 크기 및 공격 표면을 줄이기 위해 최소한의 베이스 이미지 (예:
alpine또는scratch) 를 사용합니다. - 최종 이미지 크기를 최적화하기 위해 다단계 빌드를 활용합니다.
- 베이스 이미지와 종속성을 정기적으로 업데이트하여 이미지를 최신 상태로 유지합니다.
dive와 같은 도구를 사용하여 Docker 이미지를 분석하고 최적화합니다.
보안 관행 구현
- 이미지를 가져올 때 신뢰할 수 있는 공식 Docker 레지스트리 (예: Docker Hub) 를 사용합니다.
- Snyk 또는 Trivy 와 같은 도구를 사용하여 이미지의 취약점을 스캔합니다.
- 컨테이너를 루트 사용자가 아닌 사용자로 실행하여 최소 권한 원칙을 적용합니다.
- Docker Content Trust 를 활성화하여 이미지의 무결성과 진본성을 확인합니다.
- Docker 데몬 및 컨테이너 보안 설정을 최적의 관행에 따라 구성합니다.
빌드 및 배포 프로세스 자동화
- LabEx 와 같은 지속적 통합 (CI) 도구를 사용하여 Docker 애플리케이션의 빌드, 테스트 및 배포를 자동화합니다.
- Docker Compose 파일을 버전 관리 시스템에 저장하여 GitOps 워크플로를 구현합니다.
- 서로 다른 배포 환경을 관리하기 위해 환경별 구성 파일 또는 환경 변수를 사용합니다.
Docker 환경 모니터링 및 유지 관리
- Docker 컨테이너 및 호스트에 대한 로깅 및 모니터링을 설정합니다.
- Prometheus, Grafana 또는 LabEx 와 같은 도구를 사용하여 컨테이너 및 시스템 메트릭을 모니터링합니다.
- Docker Compose 파일과 컨테이너 구성을 정기적으로 검토하고 업데이트합니다.
- 컨테이너 오류 및 재시작을 원활하게 처리하는 프로세스를 구현합니다.
Docker 생태계 도구 활용
- Docker Swarm 또는 Kubernetes 를 사용하여 대규모 Docker 컨테이너를 조정 및 관리합니다.
- Docker Secrets, Docker Volumes 및 Docker Networks 와 같은 도구를 탐색하여 Docker 배포를 향상시킵니다.
- LabEx 또는 기타 DevOps 플랫폼을 통합하여 Docker 기반 워크플로를 간소화합니다.
이러한 최적의 관행을 따르면 Docker 배포가 안전하고 효율적이며 유지 관리 가능하도록 하여 Docker 플랫폼을 최대한 활용할 수 있습니다.
요약
이 튜토리얼에서는 docker-compose 도구를 사용하여 Docker 컨테이너를 신속하게 배포하는 방법을 배웠습니다. Docker 아키텍처를 탐색하고 Docker 를 설치 및 구성했으며, 다중 컨테이너 애플리케이션을 정의하고 구성하는 기술을 익혔습니다. "docker-compose up -d"의 기능을 활용하여 이제 Docker 환경을 쉽게 배포 및 관리하고, 애플리케이션을 확장하며 최적의 네트워킹을 보장할 수 있습니다. 이 튜토리얼에서 얻은 지식으로 Docker 배포 프로세스를 간소화하고 컨테이너화 노력을 새로운 차원으로 끌어올릴 준비가 되었습니다.



