docker exec 명령어 변경
"docker run -p 8080:80 httpd" 명령어를 실행하면 다음과 같이 foreground 환경에서 서버가 동작한다.
그리고 해당 터미널 창을 닫은 뒤 실행 중인 프로세스를 확인해보면 httpd가 여전히 foreground 상태에서 실행 중인 것을 확인할 수 있다.
만약 "It works!"라는 문구를 바꾸고 싶은 경우 실행 중인 컨테이너에 연결해 명령어를 실행해야 한다.
하지만 이 경우 'docker attach' 명령어를 입력해도 변경할 수 없다.
- 'docker run -p 8080:80 httpd' 명령어로 실행한 httpd 컨테이너는 웹 서버로 동작하고 있다.
- 이 경우 컨테이너는 표준 입력(stdin) 스트림 대신, 클라이언트로부터 오는 HTTP 요청을 처리하고 응답을 보내는 등의 작업을 수행하고 있다.
- 따라서 'docker attach' 명령어로 컨테이너에 연결하더라도, 컨테이너는 HTTP 요청에 응답하는 작업에 전념하고 있기에 명령을 내릴 수 없다.
- 대신에 'docker attach' 명령어로 컨테이너에 연결해 HTTP 서버의 로그를 실시간으로 확인하는 것은 가능하다.
- 하지만, 실제로 웹 서버의 동작을 변경하거나 명령을 실행하기 위해서는 'docker attach' 명령어 대신 'docker exec' 명령어를 사용해 컨테이너 내부에서 명령을 실행하는 것이 바람직하다.
요약
'docker attach' 명령어는 컨테이너의 표준 입력(stdin) 스트림에 연결하는 목적으로 사용되며, HTTP 서버와 같이 입력을 요구하지 않는 상태에서 명령을 내릴 수 없다.
'docker exec' 명령어를 사용하여 컨테이너 내에서 작업을 수행하는 것이 더 적합하다.
docker exec
실행중인 컨테이너가 존재하고 실행중인 컨테이너의 커맨드(COMMAND)를 변경해서 접속하고 싶은 경우 'docker exec' 명령어를 사용할 수 있다.
- docker exec
: 도커 컨테이너 내에서 명령어를 실행하는 도커 명령어이다. - -it
: 표준 입력(stdin)을 유지하고 의사 터미널(pseduo-TTY)을 할당하는 옵션이다.- 이 옵션을 사용하면 커테이너 내에서 대화형 세션을 생성하고, 셸과 같은 대화형 인터페이스를 제공받을 수 있다.
- bash
- 실행할 명령어로, 여기서는 bash 셸을 실행한다.
이때 다음과 같은 의문을 가질 수 있다.
"docker run -dit -p 8080:80 httpd" 명령어로 httpd 컨테이너를 백그라운드 환경에서 실행해 'docker attach' 명령어로 접근할 수 있지 않을까?
- 하지만 'docker attach' 명령어를 실행하는 경우 바로 빠져나오며 해당 프로세스 또한 중지된 것을 확인할 수 있다.
- 'docker attach' 명령어는 컨테이너의 기본 입력(stdin)에 연결되는 역할을 수행한다.
- 하지만 '-d' 옵션을 사용해 컨테이너를 백그라운드에서 실행할 경우 컨테이너가 입력을 기다리는 상태가 아니므로 'docker attach' 명령어를 사용해도 컨테이너에서 바로 빠져나오는 현상이 발생한다.
참고 docker run -d -p 8080:80 httpd bash
'docker run -d -p 8080:80 httpd bash' 명령어를 실행하면 httpd 도커 이미지를 기반으로 컨테이너를 생성하고, 해당 컨테이너 내에서 bash 셸을 실행하도록 지정한다.
그러나 httpd 이미지는 웹 서버를 실행하는 것이 기본 목적이며, bash 셸을 실행하도록 지정하더라도 웹 서버로 동작하기 위한 서비스가 구동되지 않는 문제가 발생한다. httpd 이미지는 웹 서버 프로세스를 실행하고 특정 포트에서 요청을 처리하는데 사용되는데, bash 셸을 실행하면 해당 서비스가 실행되지 않아 컨테이너가 종료될 수 있다.
기본적으로 docker run 명령어는 지정된 명령어를 실행하고 종료하는 컨테이너를 생성하는 역할을 한다. 따라서 bash 명령어가 실행되면 컨테이너는 bash 셸을 실행하고, bash 셸이 종료되면 컨테이너도 함께 종료된다.
만약 httpd 웹 서버를 실행한 후에 컨테이너 내에서 대화형 bash 셸에 접속하고자 한다면, docker exec -it <컨테이너ID> bash와 같은 명령어를 사용하여 실행 중인 컨테이너에 접속해야 한다. 이렇게 하면 컨테이너 내에서 bash 셸을 실행하고 필요한 작업을 수행할 수 있다.
정리
ubuntu 같은 OS 컨테이너를 실행하는 경우
docker run -dit ubuntu bash
docker attach 컨테이너ID
이 명령어를 실행하면 http 도커 이미지를 기반으로 새로운 컨테이너가 생성되고, 해당 컨테이너는 백그라운드에서 실행된다.
호스트의 8080 포트와 컨테이너의 80 포트가 매핑되어 웹 서버에 접근할 수 있다.
httpd 같은 계속 실행되는 프로세스 컨테이너를 실행하는 경우
docker run -d -p 8080:80 httpd
docker exec -it 컨테이너ID bash
- docker run -d -p 8080:80 httpd
- 이 명령어를 실행하면 httpd 도커 이미지를 기반으로 새로운 컨테이너가 생성되고, 해당 컨테이너는 백그라운드에서 실행된다.
- 호스트의 8080 포트와 컨테이너의 80 포트가 매핑되어 우베 서버에 접근할 수 있다.
- docker exec -it 컨테이너ID bash
- 이 명령어를 실행하면 지정된 컨테이너 내에서 bash 셸이 실행된다.
- 이로 인해 컨테이너 내부에서 명령어를 입력하고 실행할 수 있으며, 셸을 통해 컨테이너의 파일 시스템에 접근하고 수정할 수 있다.
결론적으로, 위의 명령어들을 실행하면 백그라운드에서 실행되는 httpd 컨테이너가 생성되며, 해당 컨테이너에 대해 대화형 bash 셸을 실행할 수 있다. 이를 통해 웹 서버의 설정 변경이나 파일 시스템 탐색 등의 작업을 수행할 수 있다.
'Docker' 카테고리의 다른 글
docker commit 이미지 굽기와 docker hub 업로드 (0) | 2023.06.09 |
---|---|
docker volumn 옵션으로 폴더 연결하기 (0) | 2023.06.09 |
docker dit 옵션과 attach (0) | 2023.05.29 |
컨테이너 포트포워딩 및 데몬으로 실행 (0) | 2023.05.25 |
도커 컨테이너 실행하기 (0) | 2023.05.24 |