온프레미스(직접 구매/설치/관리) -> 클라우드(필요한 만큼 할당 및 비용지불/API와 SDK를 이용한 컴퓨팅 자원의 자동화)
가상머신(하드웨어 가상화 기반/스케일 업아웃을 가상머신 단위로 확장) -> 컨테이너(운영체제 기반 가상화로 컨테이너 패키지 가상화/빠른 확장성/자원 격리)
쉘스크립트 -> 자동화 도구(추상화된 형태로 자원을 기술)
리눅스 명령의 이해(서버 직접 접속/리눅스 명령어 기반으로 분석) -> 리눅스 이해(중앙 집중화된 로깅과 모니터링/수집데이터 기반 장애 판단)
애플리케이션의 코드, 종속성, 실행환경을 하나의 패키지로 구성
컨테이너 런타임이 있는 곳이라면 동일한 패키지가 실행됨
하이퍼바이저(가상머신 모니터)
호스트 컴퓨터에서 다수의 운영체제를 동시에 실행하기 위한 논리적 플랫폼
CPU/메모리/스토리지 등 리소스 에뮬레이션해 한 대의 서버에 독립된 여러 머신환경 구성
컨테이너는 애플리케이션 구동에 필요한 모든 종속성을 포함한 소프트웨어 패키지를 운영체제 위에서 가상화. 컨테이너는 리눅스 관점에서 하나의 프로세스로 대표적인 엔진은 docker
Host OS를 공유하기 때문에 단일 OS만 사용 가능
ec2 인스턴스 최초실행 후 환경세팅
# ec2 인스턴스 가동 후 OS 확인
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
# 패키지 리스트 업데이트
$ sudo apt-get update
# 필수 패키지 설치
$ sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
# docker 공식 GPG키 추가
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# docker 저장소 설정
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 패키지 리스트 다시 업데이트
$ sudo apt-get update
# docker 엔진 설치
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
# docker 설치 확인
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:53cc4d415d839c98be39331c948609b659ed725170ad2ca8eb36951288f81b75
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
다중 운영체제 이미지 확인
# 단독작업하니 root로그인
$ sudo su
# fedora image 다운로드. default 태그인 latest 설정됨
$ docker pull fedora
# image 확인
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
fedora latest 9146ee7fcff0 7 days ago 222MB
hello-world latest d2c94e258dcb 16 months ago 13.3kB
# fedora image로 컨테이너를 구동해 os를 확인하고, rm 옵션으로 바로 모든 자원 제거
$ docker run --rm fedora cat /etc/os-release
NAME="Fedora Linux"
VERSION="40 (Container Image)"
ID=fedora
VERSION_ID=40
VERSION_CODENAME=""
PLATFORM_ID="platform:f40"
PRETTY_NAME="Fedora Linux 40 (Container Image)"
# 컨테이너가 바로 종료되어 구동중인 컨테이너가 없음을 확인
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
즉 docker는 커널
이 여러 격리된 사용자 공간 인스턴스의 존재를 허용하는 운영체제 패러다임
# 호스트OS(Ubuntu 24.04) 커널정보 확인
$ uname -a
Linux ip-172-31-7-80 6.8.0-1012-aws #13-Ubuntu SMP Mon Jul 15 13:40:27 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
# 컨테이너OS(fedora) 커널정보 확인
$ docker run --rm fedora uname -a
Linux aa12c5aa7385 6.8.0-1012-aws #13-Ubuntu SMP Mon Jul 15 13:40:27 UTC 2024 x86_64 GNU/Linux
# 동일한 6.8.0-1012-aws 커널
리눅스와 리눅스 배포판, 리눅스 커널의 차이
리눅스 배포판: Ubuntu, Redhat, CentOS
= 리눅스 커널 + 컴포넌트(e.g. 윈도우시스템, 데스크톱 환경, 서비스 데몬, 패키지 매니저, 애플리케이션 등) 패키징된 산물
리눅스 커널: 하드웨어 자원을 관리하고 추상화하여 프로세스에게 할당하고 관리하는 역할을 수행
Ubuntu 호스트 Docker에 Amazon Linux 배포판 실행?
-> 리눅스 커널 + 컴포넌트(윈도우 시스템X, 데스크톱 환경X, 서비스 데몬X, 패키지 매니저O, 애플리케이션O)
Ubunt 호스트 Docker에 Windows 컨테이너 실행?
-> 커널이 다르기 때문에 동작하지 않음. Linux환경을 지원하는 Windows 이미지도 존재하지 않음. 이미지 pull이 실패
Windows 호스트에 Ubuntu 컨테이너 / MacOS 호스트에 Ubuntu 컨테이너 동작?
가능하지만, 추가적인 레이어가 더 구성됨.(가상화 환경 + LinuxKit) 따라서 Docker는 Linux환경이 권장됨..
보안/간편성/리소스 효율을 위해 디자인된 리눅스 배포판
fedora 기반으로 아래의 내용 수행
yum(Yellodog Update Modified): 레드햇 계열의 리눅스 배포판에서 사용하는 프로그램(패키지) 설치 관리 도구
# fedora package update 실행
$ docker run --rm fedora yum update -y
$ mkdir base_image && cd base_image
# Alpine Linux용 루트파일 다운로드
$ wget https://github.com/alpinelinux/docker-alpine/raw/fc965e3222f368bea8e07c1c1da70b6928281a76/x86_64/alpine-minirootfs-3.15.4-x86_64.tar.gz
$ ls -haltr
total 2.7M
drwxr-x--- 5 ubuntu ubuntu 4.0K Sep 3 01:56 ..
drwxr-xr-x 2 root root 4.0K Sep 3 02:08 .
-rw-r--r-- 1 root root 2.7M Sep 3 02:08 alpine-minirootfs-3.15.4-x86_64.tar.gz
$ mkdir alpine_root
$ tar zxf alpine-minirootfs-3.15.4-x86_64.tar.gz -C alpine_root/
$ ls -l alpine_root
total 68
drwxr-xr-x 2 root root 4096 Apr 4 2022 bin
drwxr-xr-x 2 root root 4096 Apr 4 2022 dev
drwxr-xr-x 16 root root 4096 Apr 4 2022 etc
drwxr-xr-x 2 root root 4096 Apr 4 2022 home
drwxr-xr-x 7 root root 4096 Apr 4 2022 lib
drwxr-xr-x 5 root root 4096 Apr 4 2022 media
drwxr-xr-x 2 root root 4096 Apr 4 2022 mnt
drwxr-xr-x 2 root root 4096 Apr 4 2022 opt
dr-xr-xr-x 2 root root 4096 Apr 4 2022 proc
drwx------ 2 root root 4096 Apr 4 2022 root
drwxr-xr-x 2 root root 4096 Apr 4 2022 run
drwxr-xr-x 2 root root 4096 Apr 4 2022 sbin
drwxr-xr-x 2 root root 4096 Apr 4 2022 srv
drwxr-xr-x 2 root root 4096 Apr 4 2022 sys
drwxrwxrwt 2 root root 4096 Apr 4 2022 tmp
drwxr-xr-x 7 root root 4096 Apr 4 2022 usr
drwxr-xr-x 12 root root 4096 Apr 4 2022 var
# image build를 위한 Dockerfile 생성
$ vim Dockerfile
FROM fedora
COPY ./alpine_root /
CMD ["/bin/sh"]
# 현시점 root디렉토리를 전부 copy하면 타겟디렉토리와 충돌발생하여 /bin 지정해주었음
COPY ./alpine_root/bin /bin/
# alpine image 생성(현재 디렉토리의 Dockerfile과 하위 디렉토리를 재료로)
$ docker build --tag alpine_fedora .
$ docker images | grep alpine_fedora
alpine_fedora latest e5017f9356b5 34 seconds ago 223MB
# 기존의 fedora는 yum으로 가능하지만, alpine은 apk 명령어로 구동 가능(루트파일을 엎어쳤기 때문에)
# 하지만 ... /bin만 변경되었기 때문에 되지는 않는다. 개념만 ..
$ docker run --rm alpine_fedora apk update
CNCF: 벤더 중립적인 클라우드 지향 오픈소스 프로젝트 관리재단
클라우드 네이티브: 퍼블릭/프라이빗/하이브리드 클라우드 환경에서 확장 가능한 형태로 빠르고 민첩하게 애플리케이션을 빌드하고 실행하는 것을 목표로 함
OCI(Open Container Initiative)
컨테이너 형식과 런타임의 업계 표준 구성(docker 대표적)
OCI Runtime
컨테이너 실행에 필요한 저수준 컨테이너 런타임
runc
OCI 스펙에 따라 컨테이너를 생성 및 실행하기 위한 CLI 도구
CRI(Container Runtime Interface)
쿠버네티스에서 다양한 컨테이너 런타임을 사용할 수 있도록 하는 플러그인 인터페이스
CRI runtime
컨테이너 실행에 필요한 고수준 컨테이너 런타임