# container 에 없는 iptables 커맨드 실행하기
# 방법1
# container 시작시 호스트 볼륨 연결하기# 이미 컨테이너가 존재하면 삭제(--rm)
# 호스트의 root path 를 컨테이너의 /host 로 연결하고, (--volume /:/new_root)
# 컨테이너에게 확장권한을 부여한다.(--privileged)
# 컨테이너 실행시 /new_root 로 root 를 변경한다.
docker run -it \
--name=ysoftman
--hostname=ysoftman \
--rm \
--volume /:/new_root \
--privileged \
busybox \
chroot /new_root
# 이제 컨테이너 내에서 호스트의 커맨드가 실행된다.
iptables -t filter -S
# 방법2
# 컨테이너 내에서 --pid=host 로 호스트 PID namespace 를 사용한다.
# 호스트의 pid 1(system) 대상으로(-t) -m(--mount[=file], 파일을 명시하지 않으면 target process 의 mount namespace 조인)
docker run -it \
--name=ysoftman \
--hostname=ysoftman \
--rm \
--privileged \
--pid=host \
busybox \
nsenter -t 1 -m sh
# 이제 컨테이너 내에서 호스트의 mount 정보로 호스트의 커맨드가 실행된다.
iptables -t filter -S
# 방법3
# 그냥 컨테이너 실행
docker run -it --name=ysoftman --hostname=ysoftman busybox
# 터미널을 하나 더 열고 호스트에서
# 위 컨테이너의 pid 의 network namespace 조인해 iptables 명령 실행한다.
# -t(--target) pid -n(--net[=file], 파일을 명시하지 않으면 target process의 네트워크 네임스페이스로 조인)
nsenter -t $(docker inspect --format {{.State.Pid}} ysoftman) -n iptables -t filter -S
긋 ~ 입니다 :-)
답글삭제