Docker / / 2024. 11. 12. 16:27

Docker

1. Docker의 핵심 개념과 구조

 

Docker는 애플리케이션을 컨테이너로 실행하기 위해 리눅스 커널의 컨테이너화 기술을 활용합니다. 컨테이너는 가상 머신과 비슷하지만, 운영체제 커널을 공유하기 때문에 자원 소모가 적고 실행 속도가 빠릅니다. Docker는 컨테이너 이미지를 기반으로 독립적인 환경을 제공하여, 개발, 테스트, 배포 등의 프로세스를 간소화합니다.

 

컨테이너와 이미지에 대한 이해가 중요한데요:

**이미지(Image)**는 불변하는 상태의 애플리케이션 파일과 설정을 포함하는 정적 템플릿입니다. 여러 개의 레이어(layer)로 구성되며, 각 레이어는 파일 시스템의 변경 사항을 저장합니다. 예를 들어, 애플리케이션 실행 파일과 그 위의 종속 라이브러리를 레이어로 쌓아 올려 하나의 이미지가 됩니다.

**컨테이너(Container)**는 이미지를 기반으로 실행 중인 인스턴스입니다. 컨테이너는 이미지를 동적으로 실행하여 애플리케이션을 구동할 수 있습니다. 각 컨테이너는 고유한 파일 시스템과 네트워크 설정을 가지며 독립적으로 동작합니다.

 

2. Dockerfile - 이미지 생성의 청사진

 

Dockerfile은 이미지 생성을 위한 명령어 집합입니다. Docker는 Dockerfile을 단계별로 읽고 실행해 최종적으로 이미지를 생성합니다. 일반적인 Dockerfile 작성 예시는 아래와 같습니다:

# 베이스 이미지를 설정합니다
FROM openjdk:11-jdk

# 애플리케이션 파일을 이미지에 추가합니다
COPY ./myapp.jar /app/myapp.jar

# 애플리케이션을 실행할 명령어를 설정합니다
CMD ["java", "-jar", "/app/myapp.jar"]

 

위 예시에서 FROM은 베이스 이미지를 지정하고, COPY는 로컬 파일을 컨테이너에 복사하는 역할을 하며, CMD는 컨테이너 실행 시 시작할 명령어를 설정합니다. 이 파일을 기반으로 이미지를 생성할 수 있습니다.

 

3. Docker 이미지와 컨테이너의 라이프사이클 관리

 

Docker 이미지를 기반으로 컨테이너를 생성하고 종료하는 작업을 통해 애플리케이션을 운영할 수 있습니다. 주요 명령어는 다음과 같습니다:

docker build: Dockerfile을 기반으로 이미지를 생성합니다.

docker run: 이미지를 기반으로 컨테이너를 생성하고 실행합니다.

docker stop: 컨테이너 실행을 중지합니다.

docker rm: 중지된 컨테이너를 삭제합니다.

docker rmi: 이미지를 삭제합니다.

 

Docker는 컨테이너의 상태를 저장하는 기능도 제공하는데, docker commit 명령을 통해 컨테이너의 현재 상태를 새로운 이미지로 저장할 수 있습니다.

 

4. Docker Compose로 다중 컨테이너 관리

 

대규모 애플리케이션에서는 여러 컨테이너를 연동하여 서비스해야 할 필요가 있습니다. 이때 docker-compose.yml 파일을 통해 다중 컨테이너의 실행 환경을 설정할 수 있습니다. 예를 들어, 애플리케이션 서버와 데이터베이스 서버를 동시에 구동하기 위해 다음과 같이 작성할 수 있습니다:

version: '3'
services:
  web:
    image: myapp_image
    ports:
      - "8080:8080"
  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: mydb
    ports:
      - "3306:3306"

 

이 파일을 작성하고 docker-compose up 명령을 실행하면 웹 서버와 데이터베이스 서버가 자동으로 시작됩니다. docker-compose를 사용하면 환경 설정을 코드로 관리할 수 있어 유지보수가 용이합니다.

 

5. Docker Networking과 볼륨

 

Docker는 컨테이너 간 통신을 위해 네트워크를 설정하는 기능을 제공합니다. Docker 네트워크의 유형은 다음과 같습니다:

bridge: 기본 네트워크 유형으로, 서로 다른 컨테이너 간 통신이 가능하지만 외부 네트워크와는 차단됩니다.

host: 컨테이너가 호스트 네트워크와 동일하게 작동하여 네트워크 설정이 간소화됩니다.

overlay: 여러 호스트 간의 컨테이너를 연결할 수 있으며, 클러스터 환경에서 주로 사용됩니다.

 

또한, 데이터 저장을 위한 볼륨(Volume) 기능도 제공됩니다. 볼륨은 컨테이너의 파일 시스템이 삭제되더라도 데이터가 유지되도록 합니다. 볼륨은 데이터를 외부에 저장하고 컨테이너에 마운트하는 방식으로 사용되며, docker volume create 명령을 통해 생성할 수 있습니다.

 

6. Docker 보안과 모니터링

 

컨테이너 환경은 공유 커널로 인해 보안에 신경 써야 합니다. Docker는 기본적으로 네임스페이스, 컨트롤 그룹을 통해 프로세스를 격리하고, AppArmorSELinux 같은 보안 정책을 적용하여 컨테이너의 행동을 제어할 수 있습니다.

 

모니터링은 docker stats 명령을 통해 각 컨테이너의 CPU, 메모리, 네트워크 I/O 등의 실시간 상태를 확인할 수 있으며, PrometheusGrafana와 같은 모니터링 도구와 연동하여 더 심층적인 모니터링도 가능합니다.

 

7. Docker와 CI/CD 파이프라인

 

Docker는 코드 배포와 관리를 자동화하는 CI/CD 파이프라인에서 필수적인 역할을 합니다. Jenkins, GitLab CI, CircleCI와 같은 도구는 Docker 이미지를 기반으로 빌드, 테스트, 배포를 자동화할 수 있도록 지원합니다. Docker 이미지를 통해 어디서든 동일한 환경에서 애플리케이션을 실행할 수 있기 때문에, 코드의 일관성과 안정성을 보장하는 데 유리합니다.

 

8. Docker와 Kubernetes

 

Docker는 컨테이너를 하나의 서버에서 운영하기 좋지만, 다수의 서버에서 다수의 컨테이너를 관리하려면 **쿠버네티스(Kubernetes)**와 같은 오케스트레이션 도구가 필요합니다. Kubernetes는 다수의 컨테이너를 클러스터로 구성하여 스케일링, 자원 관리, 모니터링 등을 쉽게 해줍니다. Docker와 Kubernetes의 조합을 통해 대규모 분산 시스템을 효과적으로 관리할 수 있습니다.

 

9. Docker의 실전 예시

 

예를 들어, 웹 애플리케이션에서 Node.js 백엔드, React 프론트엔드, MySQL 데이터베이스를 하나의 프로젝트로 관리한다고 가정할 때, 각 서비스는 독립된 컨테이너로 분리할 수 있습니다. 이를 통해 각 서비스는 독립적으로 실행 및 업데이트할 수 있으며, 장애가 발생할 경우 다른 서비스에 영향을 주지 않습니다.

'Docker' 카테고리의 다른 글

BusyBox와 Debian 비교  (0) 2024.12.03
Fork  (0) 2024.12.03
wget  (0) 2024.12.03
AWS EC2 인스턴스 Docker 설치  (0) 2024.12.03
Docker 명령어  (0) 2024.12.03
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유