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 attach와 docker exec 둘 중 어느 것을 선택하는 것이 좋은지가 결정되게 된다.
'Container > Docker' 카테고리의 다른 글
도커 리소스 사용량 제한 (0) | 2023.10.25 |
---|---|
모든 docker 이미지 지우기 (0) | 2023.10.09 |
에러 해결법: ImportError: libGL.so.1: cannot open shared object file: No such file or directory (0) | 2023.10.09 |