Linux(Centos or RHEL)/docker

실행중인 컨테이너의 hostname 변경..?

최소양 2020. 5. 12. 09:08

아래의 링크를 참조

https://forums.docker.com/t/change-hostname-of-an-existing-container/361/15

 

Change hostname of an existing container

I found a very simple way of achieving this. Install kitematic. This tools allows you to change the hostname - it will restart - after restarting it will be the newly applied hostname.

forums.docker.com

 

컨테이너의 hostname을 변경시키는 가장 간단한 방법으로는 컨테이너를 다시 만드는 것입니다. 컨테이너를 실행시킬 때에 “--hostname {hostname}”옵션을 넣어주면 됩니다. 하지만 컨테이너를 다시 만들지 않고 컨테이너의 hostname을 바꾸려고 한다면 어떻게 해야될까요...?

 

사전지식

보통 linux에서 hostname을 바꾸는 방법은 여러 방법이 있습니다.

https://www.thegeekdiary.com/centos-rhel-7-how-to-change-set-hostname/

 

하지만 컨테이너의 설정은 보통 컨테이너를 만들 때 하기 때문에, 컨테이너가 만들어진 후, 설정을 다시 하려는 행동은 보통 하지 않습니다... 그래도 도커 포럼을 보다가 컨테이너를 실행하고 있는 상태에서 hostname을 변경하는 방법을 찾아서 기록해 둡니다.


먼저 테스트용 컨테이너를 hostname을 지정하지 않고 만듭니다.

[root@centos77 ~]# docker run -it -d --rm --name hostTest ubuntu

182ab203cadf368270914dacf933ee81145e0a9eba5426e653f5b88abd446d3b

[root@centos77 ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

182ab203cadf ubuntu "/bin/bash" 17 seconds ago Up 17 seconds hostTest

[root@centos77 ~]# docker exec hostTest hostname

182ab203cadf

[root@centos77 ~]#

 

hostname이 컨테이너의 id인 것을 확인할 수 있습니다.

 


실행중인 컨테이너의 pid를 확인합니다.

[root@centos77 ~]# docker inspect -f '{{ .State.Pid }}' hostTest

7077

[root@centos77 ~]#

 


nsenter명령어를 이용하여 컨테이너에 접근하고, “hostname” 명령어로 컨테이너의 hostname을 변경합니다.

[root@centos77 ~]# nsenter --target 7077 --uts

[root@182ab203cadf ~]# hostname "changedHostName"

[root@182ab203cadf ~]# exit

logout

[root@centos77 ~]# docker exec hostTest hostname

changedHostName

[root@centos77 ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

182ab203cadf ubuntu "/bin/bash" 2 minutes ago Up 2 minutes hostTest

[root@centos77 ~]#

 

컨테이너의 hostname이 변경된 것을 확인할 수 있습니다.

 

 

위와 같이 단순히 컨테이너에 접근하여 “hostname”명령어를 이용할 것이면 docker exec 명령어를 이용하여도 되지 않느냐 하시는 분들도 있을 것입니다. 물론 가능합니다. 컨테이너가 “--privileged” 옵션이 추가된 상태에서 만들어졌을 경우에는 말이지요 하지만 컨테이너가 privileged 권한이 없을 경우에는 아래와 같은 에러가 발생합니다.

 

root@901c9b9db40f:/# hostname ChangedHostName

hostname: you must be root to change the host name

root@901c9b9db40f:/#

 

그러므로 nsenter명령어를 이용하는 것이 가장 좋은 방법이라고 생각이 듭니다.

 

nsenter에 관한 자료는 아래와 같은 것들이 있습니다.

http://man7.org/linux/man-pages/man1/nsenter.1.html

https://github.com/jpetazzo/nsenter

https://access.redhat.com/solutions/1611883