6.1 이미지 (Images)
Docker를 효과적으로 사용하려면 이미지, 컨테이너
, 레지스트리
와 같은 몇 가지 주요 용어를 이해해야 해. 이 용어들을 살펴보고, 이들 각각이 무엇인지, 어떻게 서로 상호작용하는지 알아보자.
Docker 이미지는 컨테이너를 생성하기 위한 템플릿이야. 이미지는 애플리케이션 실행에 필요한 모든 구성요소를 포함하고 있어: 운영 체제, 애플리케이션, 라이브러리와 종속성, 그리고 설정 파일들. OOP로 비교하자면, Docker 이미지는 클래스고, 컨테이너는 클래스의 객체야. 이미지는 Dockerfile이라는 텍스트 파일을 사용해 생성되는데, Dockerfile은 이미지를 생성하는 단계를 설명하고 있어.
이미지의 주요 특징:
- 레이어 구조: 이미지는 여러 레이어로 구성돼 있어. 기본 레이어가 있고, 그다음 각 레이어는 이전 레이어에 비해 변경 사항을 나타내. 이를 통해 공간을 절약하고 로딩 시간을 단축할 수 있어.
- 재사용 가능성: 동일한 이미지를 사용해 여러 컨테이너를 생성할 수 있어.
- 이동성: 이미지는 서로 다른 시스템 간에 이동할 수 있어서, 개발, 테스트, 그리고 다양한 환경에서의 애플리케이션 배포에 이상적이야.
이미지 사용 예:
자체 이미지 생성: Dockerfile을 작성해 애플리케이션 설정과 그 종속성을 지정하면 자체 이미지를 생성할 수 있어.
FROM ubuntu:latest
RUN apt-get update && apt-get install -y python3
COPY . /app
CMD ["python3", "/app/app.py"]
기존 이미지 사용: Docker Hub에 있는 이미지를 이용해서 웹 서버나 데이터베이스 같은 표준 애플리케이션을 빠르게 배포할 수 있어.
docker pull nginx
이 명령어는 Docker Hub의 공개 저장소에서 nginx 이미지를 다운로드해.
6.2 컨테이너 (Containers)
Docker 컨테이너는 실행 중인 이미지의 인스턴스야. 컨테이너는 애플리케이션과 그 의존성을 별도의 실행 환경에 격리해서 실행 환경을 서로 독립적으로 유지할 수 있게 해줘. 컨테이너는 가벼운데, 이는 가상 머신처럼 별도의 커널을 생성하지 않고 호스트 OS의 커널을 사용하기 때문이야.
컨테이너의 주요 특성:
- 격리: 컨테이너는 애플리케이션을 격리하여 독립적으로 작동하고 의존성 충돌을 방지해줘.
- 가벼움: 컨테이너는 가상 머신에 비해 리소스를 적게 소모해, 별도의 운영 체제가 필요하지 않거든.
- 빠른 시작: 컨테이너는 가상 머신보다 훨씬 빠르게 시작하고 종료되며, 동적인 환경 및 확장에 이상적이야.
컨테이너 사용 예:
컨테이너 실행: 이미지를 사용하여 컨테이너를 실행하려면 docker run 명령어를 사용할 수 있어.
docker run -d -p 80:80 --name mynginx nginx
컨테이너 관리: Docker는 컨테이너를 관리하기 위한 start, stop, restart, rm 및 exec 명령어를 제공해.
docker stop mynginx
docker rm mynginx
모든 명령어와 그 매개변수에 대해서는 다음 강의에서 배울 거야.
6.3 레지스트리(Registries)
Docker 레지스트리 — Docker 이미지 저장소야. 레지스트리는 개발자와 조직이 컨테이너 이미지를 저장, 관리 및 배포할 수 있도록 해줘. 공개 레지스트리와 비공개 레지스트리가 있어.
레지스트리의 주요 특징:
- 공개 레지스트리: Docker Hub 같은 공개 레지스트리는 커뮤니티와 공식 개발자가 만든 다양한 이미지를 제공해.
- 비공개 레지스트리: 조직 내부에서 이미지를 저장하고 관리하는 데 사용되며, 접근 제어와 보안을 제공해.
- CI/CD와의 통합: 레지스트리는 지속적 통합 및 배포 시스템과 쉽게 통합되어 이미지 생성 및 배포 프로세스를 자동화할 수 있어.
레지스트리 사용 예시:
1. Docker Hub: 가장 인기 있는 공개 Docker 이미지 레지스트리야. 대부분 준비된(종종 다운로드 통계에서 볼 수 있는 검증된) 이미지를 제공해.
docker pull nginx
docker push myusername/myimage:tag
2. 비공개 레지스트리: Docker Registry를 사용해서 독자적인 레지스트리를 설정하고 사용할 수 있어.
docker run -d -p 5000:5000 --name registry registry:2
docker tag myimage localhost:5000/myimage
docker push localhost:5000/myimage
이미지, 컨테이너, 레지스트리 간의 상호작용
이 세 가지 요소는 서로 밀접하게 연결되어 있으며 Docker 작업의 기본을 형성해:
- 이미지 생성: 개발자가 Dockerfile을 사용하여 이미지를 생성하고 로컬에 저장해.
- 레지스트리에 이미지 업로드: 이미지는 레지스트리(Docker Hub나 비공개 레지스트리 등)에 업로드되어 저장되고 다른 사용자나 시스템이 접근할 수 있게 돼.
- 컨테이너 실행: 사용자가 레지스트리에서 이미지를 다운로드하고 애플리케이션을 격리하고 실행을 제공하는 컨테이너를 실행해.
6.4 오케스트레이션 (Orchestration)
오케스트레이션은 분산 환경에서 여러 컨테이너를 관리하는 프로세스야. 오케스트레이션 도구는 컨테이너의 배포, 확장 및 관리를 자동화하는 데 도움을 줘.
- Kubernetes: 가장 인기 있는 컨테이너 오케스트레이션 플랫폼으로, 다양한 노드에서 컨테이너 클러스터를 관리할 수 있게 해줘.
- Docker Swarm: Docker에 내장된 오케스트레이션 플랫폼으로, Docker 클러스터를 생성하고 관리할 수 있어.
- 오케스트레이션 기능: 자동 확장, 자가 복구, 네트워크 관리, 그리고 부하 분산 같은 기능이 있어.
6.5 네트워크 (Networks)
Docker에서 네트워크는 컨테이너가 서로 및 외부와 상호 작용할 수 있도록 해줘. Docker는 다양한 사용 시나리오에 맞는 여러 종류의 네트워크를 제공해.
- Bridge: Docker가 기본적으로 생성하는 네트워크야. 브릿지 네트워크에 있는 컨테이너들은 서로 상호 작용 가능해.
- Host: 컨테이너가 호스트 머신의 네트워크 인터페이스를 사용해서 직접 접근하게 돼.
- Overlay: 여러 Docker 데몬들 간의 네트워크를 만들 때 사용돼. 오케스트레이션이 필요할 때 유용해.
- None: 컨테이너의 모든 네트워크 인터페이스를 비활성화해. 독립적인 작업에 유용해.
6.6 볼륨 (Volumes)
볼륨 (Volumes)은 컨테이너 데이터를 지속적으로 저장하기 위한 메커니즘이야. 이걸로 컨테이너를 재시작하거나 삭제하더라도 데이터가 손실되지 않게 할 수 있어.
- 볼륨 생성: 볼륨은 docker volume create 명령어로 생성돼.
- 볼륨 마운트: 볼륨은 -v 플래그를 사용해서 컨테이너에 연결돼.
- 장점: 볼륨은 컨테이너 간 데이터 저장 및 교환을 편리하게 해주고, 바인드 마운트 (bind mounts) 대비 더 나은 성능을 제공해.
중요!
볼륨은 가상 머신이나 컨테이너에 연결할 수 있는 가상 하드 디스크야. 보통 게스트 OS에서 일반 파일 형태로 저장돼.
GO TO FULL VERSION