일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 다트 언어
- Unity
- 구조체
- dart 언어
- c#
- git
- Data Structure
- Algorithm
- Python
- Flutter
- jupyter
- c언어
- 플러터
- 포인터
- HTML
- jupyter lab
- docker
- 깃
- github
- C++
- C# delegate
- c# 윈폼
- c# 추상 클래스
- 유니티
- C언어 포인터
- vim
- 도커
- gitlab
- c# winform
- Houdini
- Today
- Total
nomad-programmer
[DevOps/Docker] 컨테이너를 구획화하는 장치 (namespace) 본문
Docker는 컨테이너라는 독립된 환경을 만들고, 그 컨테이너를 구획하하여 애플리케이션의 실행 환경을 만든다. 이 컨테이너를 구획하는 기술은 Linux 커널의 namespace라는 기능을 사용하고 있다.
namespace는 한글로 '이름공간' 이라고 하는데, 이름공간이란 한 덩어리의 데이터에 이름을 붙여 분할함으로써 충돌 가능성을 줄이고, 쉽게 참조할 수 있게 하는 개념이다. 이름과 연결된 실체는 그 이름이 어떤 이름공간에 속해 있는지 고유하게 정해진다. 그래서 이름공간이 다르면 동일한 이름이라도 다른 실체로 처리된다.
Linux 커널의 namespace 기능은 Linux의 오브젝트에 이름을 붙임으로써 다음과 같은 6개의 독립된 환경을 구축할 수 있다.
PID namespace
PID란 Linux에서 각 프로세스에 할당된 고유한 ID를 말한다. PID namespace는 PID와 프로세스를 격리시킨다. namespace가 다른 프로세스끼리는 서로 액세스할 수 없다.
Network namespace
Network namespace는 네트워크 디바이스, IP 주소, 포트 번호, 라우팅 테이블, 필터링 테이블 등과 같은 네트워크 리소스를 격리된 namespace마다 독립적으로 가질 수 있다.
이 기능을 사용하면 호스트 OS 상에서 사용 중인 포트가 있더라도 컨테이너 안에서 동일한 번호의 포트를 사용할 수 있다.
UID namespace
UID namespace는 UID(사용자 ID), GID(그룹 ID)를 namespace별로 독립적으로 가질 수 있다. namespace 안과 호스트 OS상의 UID/GID가 서로 연결되어 이름공간 안과 밖에서 서로 다른 UID/GID를 가질 수 있다. 예를 들어 namespace 안에서는 UID/GID가 0인 root 사용자를, 호스트 OS 상에서는 일반 사용자로서 취급할 수 있다. 이것은 namespace안의 관리자 계정은 호스트 OS에 대해서는 관리 권한을 일절 갖지 않는다는 것을 의미하므로 보안이 뛰어난 환경으로 격리시킬 수 있다.
Mount namespace
Linux에서 파일 시스템을 사용하기 위해서는 마운트가 필요하다. 마운트란 컴퓨터에 연결된 기기나 기억장치를 OS에 인식시켜 이용 가능한 상태로 만드는 것을 말한다.
MOUNT namespace는 마운트 조작을 하면 namespace안에 격리된 파일 시스템 트리를 만든다. 다른 namespace 가능과 마찬가지로 namespace 안에서 수행한 마운트는 호스트 OS나 다른 namespace에서는 액세스할 수 없게 되어 있다.
UTS namespace
UTS namespace는 namespace 별로 호스트명이나 도메인명을 독자적으로 가질 수 있다.
IPC namespace
IPC namespace는 프로세스 간의 통신(IPC) 오브젝트를 namespace별로 독립적으로 가질 수 있다. IPC는 System V 프로세스 간의 통신 오브젝트라고 하는 공유 메모리나 세마포어/메시지 큐를 말한다. 세마포어란 프로세스가 요구하는 자원 관리에 이용되는 배타제어 장치이며, 메시지 큐란 여러 프로세스간에서 비동기 통신을 할 때 사용되는 큐잉 장치이다.
Docker는 이러한 namespace 장치를 사용하여 호스트 상에서 컨테이너를 가상적으로 격리시킨다. Docker를 사용할 때 특별히 의식할 필요는 없지만 Docker의 구조를 이해해 두는 것은 중요하다.
'DevOps > Docker' 카테고리의 다른 글
[DevOps/Docker] 네트워크 구성 (가상 브릿지/가상 NIC) (0) | 2020.11.18 |
---|---|
[DevOps/Docker] 릴리스 관리 장치 (cgroups) (0) | 2020.11.18 |
[DevOps/Docker] 컴포넌트 (0) | 2020.11.17 |
[DevOps/Docker] 프로그래머와 Docker (0) | 2020.11.17 |
[DevOps/Docker] 컨테이너와 서버 가상화 기술 (0) | 2020.11.13 |