
SDN(Software-Defined Networking)
호스트 운영체제 가상화 소프트웨어
VMware Workstation
Oracle VirtualBox
Microsoft Virtual PC
예시
- mac OS 위에 가상화 툴(VMware, UTM 등)을 깔고 그 위에 리눅스를 올리는 방식
- 장점 - 기존에 쓰던 OS를 그대로 쓰면서 가상 머신을 띄울 수 있어 매우 편리함
- 단점 - OS 위에 OS가 올라가다 보니 하드웨어 자원을 소모하는 ‘오버헤드’가 큼
- 하드웨어 바로 위에 하이퍼바이저(Xen 등)가 올라가는 방식
- 호스트 OS 라는 중간 단계가 없어서 훨씬 가볍고 강력함.
전가상화(Full-Virtualization)
DOM0 이라는 관리용 가상머신이 구동되는데 모든 가상 머신의 하드웨어 접근이 이 DOM0 로 이루어짐전가상화(Full Virtualization)
- 방식
- 게스트 OS는 자신이 가상 환경에 있는지 모름. 하드웨어를 완벽하게 흉내내기 때문.
- 성능 저하 원인
- 게스트 OS가 하드웨어에 명령을 내리면, 하이퍼바이저가 이를 가로채서 번역(Binary Translation)하는 과정이 필요.
- 이때 CPU의 가상화 지원 기능(Intel VT-x 등)이 번역 성능을 높여주지만, 여전히 번거로운 과정
반가상화(Para-Virtualization)
하이퍼콜(Hyper Call)이라는 인터페이스를 통해 하이퍼바이저에게 직접 요청을 보냄반가상화(Para-Virtualization)
- 방식
- 게스트 OS가 스스로 가상 머신임을 인지하고 있음
하이퍼콜(Hypercall)
- OS가 하드웨어를 직접 제어하려 하지 않고, 하이퍼바이저가 알아듣는 전용 언어(하이퍼콜)로 요청
- 결과
- 번역 과정이 생략되므로 전가상화보다 성능이 훨신 좋음
- 다만, OS의 소스 코드를 수정해야 한다는 번거로움

컨테이너 가상화(Container Virtualization)
- 컨테이너는 하드웨어를 가상화하는 것이 아니라, 호스트 운영체제(OS)의
‘프로세스’를 격리하는 방식- 구조
- 호스트 OS 위에
컨테이너 관리 소프트웨어(도커 등)를 설치하고, 그 위에 애플리케이션 실행에 필요한라이브러리(Dependencies)와코드만묶어서 실행- 특징
- 게스트 OS가 따로 없음.
- 애플리케이션 인터페이스가 호스트 OS와 직접 연결되므로 추가적인 레이어가 없어 리소스 낭비가 거의 없음
컨테이너의 장단점
- 장점 - 가볍고 빠르며 효율적이다
초경량 (Lightweight)
- 게스트 OS가 없어서 이미지 크기가 수십 MB 단위로 작음
- 덕분에 복제와 배포가 매우 쉬움
광속 실행
- OS 부팅 과정이 생략되므로, 명령어를 치는 즉시(초 단위) 애플리케이션이 시작됨
고밀도
- VM보다 리소스를 훨씬 적게 사용하기 때문에, 똑같은 사양의 서버에서 훨씬 더 많은 애플리케이션을 동시에 돌릴 수 있음
이식성
- 환경 자체를 컨테이너로 감싸버리기 때문에, 어느 컴퓨터에서나 프로그램 실행 가능
- 단점 - 제약 사항이 존재
OS 선택의 제한
- 호스트의 커널을 공유하므로, 리눅스 호스트 위에서 윈도우 전용 앱을 컨테이너로 돌리는 식의 작업은 불가능 (VM에서는 가능)
보안 격리 수준
- 커널의 취약점이 발견될 경우, 호스트와 모든 컨테이너가 위험에 노출될 가능성이 VM보다 높음


