반응형
간혹 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 |
---|