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 root@d7fd8756b310:/# cat /etc/os-release |
[root@580ad5ddcf08 /]# uname -a [root@580ad5ddcf08 /]# cat /etc/os-release |
결론, 둘 다 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 |