프로그래밍/도커

Docker에서의 -i -t의 의미

Hwan2 2023. 1. 15. 21:17
반응형

Docker를 사용할 때, 도커 컨테이너를 실행 후 해당 컨테이너에 접근하기 위해서 위 옵션을 붙여서 사용합니다.

 

물론 -d(Detached)로 실행한다면 위 옵션은 필요하지 않겠죠.

 

그럼 -i와 -t는 무슨 역할을 하며 이거 2개의 옵션이 없으면 도커 컨테이너 내부에 접근해서 명령어를 실행하지 못할까요?

 

이것을 설명하기에 앞서 UNIX는 다음과 같은 말을 합니다. "everything is a file".

이 글을 읽고 저 문장이 무엇을 뜻하는지 이해하시면 성공한 겁니다~

 

1. -i (STDIN)

https://docs.docker.com/engine/reference/commandline/exec/

 

docker exec

docker exec: The `docker exec` command runs a new command in a running container. The command started using `docker exec` only runs while the container's primary process (`PID 1`) is...

docs.docker.com

도커 홈페이지에 가보면 해당 명령어에 대한 설명이 나와있습니다.

STDIN에 대해 open한다는 것입니다.

 

즉, 도커 컨테이너 내부에서 STDIN(file descriptor = 0)을 open하여 입력을 받겠다라는 것입니다.

하지만 tty로 연결이 안되어 있기 때문에, 다음과 같은 동작이 일어납니다.

STDIN과 STDOUT으로 이뤄져 있기 때문에, Input과 Output은 되지만, 대화식은 전혀 이뤄지지 않습니다.

접속된 터미널도 확인이 안됩니다. 또한 tail -f 같은 명령어를 실행시키면 빠져나올 수 없습니다.

 

2. -t (Teletypewriter)

tty는 콘솔 터미널을 뜻합니다. 그래서 대화형이 가능하게끔 해줍니다.

정확히는 tty -> pty -> pts로 가게되어서, 도커에 접소할 때는 pts로 물리게 됩니다.

자세한 내용은 나중에 설명하겠습니다.

 

그래서 -t만 입력한 후 도커에 접속하게 되면 다음과 같이 됩니다.

터미널 접속까지는 되지만, input이 되질 않는걸 확인할 수 있습니다.

하지만 터미널 접속은 된 것이므로 echo "hihi" >> /dev/pts/1  을 했을 때 text가 넘어간것을 확인할 수 있습니다.

 

결국 원할한 입력과 출력을 하려면 -it는 필수적으로 붙여줘야 합니다.

그리고 저희가 원격 터미널로 접속해서 커널과 대화하는 것 자체가 파일에 읽고 쓰기를 반복하는 과정과 같습니다.

그래서 /dev/pts/1 에 텍스트를 썼을 때, 해당 터미널을 물고있는 클라이언트에게 텍스트가 전달된 것입니다.

 

반응형