(참고: Fastcampus 강의, 강민철의 인공지능 시대 필수 컴퓨터 공학 지식)
7. 컨테이너
Contents
- 컨테이너란
- 컨테이너 이미지 & 실행
- 컨테이너 레지스트리
- 도커 실습 1
- 도커 실습 2
- 컨테이너 사용하는 이유
- 컨테이너 오케스트레이션
(1) 컨테이너란
애플리케이션이 “독립된 실행공간”을 확보하도록 하는 “OS 수준”의 “가상화 기술”
- (1) “독립된 실행공간”
- 독립된 실행을 위해, 자원을 격리함
- 코드 실행에 필요한 요소 (라이브러리 등)을 묶음
- (2) “OS 수준”
- 각 컨테이너는 “같은 호스트 OS” 커널을 공유
- (3) “가상화 기술”
- 다양한 컴퓨팅 환경에서도, 일관되게 실행할 수 있도록하는 가상 실행 환경
대표적인 예시) docker, lxc
(2) 컨테이너 이미지 & 실행
-
컨테이너: 컨테이너 이미지로 생성
-
컨테이너 이미지: 애플리케이션 실행에 필요한 모든 요소가 포함된 패키지
-
컨테이너 실행: 컨테이너 이미지 기반으로 컨테이너 생성 후, 격리된 환경에서 애플리케이션 구동
(3) 컨테이너 레지스트리
컨테이너 이미지를 저장/관리/배포하는 저장소
- public & private으로 나뉨
대표적 예시) Docer hub (https://hub.docerk.com)
컨테이너 이미지를..
- Push = 업로드
- Pull = 다운로드
(4) 도커 실습 1
docker pull ubunti:22.04 # (1) pull
docker images # (2) 가지고 있는 docker image 목록 확인
docker run --rm -it ubuntu:22.04 /bin/bash # (3) 컨테이너 실행
cat /etc/os-release # (4) 지금 실행한 컨테이너 정보 확인
exit # (5) 컨테이너 종료
docker run
: 컨테이너 실행--rm
: 컨테이너 실행 후 삭제-it
: interactive 모드/bin/bash
: 컨테이너 실행 후, bash 실행
(5) 도커 실습 2
컨테이너 안에서 실행할 예시 애플리케이션
mkdir pyftrace_docker
cd pyftrace_docker
touch fooobar.py # 생성 후 편집
- 도커 이미지 생성하기
Dockerfile
: 컨테이너 이미지 생성을 위한 파일
# (1) Base Image: 가벼운 python 3.9
FROM python:3.9-slim
# (2) 작업 디렉토리 설정
WORKDIR /app
# (3) 현재 디렉터리의 모든 파일을, 컨테이너의 /app 디렉토리로 복사
COPY . .
# (4) pyftrace 설치
RUN pip install pyftrace
# (5) 컨테이너 시작 시, 실행할 명령어
CMD ['pyftrace','foobar.py']
- Dockerfile로 이미지 만들기
docker build -t pytrace-image .
docker images
-t
: 이미지 태그.
: 현재 디렉토리 내에 있는 Dockerfile 기반으로 이미지 생성
- 이미지로 컨테이너 실행하기
docker run --rm pftrace-image
(6) 컨테이너 사용하는 이유
- 경량 가상화: 가상 머신 (VM)보다 낮은 overhead로 격리된 환경 생성 가능
- 효율적 배포: 이미지만 있으면, 쉽게 컨테이너 찍어낼 수 있음
- 일관된 실행 환경: 필요한 요소만 골라서 격리된 환경에서 실행
- 플랫폼 독립성: 다양한 운영환경에서 동일한 동작
(7) 컨테이너 오케스트레이션
많은 컨테이너를 효율적으로 관리하는 방법
- e.g., 쿠버네티스 (kubernetes, k8s) , 도커 스웜 (docker swarm)
주요 작업
- 자동화된 배포 및 관리: 컨테이너 생성, 시작, 중지 및 재시작 등의 작업을 자동으로 수행
- 확장 관리: 애플리케이션 부하에 따라 컨테이너 수를 동적 조절하여 자원을 효율적으로 활용
- 네트워킹: 컨테이너 간의 통신을 관리
- 가용성 관리 및 복구: 장애 발생 시, 컨테이너를 자동으로 재배치/재시작, 서비스 지속성 보장
실습
# (1) swarm 초기화
docker swarm init
# (2) 서비스 생성
docker service create \
--name logger \
-- replicas 3 \
alpine \
sh -c "while true; do echo Hello from replica \$(hostname) at \$(date); sleep 5; done"
docker service create
: 서비스 생성- docker swarm은 “서비스” 단위로 컨테이너를 관리한다
--name logger
: 서비스 이름을 “logger”로 지정--replicas 3
: 서비스의 복제본을 3개 (=컨테이너 3개)로 실행alpine
: 실행 이미지sh -c "..."
: 컨테이너에서 실행할 명령
# (1) 서비스 목록 확인
docker service ls
# (2) 아까 만든 "logger" 서비스의 상태/컨테이너 목록 확인
docker service ps logger
# (3) 로그 확인
docker service logs -f logger # 5chdp g
# (4) scale up & down
docker service scale logger=5 #
docker service scale logger=2
# (5) 서비스 삭제 및 swarm 종료
docker service rm logger
docker swarm leave --force