Docker

Docker - 이론

sysman 2021. 3. 9. 00:27

 

 

Docker 와 VM

 

Docker 기술

Docker -> container service -> orchestration tool -> docke swarm(cluster = kubernetes)

- host OS 에서 논리적으로 프로세스를 나눠 애플리케이션 동작을 위한 라이브러리와 애플리케이션등을 컨테이너 안에 넣고 개별 서버처럼 사용

 

 

Container를 사용하는 이유?

 - VM 가상화보다 더 가벼운 (경량화) 기술이다

 - 애플리케이션의 개발과 배포가 빠르다

 - 다중 애플리케이션의 독립성 과 확장성이 높다

 - 가상화의 핵심기술 (프로세스의 격리)

 

Docker container 장점

- 환경격리 :다른 컨테이너에 영향을 주지 않는 폐쇄된 환경 제공

- 빠른 배포 : 컨테이너에 커널이 없으므로 VM에 비해 빠르게 배포

- 다중 환경 배포 : 단일 호스트에 비해 다양한 image 사용 가능

- 재사용성 : 여러 애프리케이션을 재 사용 가능

- 실행중인 컨테이너 접속 및 명령어 수행, apt-get, yum 등 패키시 설치 가능

- 리소스(cpu, mem, disk) 사용량 필요에 따라 조절 가능

 

 

 

 

 

Docker는 Linux Container 기술(LXC)을 이용하고

Linux Container 는 커널의 namespace, chroot, cgroups 역할을 통해 동작

namespace : 프로세스를 격리하고 독립적인 가상화기술 , network 도메인 분리, sub-net, ip 할당

cgroups : 하드웨어 자원을 배분하는 기술, resource 관리

chroot : 컨테이터에 pid 1 을 할당

 

Docker managed 핵심 : image, container, network, volume

 

Infrastructure as code 로 관리 : Dockerfile, docker-compose.yml

 

이미지 저장소

public registry : hub.docker.com

private registry : local(registry container, nexus), global(google,aws,azure)

 

도커의 철학 : one process, one container

 

도커 파일 위치(Docker Container + Docker image) : /var/lib/docker

 

 

 

 

jeff@docker-host01:~$ docker pull mysql:5.7

5.7: Pulling from library/mysql

45b42c59be33: Already exists

b4f790bd91da: Pull complete

325ae51788e9: Pull complete

adcb9439d751: Pull complete

174c7fe16c78: Pull complete

698058ef136c: Pull complete

4690143a669e: Pull complete

66676c1ab9b3: Pull complete

25ebf78a38b6: Pull complete

a6510e5d6228: Pull complete

90ca045d52c5: Pull complete

Digest: sha256:9fc60b229633ce1d1f2ee306705152d4b001056fb27c1b5debe23a732df72b70

Status: Downloaded newer image for mysql:5.7

docker.io/library/mysql:5.7

jeff@docker-host01:~$

 

각각의 Pull complete 는 layer(Read/Write)를 의미

각 layer의 집합들을 Union File System(UFS)-Read Only 

 

Docker 컴포넌트

- Docker engine(도커 코어기능) : runC - Containerd - dockerd

- Docker registry( 이미지 공개 및 공유)

- Docker compose(여러 container 통합관리)

- Docker machine (도커 실행 환경 구축)

- Docker Swarm(클러스터 관리) 

 

 

 

Docker 동작구조

 - container 를 나눌때 리눅스 커널의 namesapce 기능을 사용

 

- namespace

- PID namespace : PID와 프로세스를 분리, namespace가 서로 다른 프로세스는 서로 액세스 불가

- Network namespace : 네트워크 디바이스, ip address , 포트번호, 라우팅 테이블 , 필터링 테이블 등 네트워크 리소르를 namespace 별로 할당 가능

- UID namespace : namespace 안과 밖에서 서로 다른 UID,GID를 가질 수 있음, namespace 관리자 계정이 hostOS 관리 권한을 가질 수 없으므로 보안에 강함

- MOUNT namespace : 마운트를 조작하여 namespace 내에 파일 시스템 트리 구성, namespace 내의 마운트는 hostOS와 다른 namespace에서 액세스 할 수 없음

-UTS(Unix Time Sharing) namespace : namespace별로 host명과 도메인명을 독립적으로 가질 수 있음

- IPC(interprocess communication) namespace : 프로세스 간의 통신(IPC) 오브젝트를 namespace별로 가질 수 있음, PID: 공유메모리와 세마포어 및 메세지 큐의 system v 프로세스 간 통신 

 

