들어가기 전 _
이 포스트는 MSA 공부 <3편>에 이어지며 학습 포스트와는 별개로 공부하면서 궁금했던 것 또는 관련된 것을 자세히 찾아보면서 정리하는 글입니다. 글의 내용은 본 학습 포스트와는 방향성이 다를 수 있으니 참조하세요.
포스팅하게 된 배경
이제 막 컨테이너를 생성하고 돌리고 있었을 때였습니다. 컨테이너에 접속하려고 접속하는 법을 구글링을 하던 도중 많은 사람들이 옵션으로 "-it" 또는 "-i -t"를 사용하라고 작성하였습니다. 하지만 왜 해당 옵션을 사용해야 하는지 궁금해서 레퍼런스를 찾아봤더니 '-i는 STDIN을 상시 열어둔다'와 '-t는 pseudo-TTY'를 할당시킨다'라는 내용만 덩그러니 있었습니다. 그리하여 "STDIN"과 "pseudo-TTY"에 대해 자세히 알고 싶어 작성하게 되었습니다.
상황 설명
레퍼런스에 있는 명령어 설명
docker (container) exec [option] <container name or id> <command> [arg..]
실제로 사용한 명령어
docker exec -it <container name or id> sh
적용한 옵션
-i & -t (사용 시 -it로도 사용가능 )
레퍼런스 설명
-i: Keep STDIN open even if not attached
-t: Allocate a pseudo-TTY
1. " Keep STDIN open even if not attached "
1-1. "첨부" 되어 있지 않더라도 상시 STDIN을 열어두는 것을 유지한다.
여기서 첨부는 레퍼런스 명령어 사용법에 언급되어 있는 <command>의 매개변수( [arg...] )를 의미합니다. <command>는 말 그대로 container에서 사용할 명령어를 입력하는 칸입니다. 즉 매개변수는 대표적으로 쉘을 열고 사용할 커맨드를 칭 하는 것이죠. (첨부 = ex. 매개변수 [-c] = 쉘 명령어) 즉 커맨드를 매개변수로 넘기지 않더라도 STDIN을 열어두는 것을 의미합니다.
1-2. STDIN이 뭐길래 유지 시키는 거지?
STDIN은 쉽게 말해 키보드 또는 마우스를 사용한 값을 쉘까지 전달해 주는 것을 의미합니다. 즉 'STDIN을 유지한다'라는 말은 키보드나 마우스의 입력값이 추가적으로 없어도 기다린다는 말을 뜻합니다. 이것을 반대로 생각한다면 STDIN을 유지시키지 않으면 바로 쉘이 종료된다는 것과 같습니다. ( 해당 포스트에서는 STDIN를 포함하는 상위개념인 I/O streams에 대해 다루지 않습니다. 추가적인 내용은 해당 포스트를 참조해주세요!)
linux <1> | linux I/O streams란?
들어가기 전_stream이라는 단어는 데이터를 전송하는 통로로 많이 들어보셨을 거 같은데요. 클라이언트에서 서버 데이터를 다운로드할 때, 음악을 들을 때 stream라는 데이터 통로를 통해 들어오기
devlany.tistory.com
1-3. 그럼 -i를 뺀다면..?
위에서 언급한 것처럼 매개변수만 실행하고 쉘은 종료됩니다. 그렇기에 매개변수에 아무것도 입력을 안 한다면 도커 터미널에서는 아무 일도 일어나지 않은 것처럼 보일 것입니다.
2. " Allocate a pseudo-TTY "
" pseudo-TTY "를 할당한다.
두 개의 단어를 분리시켜서 해석해 보죠. 일단 pseudo는 '가상의 환경을 제공하는 것'을 의미하며 TTY는 쉽게 말하면 터미널을 의미합니다. 즉 pseudo-TTY는 가상환경을 제공하는 터미널을 의미합니다. 이것을 컨테이너와 연결할 때 할당하게 된다면 가상의 터미널이 생성되면서 터미널 입출력에 관한 권한을 부여받게 됩니다. 보안적인 측면에서 또는 명령어의 입출력 정보에 접근해야 한다면 사용하는 게 좋습니다.
그럼 뺀다면?
뺀다고 문제가 되는 건 없습니다. 비밀번호 입력할 때 비밀번호가 터미널 상에 노출되고 그러기에 사용하시는 게 기존 터미널과 같은 환경을 보장하므로 안 빼는 것이 좋다고 생각합니다.
분량이 적으니 TTY에 대해 자세히 설명해 보죠.
옛날에 TTY는 TeleTYpewriter에 약자로 전신타자기를 의미했습니다

