Kubernetes Advanced Networking Study(KANS)의 1주차 내용을 학습하며 정리한 내용입니다.
💡 운영체제에서 프로세스는 하나의 작업 단위이다. 그렇다면 프로그램과 프로세스의 차이는 뭘까? 프로그램은 하드디스크 같은 저장장치에 저장되어 있는 정적인 상태고, 프로세스는 실행을 위해 메모리에 올라온 동적인 상태다. 폰노이만 구조에서 프로그램이 실행된다는 것은 해당 코드가 메모리에 올라와서 작업이 진행된다는 의미다. 따라서 누군가가 작성한 프로그램이 실행되면 프로세스가 된다.
💡 Docker는 Linux 커널 기술을 베이스로 작동한다.
- namespace: Docker는 컨테이너라는 독립된 환경을 만들고, 그 컨테이너를 구획화하여 애플리케이션 실행 환경을 만드는데, 그때 사용하는 기능이 Linux 커널의 namaspace다. 이것은 한 덩어리의 데이터에 이름을 붙여 분할함으로써 충돌 가능성을 낮추고, 쉽게 참조할 수 있게 할 수 있게 하는 개념이다.
- cgroups: Docker에서는 물리 머신 상의 자원을 여러 컨테이너가 공유하여 작동한다. 이 때 사용하는 기능이 Linux 커널 기능인 ‘control groups(cgroups)’이다. 리눅스에서는 프로그램을 프로세스로서 실행하는데, 프로세스는 하나 이상의 스레드 모음으로 움직이게 된다. cgroups는 프로세스와 스레드를 그룹화하여, 그 그룹 안에 존재하는 프로세스와 스레드에 대한 관리를 수행하기 위한 기능이다. 또한 계층 구조를 사용하여 프로세스를 그룹화하여 관리할 수도 있다.
▪️ PID namespace: PID란, 리눅스에서 각 프로세스에 할당된 고유 ID이다. 여기서 PID namespace는 PID와 프로세스를 격리시킨다. namespace가 다른 프로세스끼리는 서로 액세스할 수 없다.
▪️ Network namespace: 네트워크 디바이스, IP 주소, 포트 번호, 라우팅 테이블, 필터링 테이블 등과 같은 네트워크 리소스를 격리된 namespace마다 독립적으로 가질 수 있다. 이 기능을 사용하면 호스트 OS 상에서 사용 중인 포트가 있더라도 컨테이너 안에서 동일한 번호의 포트를 사용할 수 있다.
▪️ UID namespace: UID(사용자 ID), GID(그룹 ID)를 namespace별로 독립적으로 가질 수 있다. namespace 안과 호스트 OS상의 UID/GID가 서로 연결되어 namespace 안과 밖에서 서로 다른 UID/GID를 가질 수 있다. 예를 들어 namespace 안에서는 UID/GID가 0인 root 사용자를, 호스트 OS 상에서는 일반 사용자로 취급할 수 있다.
▪️ Mount namespace: Linux에서 파일 시스템을 사용하기 위해서는 마운트가 필요하다. 마운트란 컴퓨터에 연결된 기기나 기억장치를 OS에 인식시켜 이용 가능한 상태로 만드는 것이다. Mount namespace는 마운트 조작을 하면 namespace 안에 격리된 파일 시스템 트리를 만든다. 다른 namespace 기능과 마찬가지로 namespace 안에서 수행한 마운트는 호스트 OS나 다른 namespace에서는 액세스할 수 없게 되어 있다.
▪️ UTS namespace: namespace 별로 호스트명이나 도메인명을 독자적으로 가질수 있다.
▪️ IPC namespace: 프로세스 간의 통신(IPC) 오브젝트를 namespace별로 독립적으로 가질 수 있다.
- 터미널1 (Ubuntu Host)![](https://velog.velcdn.com/images%2F200ok%2Fpost%2Fe8aa3a27-6aac-49f6-af43-8e24160c9335%2Fimage.png)docker run —rm -it ubuntu bash 명령어 실행 후, 컨테이너 내부에서 아래 내용 실행![](https://velog.velcdn.com/images%2F200ok%2Fpost%2F2430e0ec-0eb4-4773-9470-a14ac7724b28%2Fimage.png)
- 터미널2 (Host Shell)
![](https://velog.velcdn.com/images%2F200ok%2Fpost%2F7d94fa91-1057-46d0-8b2a-860080c68ff4%2Fimage.png)![](https://velog.velcdn.com/images%2F200ok%2Fpost%2F82f82e9f-2fc9-4731-bbc3-22e78ac761b2%2Fimage.png)![](https://velog.velcdn.com/images%2F200ok%2Fpost%2Ff7d4a0c5-225e-49c5-a871-9abf36bd272b%2Fimage.png)호스트에서 컨테이너에서 동작하는 sleep 종료
- 터미널1 (Ubuntu Container)
sleep 프로세스가 사라진 것을 알 수 있다. 즉, 호스트에서 컨테이너 프로세스를 컨트롤 할 수 있다.