chroot(change root)cgroups (컨트롤 그룹)NamespaceImage는 주로 Docker Hub에서 구하게 되는데 Docker Hub는 공식적으로 운영되는 Docker Registry (Docker Image를 배포하는 서비스)의 이름으로 공개된 Container Image가 모여 있는 곳
도커 이미지의 종류
Docker를 사용할 때의 원칙 중 하나로 한 Container에 한 프로그램이라는 것이 있음
하나의 프로그램만 담긴 Container를 사용한다는 의미로 보안 및 유지 관리 측면에서 유리하기 때문에 많이 쓰이는 정책
워드프레스를 사용하려면 아파치(웹 서버 소프트웨어), MySQL 같은 DBMS, 워드프레스로 세 가지 소프트웨어가 필요한데 Docker를 사용해 워드프레스를 구축하는 방법은 이들을 각각 별도의 Container로 구성할 수도 있고, 한 컨테이너에 모두 집어넣는 방법도 있음
Docker Container는 쓰고 버리는 일회용품
데이터 저장
장점
단점
가상 머신(단독주택 느낌)
- 호스트와 게스트의 커널이 완전히 분리되어 있음. (ex: 윈도우 위에 리눅스 커널 설치 가능)
컨테이너(아파트 느낌)
- 모든 컨테이너가 호스트 리눅스의 커널을 공유
→ VM은 심장부터 발끝까지 완전히 새로운 생명체를 하나 더 만드는 것이지만, 컨테이너는 호스트 리눅스의 심장(커널)을 빌려 씀.
“운영체제의 동작을 완전히 재현하지는 못한다”의 의미
- 커벌 버전의 종속성
- 호스트 커널의 버전에 종속되기 때문에, 호스트 커널 버전 이상의 기능은 사용하지 못할 수도 있음
- 커널 모듈 및 드라이버 제어
- 운영체제 레벨의 아주 깊숙한 설정(네트워크 하부 프로토콜 수정, 하드웨어 드라이버 직접 제어 등)이 필요한 경우, 컨테이너는 호스트 커널의 보호를 받기 때문에 이를 마음대로 수정할 수 없음
- 시스템 콜(System Call)의 한계
- 컨테이너는 호스트 커널이 허용하는 범위 내의 시스템 콜만 사용할 수 있으므로, 아주 정밀한 운영체제 수준의 실험을 하기에는 제약이 따름


Docker ClientDocker HostDocker EngineDocker HubDocker-ComposeDocker RegistryDocker Swarm# 기존 버전 제거
sudo apt remove $(dpkg --get-selections docker.io dockercompose docker-compose-v2 docker-doc podman-docker containerd runc |
cut -f1)
# Docker 에서 제공하는 공식 GPG(GNU Privacy Guard) key 추가
sudo apt update
# 보안 웹 통신(인증서 관리)과 데이터 다운로드를 위해 필수적인 두 가지 도구 설치
sudo apt install ca-certifications curl
# GPG 키(소프트웨어 저장소의 신뢰성을 확인하는 디지털 열쇠)를 안전하게
# 보관할 전용 디렉토리 생성
sudo install -m 0755 -d /etc/apt/keyrings
# 디지털 서명(GPG 키)을 다운로드하여 내 컴퓨터에 저장하는 명령
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
# GPG 키를 시스템의 모든 사용자가 읽을 수 있도록 권한을 조정하는 설정
sudo chmod a+r /etc/apy/keyrings/docker.asc
# Docker CE 설치
sudo apt install docker-ce docker-ce-cli containerd.io dockerbuildx-plugin docker-compose-plugin
# 설치 확인
sudo docker version
# 서비스를 시작할 때 수행되도록 설정
sudo systemctl enable docker
# 데몬 확인
sudo systemctl status docker
# Docker 그룹에 현재 사용자 등록 / 등록을 안 하면 sudo를 매번 입력해야 함
sudo usermode -aG docker $(whoami)
sudo chmod 666 /var/run/docker.sock
sudo service docker start
# Image 다운로드
docker pull hello-world
# Image 확인
docker images
# Image를 Container로 생성
docker run hello-world
# Container 확인
docker ps -a
# 도커 버전 확인
docker version
-v 옵션을 추가docker system events
롤링 로그이며 한 번에 1000개의 이벤트를 보유
별도의 터미널에서 실행 시켜둠
하나의 터미너에서 실행 시켜둠
하나의 터미널에서 docker system events를 실행
다른 터미널에서 docker run -dti -p 80:80 —name=web nginx
docker stop webapp
filter 옵션
# 이미지 관리 이벤트만 확인
docker system events —filter ‘type =imag’
# 컨테이너 중지 이벤트만 확인
docker system events —filter ‘event=stop’
# 특정(webapp) 컨테이너만 확인
docker system events --filter 'container=webapp'
# 중복 옵션도 가능
docker system events --filter 'container=webapp' --filter 'event=stop'
# 지난 24시간 동안의 로그를 출력
docker system events --since 24h
# JSON 형식으로 로그 출력
docker system events --format '{{json .}}'
# -it 옵션
docker container run -it ubuntu
# 쉘 명령 수행(hostname, date)
/ # hostname
29b4f4344443
/ # date
Thu Oct 10 04:34:28 UTC 2024
docker ps
docker container ls
# 컨테이너에서 실행 중인 프로세스 확인
docker container top 컨테이너ID
# 컨테이너의 상세 정보 확인
docker container inspect 컨테이너ID
# 컨테이너의 로그 정보 확인
docker container logs 컨테이너ID
# 모든 컨테이너 종료 및 삭제
docker container rm -f $(docker container ls -aq)
# 도커 이미지 삭제
docker image rm $(docker image ls -aq)

