해당 게시글의 모든 이미지 출처
https://devocean.sk.com/vlog/seminar/20220930_container.pdf
<살펴볼 내용>
Container 개념
Linux Namespace 종류 및 활용
컨테이너 간 리눅스 네트워크 개념
Docker 활용
Container
Container 구조
위 그림에서 만약 Virtual Machine(VM)이라면 Container engine이 Hypervisor가 되고 Container 내에 OS가 추가된다.
VM과 Container의 가장 큰 차이는 컨테이너는 OS를 따로 설치하지 않는다는 것이다.
참고) 컨테이너는 OS를 설치하지는 않지만 내부적으로 Root file system을 사용한다.
사실상 커널을 새롭게 쓴다는 의미보다는 file system 사용을 위해서 ubuntu나 centOS가 필요한 것이지 실제로 커널과 같은 것들이 필요해서 OS가 포함되는 것은 아니다.
What is Container
호스트에서는 프로세스를 띄울 때 바이너리 파일을 ftp 등을 사용해서 서버에 올리고 실행시킨다.
이 과정을 하나의 이미지로 패키징하고 패키징된 이미지를 사용해서 쉽게 배포하고 프로세스를 띄울 수 있다.
컨테이너는 프로세스를 isolation(격리)시켜서 실행시킨다. Container에 C그룹과 같은 메모리 자원을 줄 수 있고, 다른 프로세스들이 볼 수 없도록 네임스페이스로 프로세스를 isolation 하여 실행한다.
What is Process
프로그램에 라이브러리, 환경변수, 자원을 포함한 것을 프로세스라고 한다.
Container 생성 배경
고민 )프로세스만 격리하고 vm처럼 사용할 수는 없을까?
vm 없이 프로세스만 서비스 할 수 없을까? 서로 격리만 시켜주면 되지 않을까?
결론 ) 프로세스를 격리시킬 수 있는 namespace(격리된 공간)을 만들자.
OS의 기본 프로세스들(systemd..) 에게도 격리된 공간이 필요할까? → 예외 없이 동일하게 적용하자.
Container에 대한 기본 개념
1. 리눅스 서버에서 실행되는 모든 프로세스는 네임스페이스(namespace)를 가진다. 즉, 격리시킬 수 있다.
프로세스만 격리시키면 해결되나? VM과 비교해서 추가로 무엇을 격리시키면 좋을까?
2. 프로세스에서 사용하는 호스트의 정보/자원을 격리시키자.
호스트에 대한 리소스 메모리, 호스트가 사용하는 네트워크, 디바이스 등을 격리시키면 프로세스도 vm처럼 쓸 수 있지 않을까?
* namespace의 종류
- 호스트 네임 : uts (Unix Timesharing System) 호스트 네임을 컨테이너 안에서 네임스페이스로 각각 줄 수 있음
- 프로세스 ID : pid
- 유저 : user
- 네트워크 : net
- 스토리지 : mnt
- 프로세스간 통신 : ipc
- cgroup
참고) 로컬 기준으로 봤을 때 우리는 네임스페이스를 따로 지정하지 않기 때문에 호스트의 기본이 되는 1번 네임스페이스가 가지는 것들을 상속받아서 쓰고있다. 그래서 일반적으로 프로세스를 띄우면 다른 프로세스에서도 명령어로 볼 수 있으며 프로세스들끼리 서로 죽일 수 있다. 같은 네임스페이스를 써서 공유되기 때문이다. namespace 안에 프로세스가 할당된다고 보면 된다.
Container Network .. 상세 내용은 세미나 영상 참고
쿠버네티스는 하나의 pod에 여러개의 컨테이너를 넣을 수 있다 → pod가 하나의 네임스페이스 단위이며, 네임 스페이스 단위에 컨테이너가 여러개 들어갈 수 있다.
쿠버네티스 pod에 컨테이너가 2개 이상 있을 때, 각각의 컨테이너는 동일한 ip를 가진다.
컨테이너끼리는 ip가 같기 때문에 port로 통신한다 → 파드 내에서 컨테이너는 서로 다른 port를 가진다.
위 이미지를 참고하여 Red에서 Blue를 호출할 때 Red는 Blue의 ip가 어느 호스트에 있는지 알 수 없다.
Calico는 해당되는 ip 대역이 어느 호스트에 있는지 셋팅을 하기 때문에 calico 네트워크는 어떤 pod가 어떤 호스트에 떠있는지 알고있다. 따라서 Calico 네트워크를 사용해서 통신한다.
Container
Host에도 자신의 namespace가 있고, container는 자신만의 namespace를 만들 수 있다.
pod 설정에 host network를 true로 설정하면 host network를 사용할 수 있다. 이는 host network와 함께 쓴다는 의미이다.
namespace는 os kernel 안에 포함되어 있으므로 안정적이다.
container를 isolation 시키는 영역은 namespace이고, CGroup(Control Group)은 해당되는 cpu를 isolation 시킨다.
How to use docker
process를 실행시키려면 binary 파일이 필요한데, 이를 어떻게 쉽게 만들고 배포할 수 있을까?
이미지가 하나의 binary 파일이 되는데, layer가 쌓여있는 구조를 가진다.
이미지(binary 파일)을 호스트에 던져서 run 명령어로 실행시키면 container가 생성된다.
Dockerfile에 보면 base image를 어떻게 할지? (centOS?) 설정하는게 있는데 이것이 file system을 포함하는 것이다.
Dockerfile sample)
FROM golang.. << 여기에 golang과 file system이 포함되어 있다. 아래 Redis image inspect 참고
$ docker image build --no-cache -t -sunrise/helloworld-docker -f Dockerfile .
$ docker image ls | grep hello
- host와 docker가 통신할 수 있게 8080으로 설정한다.
$ docker container run -d -p 8080:8080 --name hello1 --rm sunrise/helloworld-docker
$ docker ps
$ netstat -tulpn | grep 8080
-- docker 삭제
$ docker rm -f hello1
Docker Architecture
Docker를 설치하면 CLI와 Daemon이 있다. CLI에서 명령어를 통해 도커데몬에 RestAPI 호출을 한다. 호출을 받은 데몬이 containerd를 호출하고 OCI 스펙으로 컨테이너를 실행시킨다.
로컬에 이미지A를 만들었는데 다른 호스트에서 이미지A를 사용하고 싶다면 container registry에 올려놓고 사용한다. container registry를 사용하면 다른 호스트에서 자동으로 다운받고 실행시킬 수 있다.
OCI : 이미지 호환을 위해 어떻게 할 것인가에 대한 spec.
OCI를 만족하고 있기 때문에 다른 컨테이너에서도 도커 이미지를 가지고 runtime으로 생성시킬 수 있다.
Container Image
build time은 이미지를 한번 만들면 read only의 성질을 가진다. Read only 이미지를 가지고 런타임 될 때 컨테이너가 생성되면서 프로세스가 실행된다.
Copy on write는 Read only 이미지를 copy해오고 그 위에 write를 하는 것이다. 이미지를 가지고와서 위에 RW 영역에 read write를 한다.
Redis image inspect
Image는 모두 레이어로 형성되어있다. redis의 base image는 debian이다.
Dockerfile - multi-stage
Docker에서는 이미지 사이즈를 줄이는 것이 중요하다.
1) Base 이미지를 alpine으로 사용함으로써 줄일 수 있다.
2) multi-stage 사용 : build는 일반 이미지에서 하고 binary파일만 복사해서 실행할 수 있게 만드는 구조이다.
위 이미지는 기존에 856MB 였던 이미지를 alpine, multi-stage를 사용해서 321MB 까지 줄인 것이다.
잘 사용하면 50MB 까지도 줄일 수 있다고 한다.
What we need
하나의 호스트 내에서 여러 개의 컨테이너가 뜰 수 있고 서로 고립되어 실행할 수 있어야 한다.
호스트가 여러 대일 때 어느 호스트에 컨테이너가 실행될 지 알아야하고, 서로 다른 호스트에서 실행되고 있을 때 통신이 가능해야 한다.
컨테이너가 어느 호스트 위에 배포될지, 어떤 컨테이너를 중요도에 따라서 먼저 배포할지 (스케줄링과 배치)
서로 다른 호스트에 떠있는 컨테이너끼리 통신 (네트워크 통신)
호스트 내 컨테이너가 필요하면 여러개가 되는 것 (스케일 아웃)
외장 스토리지를 활용할 수 있는 부분 (Volume)
References
'클라우드' 카테고리의 다른 글
CKA 자격증 준비 (24.10.28 업데이트/ 24.11 시험 예정) (0) | 2024.09.24 |
---|---|
[Calico 01] AS(IRP, ERP)와 BGP란 무엇인가? (0) | 2022.12.03 |
Kubernetes NodePort vs LoadBalancer vs Ingress 비교 (1) | 2022.11.24 |
댓글