리눅스 컨테이너 (4) - namespace [UTS]

UTS namespace

 

이전에 리눅스 컨테이너 (3)편에서는 프로세스 격리 기능 중 하나인 PID namespace에 대해 살펴보았습니다. 리눅스 컨테이너에서 사용하는 여러 종류의 namespace 중 UTS namespace는 컨테이너가 고유한 hostname과 domain name을 갖도록 하여, 네트워크 식별자 측면에서의 독립성을 제공합니다. 이를 통해 하나의 물리 서버에서 여러 컨테이너가 서로 다른 호스트 이름을 사용하며 서로 간섭 없이 동작할 수 있습니다.

 

hostname

 

hostname은 리눅스 시스템에서 네트워크 상의 시스템을 식별하기 위한 이름입니다. 보통 사람이 읽기 쉬운 형식으로 지정되며, 시스템 관리자나 자동화 도구가 각 시스템을 구분할 때 주로 사용됩니다. 예를 들어 web-server, db-node-01 같은 이름들이 hostname으로 사용될 수 있습니다.

 

시스템은 부팅 시 hostname을 설정하며, 이 값은 hostname 명령어를 통해 확인할 수 있습니다. 필요에 따라 일시적으로 변경 할 수도 있고, /etc/hostname 파일을 수정하면 영구적으로 변경할 수도 있습니다.

$ hostname

$ cat /etc/hostname

 

hostname은 DNS 또는 /etc/hosts 파일을 통해 IP 주소와 매핑되어, 사용자가 IP 대신 이름으로 시스템에 접근할 수 있게 해줍니다. 예를 들어 ping web-server 와 같이 사용할 수 있습니다. 이는 특히 IP 주소가 유동적으로 변하는 환경에서 유용합니다.

 

$ cat /etc/hosts

$ ping <hostname>

 

컨테이너 환경에서는 각 컨테이너가 고유한 hostname을 가지기 때문에, 물리적으로는 동일한 호스트에서 실행되더라도 논리적으로 독립된 시스템처럼 동작할 수 있습니다. 이는 UTS namespace를 통해 구현되며, 컨테이너 간 hostname 충돌 없이 독립적인 네트워크 식별이 가능하게 해줍니다.

 

domainname

 

domainname은 리눅스 시스템에서 설정할 수 있는 또 다른 네트워크 식별자이며, 시스템이 속한 도메인을 나타냅니다. 하지만 여기서 말하는 도메인은 흔히 알고 있는 DNS의 도메인(example.com)과는 다릅니다.

 

리눅스에서 domainname은 주로 NIS(Network Information Service) 시스템에서 사용되던 전통적인 개념으로, 시스템이 속한 NIS 도메인 그룹을 구분하기 위해 존재합니다. 과거에는 여러 서버가 하나의 NIS 도메인을 공유하며 사용자 계정, 인증 정보를 중앙에서 관리할 때 유용하게 사용되었지만, 현재는 LDAP나 Kerberos 같은 보다 현대적인 방식들이 이를 대체하면서 일반 리눅스 시스템에서는 거의 사용되지 않습니다.

 

리눅스에서 domainname 명령어를 실행하면 현재 설정된 NIS 도메인 이름을 확인할 수 있으며, 보통은 (none) 또는 빈 문자열로 설정되어 있습니다. 

$ domainname

 

UTS namespace는 hostname 뿐 아니라 domainname도 함께 격리하므로, 컨테이너나 네임스페이스 기반 환경에서는 각 환경별로 독립적인 도메인 이름을 설정할 수 있습니다. 하지만 대부분의 현대 컨테이너 환경에서는 domainname 보다는 hostname과 DNS 이름에 더 의존하는 경향이 크기 때문에 실무에서 domainname은 참고용으로 다뤄지는 경우가 많습니다.

 

UTS namespace 실습

 

우선 현재 시스템의 hostname을 다시 확인해보겠습니다.

 

unshare 명령어를 사용하여 새로운 네임스페이스(namespace)를 생성하고 bash 쉘을 실행하겠습니다. 그 다음 hostname을 변경해보겠습니다. (새 namespace를 만들면 기본적으로 초기값은 호스트와 동일합니다)

$ sudo unshare --uts /bin/bash

$ hostname container-1

 

hostname이 변경된 것을 확인 후, 호스트 입장에서는 어떻게 보일지 확인해보기 위해 bash 셸을 실행한 터미널 외에, 또 다른 터미널을 활성화한 후 다음의 명령어를 통해 확인해보겠습니다.

$ ps aux | grep bash

$ sudo nsenter -t <PID> -u hostname

 

nsenter는 리눅스 namespace 에 진입하여 다른 프로세스의 실행 컨텍스트 안으로 들어가는 도구로 다른 프로세스가 속한namespace(PID, UTS, NET 등)를 공유하거나 직접 관찰할 수 있게 해줍니다.

 

실행 결과 위와 같이 호스트의 hostname과 컨테이너의 hostname이 격리된 것을 확인해 볼 수 있습니다.

 

마치며

 

이번 글에서는 hostname에 대해 알아보고, unshare 명령어를 활용해 UTS 네임스페이스 기반의 간단한 격리 환경을 구성해보았습니다. 다음 글에서는 다른 네임스페이스에 대해서도 실습해보겠습니다.

'Infra > OS' 카테고리의 다른 글

리눅스 컨테이너 (5) - namespace [NET]  (2) 2025.06.30
리눅스 컨테이너 (3) - namespace [PID]  (2) 2025.06.02
리눅스 컨테이너 (2) - chroot  (1) 2025.05.28
리눅스 컨테이너 (1)  (2) 2025.05.11