jeff@docker-host01:/proc/1/ns$ sudo ls -l
[sudo] password for jeff:
total 0
lrwxrwxrwx 1 root root 0  3월  8 23:46 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0  3월  8 23:46 ipc -> 'ipc:[4026531839]'
lrwxrwxrwx 1 root root 0  3월  8 23:46 mnt -> 'mnt:[4026531840]'
lrwxrwxrwx 1 root root 0  3월  8 23:46 net -> 'net:[4026531992]'
lrwxrwxrwx 1 root root 0  3월  8 23:46 pid -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0  3월  9 00:00 pid_for_children -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0  3월  8 23:46 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0  3월  8 23:46 uts -> 'uts:[4026531838]'
jeff@docker-host01:/proc/1/ns$

 

 

리소스관리구조(cgroup:control group)

- 프로세스 및 쓰레드 를 그룹화하여 관리

- hostOS의 cpu, 메모리와 같은 리소스를 그룹별로 제한 가능

- 한 컨테이너가 같은 host OS상에서 동작하는 다른 컨테이너에 영향을 주는 일을 막을 수 있음

-계층 구조로 프로세스를그룹화하여 관리 가능

-하위 cgroup 은 상위 cgroup 의 제한 설정이 그대로 적용

 

네트워크 구성(가상 브릿지와 가상 nic)

- Docker의 container는 서버의 물리 nic와 별도로 각 container마다 가상 nic가 할당

- 가상 nic는 docker0라는 가상 bridge에 접속하여 container끼리 통신

- docker0,는 Docker 데몬을 기동한 후에 생성되는 172.17.0.1 주소가 할당

- Docker에서 container를 구동하면 container에 172.17.0.0/16 subnet mask 를 가진 private ip address 가 eth0에 자동으로 할당

- eth0 에는 hostOS에 생성된 가상nic(vethxxx)가 페어로 할당

- vethxxxx 는 osi 7 계층 layer 2 의 가상 네트워크 인터페이스로서 페어된 nic끼리 터널링 통신을 수행

- 가상 nic(vethxxxxx)는 container에서 eth0 으로 인식함

 

Docker가 프로세스 인 이유?

Ubuntu 컨테이너와 Centos 컨테이너 의 커널

ubuntu container centos container

root@d7fd8756b310:/# uname -a
Linux d7fd8756b310 5.0.0-23-generic #24~18.04.1-Ubuntu SMP Mon Jul 29 16:12:28 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

root@d7fd8756b310:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
VERSION_ID="20.04"

[root@580ad5ddcf08 /]# uname -a
Linux 580ad5ddcf08 5.0.0-23-generic #24~18.04.1-Ubuntu SMP Mon Jul 29 16:12:28 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

[root@580ad5ddcf08 /]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"

결론, 둘 다 OS는 다르지만 커널은 같다. 즉 커널은 공유해서 사용한다.

 

컨테이너는 리눅스 커널에 포함된 프로세스 격리 기술을 이용하기 때문에 bash 쉘 이라는 것도 하나의 프로세스이다.

예를 들면, linux가부팅 되고 제일처음 시작하는 것이 PID=1 init(systemd) 이다. 하지말 host OS 에서 process id =14133 으로 시작된다고 할때 컨테이너에는 pid=14133 이 곧 pid=1로 존재

 

가능한 이유?

도커는 pid를 namespace로 분리하기 때문에 도커 컨테이너 에서의 pid=1이 될 수 있다

 

 

bridge 

- 소프트웨어 적으로 구현

- 브릿지 기능 ( learning, flooding, forwarding, filtering, agind)

- store-and forward 방식 사용( 들어오는 프레임을 전부 받은 후 다음 처리를 시작하는 방식)

 

Docker 네트워크 기능

1. none

2. host

3. bridge

4. macvlan

5. overlay

 

- NAPT (network address port translation)

하나의 ip address를 여러 컴퓨터와 공유하는 기술로 ipaddress와 포트 번호를 매핑

- 예) 1.1.1.1:80  ---매핑---> 10.1.0.1:8080  //외부에서 접속 할때 1.1.1.1:80으로 하면 10.1.0.1:8080으로 접속

       |퍼블릭|                      |프라이빗|

 

 

 

'Docker' 카테고리의 다른 글

도커 스웜 모드, docker swarm  (0) 2021.03.15
docker-compose  (0) 2021.03.15
Docker - 명령어  (0) 2021.03.15
Docker 설치 및 삭제  (0) 2021.03.10