1. 컨테이너 기술이란?
- OS의 관리영역을 애플리케이션 별로 격리하는 기술
- 쉘이 여러개 있는 구조, 쉘간에는 서로의 존재를 알지 못함

1. 컨테이너란?
- 애플리케이션을 실행할 수 있는 가상환경
- 애플리케이션의 배포와 실행을 자동화 할 수 있음
1. 애플리케이션 캡슐화
- 서로 다른 애플리케이션간에 필요로 하는 패키지나 라이브러리의 버전이 다를 경우,
- 각 애플리케이션 별로 실행 환경을 격리 해주는 역할을 함
가상머신과의 차이점
- 가상머신: 가상 하드웨어를 소프트웨어적으로 구현
-> 하드웨어적 동작까지 에뮬레이션
-> 소프트웨어적 비용 (오버헤드)발생
- 컨테이너: 핵심 커널은 그대로 공유
-> 커널을 애플리케이션 별로 격리
-> 별도의 OS 인 것 처럼
2. 컨테이너의 종류
1. OS 컨테이너
- 호스트의 커널을 공유하고, 유저스페이스 격리 기능 제공

1. Host
2. 유저 스페이스
- 커널 스페이스와 구분되는 것
- 커널 스페이스는 하드웨어 제어 등 시스템의 모든 일을 할 수 있는 영역
- 유저 스페이스는 자원 분배와 관련된 영역 등과 같은 보호된 영역에 대한 권한이 없는 영역
2. 애플리케이션 컨테이너
- 하나의 서비스를 패키지로 만들어 구동
- 애플리케이션 컨테이너는 보통 하나의 컨테이너에 하나의 프로세스 작동
2. Docker란?
1. Docker 의 구성
1. Docker 데몬
- Docker 데몬은 Docker 서비스를 제공
- 모든 컨테이너는 Docker 데몬 아래에 구성
2. Docker CLI
- Docker 데몬을 제어하기 위한 명령줄 인터페이스 제공
2. 컨테이너의 장점
- 마이크로서비스 아키텍쳐에서 유용함
-> 모놀리틱 아키텍쳐에 비해 중단 없이 서비스를 업데이트 할 수 있음
1. 빠른 애플리케이션 배포
- 컨테이너는 애플리케이션에 관련된 부분만 담고 있어 크기가 작다
2. 높은 이식성
- OS나 호스트의 라이브러리와 독립적
-> 의존성이 낮다
3. 쉬운 공유
- 컨테이너를 제작해 이미지를 공용 레포지토리나 사설 레포지토리에서 쉽게 공유 할 수 있음
4. 적은 자원 사용량
- 가상머신과 달리 애플리케이션 동작을 위한 최소한의 정보만 필요
- 기존 HOST의 커널을 공유하기때문에, 소프트웨어적 오버헤드 작음
5. 높은 재사용성
- 애플리케이션의 기능 개선에 따라, 사용되는 의존성이 달라질 수 있는 문제 관리 가능
- 필요하면 언제든 이전 버전의 애플리케이션으로 재배포 가능
3. Docker 사용하는 과정
1. Dockerfile
2. Docker 이미지 배포
3. Docker 이미지를 통해 컨테이너 생성 및 실행(run)
- Docker Deamon이 있는 machine에 전개
4. Docker 설치
1. 패키지 관리자 기능 업데이트
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
2. Docker Repository 서명 키 등록
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
3. Docker 패키지 Repository 추가
echo \
"deb [arch="$(dpkg --print-architecture)" signed-
by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
4. Docker 설치
sudo apt-get update
sudo apt-get install docker-ce \
docker-ce-cli \ containerd.io \ docker-buildx-plugin \ docker-compose-plugin
5. 기본구성으로 실행
- 리눅스 서비스 데몬 관리자인 systemd를 통해 실행
- 처음 설치하는 경우, 설치 과정에 자동으로 위 명령이 실행
sudo systemctl start docker
6. 또는 설치 스크립트 활용하기
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
7. Docker 테스트
docker run hello-world
5. Docker 실행
1. 컨테이너 이름
docker run -d --name=mynginx nginx
- -d: 백드라운드 실행
- -name: 컨테이너 이름을 직접 명시
- nginx: 이미지 이름(tag 생략)
이미 동일한 이름의 컨테이너가 있는 경우 중복 에러 발생
2. 환경변수
docker run -d -e MYENV=foo centos env | grep MYENV
컨테이너 생성시 환경변수 지정 가능
- -e(--env) 로 환경 변수 지정
- NAME=VALUE 형식
컨테이너 이식성을 유지
- 컨테이너 동작을 변경하는 설정
-> 컨테이너 외부에서 변경 가능해야 함
- 따라서 환경변수를 활용
3. 볼륨
docker run -d --name web -v \
/root/htdocs:/usr/share/nginx/html/nginx
- -v: 연결할 볼륨 지정
-> <호스트 경로>:<컨테이너 내부 경로>
컨테이너 외부의 storage 연결
4. 포트
docker run -d --name web \
-p 60000-60030:60000-60030 (-p 1080:80) \
nginx
- -p: 연결할 포트 지정
-> <호스트 포트(범위)> : <컨테이너 내부 포트(범위)>
Port Binding 규칙
- <호스트 포트> : <컨테이너 내부 포트>
-> 호스트의 0.0.0.0(모든 장치) 에서 지정된 포트로 들어오는 패킷을 <컨테이너 내부 포트>로 포워딩
- <.IP> : <호스트 포트> : <컨테이너 내부 포트>
-> 호스트의 지정 IP에서 지정된 포트로 들어오는 패킷을 <컨테이너 내부 포트>로 포워딩
Exposed Port Publishing
- 이미지에 이미 지정된 모든 Port 를 포워딩하도록 함
5. 컨테이너 링크
컨테이너 간 통신이 필요한 경우
docker run -d --name web nginx
docker run --link web:http centos env | grep -i_port
- --link: 컨테이너 간 링크 설정
-> <컨테이너 이름> : <호스트 이름>
6. 네트워크
docker run -d --net=bridge --name web nginx
- --net: 네트워크 연결 방식을 지정
-> host, bridge, <.network-id>, container:<컨테이너 ID>
6. Cluster 관리
1. Cluster 관리의 필요성
Docker
- 특정 기능을 실현하는데 특화됨
- 하지만 한개의 Daemon만 컨트롤 가능
복수의 Daemon
- 신뢰성/가용성/유지보수성/완전성/기밀성을 위해
- 컴포넌트(컨테이너/애플리케이션)들의 적절한 분산배치 중요
- 이러한 목적을 위해 복수의 Daemon이 필요함
- 복수의 Daemon을 관리하기 위해 Cluster 관리자가 필요
2. Cluster 관리자
- Kubernetes와 같은 Cluster 관리자는 컨테이너에 대한 작업만 수행
- 노드(호스트)에 대한 작업은 담당하지 않는다
3. KUBERNETES
1. Kubernetes의 기본 개념
1. 노드(node)
Docker Daemon 이 동작하는 호스트
- Master: Cluster 제어용 프로그램이 동작하는 호스트
-> K8s 제어 API 수신
- Minion: 제어되는 호스트
-> 컨테이너 동작
2. 팟(Pod)
Docker 컨테이너의 집합체
3. 서비스(Service)
통신의 엔드포인트를 제공
4. 리플리케이션 컨트롤러(Replication Controller, 복제 제어)
Pod의 배포를 관리
- Pod의 다중도 정의 -> 배포의 수 (요소의 개수)
- 감시
- 조정
5. 라벨(Label)
오브젝트에 부여할 수 있는 속성
- Pod, Service, Replication Controller 등
- 하나의 오브젝트에 복수의 Lable 설정 가능
K8s에서의 Label
- Label Selector
-> Label 을 기반으로 대상 오브젝트 지정