Container/Docker

Docker attach와 exec의 차이

검정비니 2023. 10. 9. 18:09
728x90
반응형

docker attach

attach는 실행되고 있는 컨테이너에 접속하는 명령어이다. 사용법은 다음과 같다.

docker attach <container_name>

간단하게 말하자면, attach를 사용하게 되면 로컬 머신의 stdin, stdout, stderr 스트림들이 해당 컨테이너와 연결되게 된다. 즉, 표준 입출력을 연결시켜서 컨테이너 내부의 제어가 가능하도록 해주는 기능이라고 할 수 있다.

attach로 컨테이너를 접속한다면 처음 도커 컨테이너를 run하였을 때의 환경이 포그라운드로 보여지게 된다. 따라서, 만약 도커 컨테이너를 run할 시 /bin/bash로 들어간 것이 아니라면 attach를 활용해서는 들어갈 수 없다.

참고로 container의 pid 1은 리눅스에 의해 특별하게 관리되고 있어서 기본 액션 시그널을 무시한다. 그래서 따로 코드 상에서 정해놓지 않은 이상 SIGINT 또는 SIGTERM 같은 것으로 종료되지 않는다.

docker exec

exec는 실행되고 있는 컨테이너에 새로운 명령을 할 수 있는 명령어이다. 사용법은 다음과 같다.

# /bin/bash를 사용해서 interactive하게 제어하는 예제
docker exec -it <container_name> /bin/bash

exec를 통해 실행시킨 명령어는 컨테이너에서 이미 실행되고 있던 프로세스가 실행되는 동안에만 실행되며 컨테이너를 다시 시작해도 다시 시작되지 않는다. 즉, 일시적으로만 영향을 준다고 볼 수 있다.

둘의 근본적인 차이점

docker exec은 컨테이너 외부에서 명령을 실행시키기 위한 방법이라면, docker attach는 표준 입출력을 컨테이너에 붙여서 직접 명령 및 제어를 할 수 있게 하는 것이다.

또한, docker attach를 사용할 때 대상 컨테이너 내의 기본 프로세스가 웹서버와 같이 백그라운드에서 실행이 되는 형태로 작동을 한다면 표준 입출력만으로 이미 돌고 있는 프로세스의 확인 및 제어가 어려울 수도 있다.

결론적으로, 현재 컨테이너 상에서 돌고 있는 프로세스가 백그라운드에서 도는지 여부나 어떤 작업을 위해서 어떤 커멘드를 사용할 지에 따라 docker attachdocker exec 둘 중 어느 것을 선택하는 것이 좋은지가 결정되게 된다.

 

반응형