본문 바로가기

개발관련/Container

외부에서 Docker 컨테이너로 명령어 날리는 방법

반응형

간혹 Docker를 사용하다보면, 컨테이너 내부에서 리눅스 명령어를 실행해야 하는 일이 있다.

 

이 때, 직접 Docker 컨테이너에 docker exec 명령어로 접속하여 명령어를 실행할 수도 있지만, 컨테이너 내부에 설치되어 있지 않은 라이브러리를 이용해야 할 수도 있고, 컨테이너로 직접 들어가는 작업이 번거로울 수 있다.

 

따라서 컨테이너를 띄우는 주체인 워커 노드에서 직접 Docker 컨테이너로 명령을 실행(주입) 시킬 수 있는 방법을 알아보자.

 

 

먼저 Docker 컨테이너의 ID가 필요하다. Docker 컨테이너의 ID는 아래와 같이 찾을 수 있다.

$ sudo docker ps -a | grep {내가 찾으려는 컨테이너 명}

# 예)

$ sudo docker ps -a | grep nginx
41e3f5132556       nginx:latest       "/docker-entrypoint.…"       8 minutes ago       Up 8 minutes       quizzical_curie

# 여기서 컨테이너의 ID는 41e3f5132556 이다.

 

 

위와 같이 컨테이너 ID를 찾았으면 이제 이것을 이용해서 컨테이너 내부에서 돌고 있는 프로세스의 PID를 찾아내야 한다.

왜냐하면 이 PID에게 명령을 날릴 것이기 때문이다.

 

아래와 같이 컨테이너 ID로 PID를 찾는다.

$ sudo docker inspect -f '{{.State.Pid}}' {컨테이너의 ID}

# 예)

$ sudo docker inspect -f '{{.State.Pid}}' 41e3f5132556
26953

# 여기서 41e3f5132556 컨테이너의 PID는 26953 이다.

 

 

이제 PID를 찾았으니 마지막으로 nsenter 명령어를 통해 PID에 날릴 명렁어를 실행한다.

아래와 같이 명령어를 입력한다.

$ sudo nsenter -t {PID} -n {명령어}

# 예)

$ sudo nsenter -t 26953 -n ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

이렇듯 위처럼 nsenter 명령어를 사용하면 컨테이너에 직접 들어가지 않더라도 외부에서 명령어를 날려 간단히 테스트 할 수 있다.

 

 

마지막 필살기) 위 과정을 아래와 같이 한번에 처리할 수 있다.

$ sudo docker ps -a | grep {컨테이너명} | cut -d ' ' -f 1 | xargs sudo docker inspect -f '{{.State.Pid}}' | xargs -i sudo nsenter -t {} -n {명령어}

# 예)

$ sudo docker ps -a | grep nginx | cut -d ' ' -f 1 | xargs sudo docker inspect -f '{{.State.Pid}}' | xargs -i sudo nsenter -t {} -n whoami
root
반응형

'개발관련 > Container' 카테고리의 다른 글

private한 container registry 만들기(docker registry)  (0) 2020.10.26