Image를 배포하는 장소가 Docker Registry
docker 로 시작docker image pull penguindocker container run penguindocker container start penguindocker container run -d penguin -mode=1run 이라는 하위 커맨드는 container 라는 상위 커맨드 하나와만 매칭이 되므로 container 를 생략하고 docker run 으로 수행해도 됨container
start: 컨테이너를 실행stop: 컨테이너 중지create: 컨테이너를 생성run: 도커 이미지를 확인해서 없으면 내려받고 컨테이너를 생성해서 실행rm: 정지 상태의 컨테이너를 삭제exec: 실행 중인 컨테이너 속에서 명령어를 실행ls: 컨테이너 목록 출력, ps 명령으로 대체cp: 도커 컨테이너와 도커 호스트 간에 파일을 복사commit: 도커 컨테이너를 이미지로 변환image
pull: 이미지를 내려받음rm: 이미지를 삭제ls: 이미지 목록을 출력, images 명령으로 대체build: 도커 이미지를 생성volume (저장소 관련 명령)
create : 볼륨 생성inspect : 볼륨의 상세 정보를 출력ls : 볼륨의 목록을 출력prune : 현재 마운트 되지 않은 볼륨을 모두 삭제rm : 볼륨을 삭제network
connect : 컨테이너를 네트워크에 연결disconnect : 컨테이너를 네트워크 연결에서 해제create : 도커 네트워크를 생성inspect : 도커 네트워크의 상세 정보를 출력ls : 네트워크 목록 출력prune : 현재 컨테이너가 접속하지 않은 네트워크 삭제rm : 네트워크 삭제그 외
checkpoint : 현재 상태를 일시적으로 저장한 후, 나중에 해당 시점의 상태로 되돌릴 수 있음node : 도커 스웜의 노드를 관리하는 기능plugin : 플러그인을 관리하는 기능secret : 도커 스웜의 비밀값 정보를 관리하는 기능service : 도커 스웜의 서비스를 관리하는 기능stack : 도커 스웜 또는 쿠버네티스에서 여러 개의 서비스를 합쳐 구성한 스택을 관리하는 기능swarm : 도커 스웜을 관리하는 기능system : 도커 엔진의 정보를 확인하는 기능login : 도커 레지스트리에 로그인, 도커 허브에 업로드할 때 로그인이 되어 있지 않으면 이 명령을 수행해서 로그인을 시도logout : 도커 레지스트리에 로그아웃search : 도커 레지스트리를 검색version : 도커 엔진 및 명령행 도구의 버전을 출력docker search [옵션] 검색키워드
# mysql 검색
docker search mysql
# 개수 제한 검색
docker search --limit 5 mysql
# 이미지 내려받기
docker [image] pull [option] name[:TAG | @IMAGE_DIGEST]
# name 뒷 부분을 생략하면 :latest 가 자동으로 붙음
# 태그를 포함해서 다운로드: 이미지 이름은 jenkins
docker image pull jenkins/jenkins:lts
# 태그를 생략해서 latest 버전을 다운로드 이미지 이름은 debian
docker image pull debian
다운로드 성공했을 때 나오는 결과
Digetst : 이미지의 분산 해시 값으로 하나의 이미지는 여러 개의 Layer로 구성이 되는데 그 중 핵심 정보를 바이너리 형태로 제공하는 이 값을 가지고 이미지를 구분Status : 로컬에 이미지를 저장했다는 표시docker serach → [옵션]
-a , --all-tags : 저장소에 태그로 지정된 여러 image응 모두 다운로드--disable-content-trust : 이미지 검증 작업을 건너뛰는 것으로 기본값은 yes--platform : 플랫폼을 지정하는 것으로 —-platform=linux 형태로 설정-q , --quiet : 이미지 다운로드 과정에서 나타나는 상세 출력 숨김debian의 최신 버전을 docker hub에서 다운로드
docker pull debian:latest / 버전 정보 설정docker pull docker.io/library/debian / 저장소 설정docker hub 에서 다운로드 하는 것이 아니면 반드시 레지스트리 이름을 붙여야 함
REPOSITORY : Image 이름TAG : 버전 정보로 Image를 내려받을 때 따로 지정하지 않으면 latest(최신 버전)를 내려받는데, 특정 버전을 설치하고자 하는 경우는 Image_이름:버전_넘버 형태로 설정IMAGE ID : Image 식별자로 본래는 64글자이지만, 앞에서부터 12글자만 출력CREATED : Image 생성 후 경과된 시간SIZE : Image 의 전체 용량