뭔가 레트로한 느낌이 드는 모습이죠?
전신타자기는 1대 1 통신부터 1대다 통신까지 범용적으로 사용되었던 종이 인쇄 터미널입니다.
예시를 들자면_
1대 1 통신에서는 발신자가 입력한 정보가 상대 타자기 종이에 인쇄되며 1대다 통신에서는 중앙에서 각 전신타자기 터미널의 수신을 처리하고 수신 결과를 다시 수신자 타자기에 보내는 커맨드 라인과 같은 역할도 하였습니다.
TTY의 발전
기술의 발전으로 전신타자기는 드디어 종이에 인쇄하는 것이 아닌 화면을 얻게 됩니다. 바로 video display terminal(VDT)와 TeleTYpe가 합쳐졌죠. 대표적으로 DEC VT100이 있겠군요. 하지만 아직까지는 그저 송수신된 정보를 출력하는 것에서 크게 벗어나지 못했죠.
TTY의 변화
TTY는 분명 초기 컴퓨터 환경에서는 좋은 장치였습니다. 하지만 그래픽 사용자 인터페이스(GUI)와 이미지나 영상 같은 큰 용량이 필요한 데이터를 다루기 시작하게 되면서 다양한 일처리에 부적합하게 되었으며 결국 모니터와 키보드, 마우스와 같은 입력장치로 대체되었습니다. 하지만 소프트웨어로서는 달랐습니다.
소프트웨어로서 태어난 TTY [ pseudo - teletypes ]
하드웨어로서는 점점 사라졌지만 unix 시스템에서는 터미널 에뮬레이터(가상 터미널)로 사용되었으며 현재까지도 사용되고 있습니다. 이것을 pseudo - teletypes라 부르며 pts로 축약하여 부르기도 합니다.
드디어 정리하자면!
pts 기능은 옵션 중 " -t "입니다. 해당 기능을 사용한다면 가상 터미널을 통하여 컨테이너를 다룰 수 있게 되며 해당 방식은 보안적인 측면에서 유용하며 기타 상황에서도 필요할 가능성이 있기에 보통 사용하는 거 같습니다.
마지막 말
사전 지식이 있어야 개발하기 편하네요
아직은 좀 어려운 거 같아요
reference
- docker exec | Docker Docs
- docker run | Docker Docs
- 전신타자기 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)
- Linux에서 TTY란 무엇입니까? (및 tty 명령 사용 방법) (linux-console.net)
- Computer terminal - Wikipedia
- [리눅스] Terminal 개념과 명령어 (velog.io)
- TTY: 정의 및 용도 (linux-console.net)
궁금하거나 수정해야 할 부분이 있으면 댓글로 알려주세요!
'cloud > question' 카테고리의 다른 글
Question <4> | Detach mode란? (0) | 2024.11.12 |
---|---|
Question <3> | Docker engine과 docker desktop의 차이 (0) | 2024.11.10 |
docker package 특정 버전 다운로드 (0) | 2024.11.08 |
도커 엔진 삭제 및 도커 오브젝트(이미지, 볼륨, 컨테이너, 설정 파일) 삭제 (0) | 2024.11.07 |
Question <2> | workload는 무엇을 의미할까? (0) | 2024.09.29 |