IT Technology/Cloud

Docker 중요 명령어 (docker run) 운영체제, 소프트웨어 컨테이너

by빵수 2021. 4. 12. 18:42
728x90
반응형

도커 컨테이너가 꺼질 때도 있고 안 꺼질 때도 있다. 어떻게 이해해야 할까?

  • 도커 컨테이너를 단순히 나가려고 했는데 컨테이너가 내려가는 경우가 많다. 
  • Production 장비에서는 매우 위험한 일이므로 docker run의 개념과 컨테이너 내부에서 exit 명령과 ctrl+p+q 를 정확히 이해해야 한다. 
  • 테스트에는 "운영체제" 컨테이너와 "프로그램" 컨테이너 2가지에 따라 실행 및 종료 옵션을 여러 가지 변경하여 테스트를 해 보았다. 
  • 내용이 길지만 도커에서 아래 내용을 쭉 쳐보면서 설명을 읽어보면 컨테이너가 어떻게 작동하는지 어느 정도 감을 잡을 수 있을 것이다.

 

* 운영체제 컨테이너

 

#docker run ubuntu

 - docker ps -a로 확인하면, COMMAND 부분이 "/bin/bash"라고 되어있음. 

 - 포그라운드에서 bash 쉘을 실행한 후, 추가로 할 것이 없으므로 종료된다.

 

#docker run ubuntu /bin/bash

  - 프롬프트 떨어짐. 컨테이너 종료됨. 위와 동일하다. 

  - docker ps -a로 확인하면, COMMAND 부분이 "/bin/bash"라고 되어있음.

  - 포그라운드에서 bash 쉘을 실행한 후, 추가로 할 것이 없으므로 종료된다.

 

#docker run -it ubuntu

  - 컨테이너 프롬프트로 들어가 짐. exit 로 나가면 컨테이너 종료됨. 

  - ctrl+p+q 로 나가면 계속 살아있음 

  - docker attach 컨테이너명 으로 들어간 후 exit 쳐서 나가면, 컨테이너는 종료된다. 

  - attach는 단순히 컨테이너에 붙은 것이고, 현재 컨테이너 상태에 대하여 exit를 했기 때문. 

  - 컨테이너의 표준 입력 옵션이 들어있으므로 컨테이너에 진입된 상태가 유지된다.

 

#docker run -it -d ubuntu

  - 프롬프트 떨어짐. 종료되지 않음. 

  - 백그라운드에서 bash 쉘이 실행되고 표준 입력이 실행된 상태이기 때문. 

  - docker ps -a로 확인하면, COMMAND 부분이 "/bin/bash"라고 되어있음. 

  - docker exec -it 이름 /bin/bash로 들어간 후 exit 쳐서 나가면, 컨테이너는 종료되지 않는다. 

  - exec로 실행한 /bin/bash가 종료되었을 뿐. 

  - docker attach 컨테이너명 으로 들어간 후 exit 쳐서 나가면, 컨테이너는 종료된다. 

  - attach는 단순히 컨테이너에 붙은 거고, 현재 컨테이너 상태에 대하여 exit를 했기 때문.

 

 

#docker run -it -d ubuntu /bin/bash 

  - 프롬프트 떨어짐. 종료되지 않음. 

  - 백그라운드에서 bash 쉘이 실행되고 표준 입력이 실행된 상태이기 때문.

  - docker ps -a로 확인하면, COMMAND 부분이 "/bin/bash"라고 되어있음.

  - docker exec -it ubuntu /bin/bash로 들어간 후 exit 쳐서 나가면, 컨테이너는 종료되지 않는다.

  - exec로 실행한 /bin/bash가 종료되었을 뿐.

  - docker attach 컨테이너명 으로 들어간 후 exit 쳐서 나가면, 컨테이너는 종료된다.

  - attach는 단순히 컨테이너에 붙은 거고, 현재 컨테이너 상태에 대하여 exit를 했기 때문.

 

 

* 소프트웨어 컨테이너

 

#docker run httpd:latest

  - 이렇게 하면, 로그만 뜨고 대기함. 프롬프트도 안 뜸. 

  - ctrl+c 로 나가면, 컨테이너 종료됨, docker ps -a로 확인하면, COMMAND 부분이 "http-foreground"라고 되어있음. 

  - crtl+c 나가기 전에, 창을 하나 더 띄워서 docker ps 로 보면 살아있다. 

  - 즉 OS에 httpd를 실행시켜놓은 상태로 run 되었고, 계속 실행 중이므로 프롬프트 없이 대기하는 것임.

 

#docker run httpd:latest /bin/bash

  - 이렇게 하면, 그냥 끝남. 프롬프트 떨어짐. 

  - /bin/bash라는 배쉬 쉘을 실행한 후, 할 게 없으니 종료된다. 

  - docker ps -a로 확인하면, COMMAND 부분이 "/bin/bash"라고 되어있음. 

  - 실제로 이것은 httpd가 실행되어있는 컨테이너의 OS에서 /bin/bash를 실행한 것이다. 

  - /bin/bash를 실행하고 할 게 없으므로 종료되는 것.

 

#docker run -it httpd:latest

  - 이렇게 하면, 로그 뜨고 컨테이너 프롬프트가 뜬다. 

  - httpd가 올라가 있는 컨테이너 OS를 포그라운드로 실행했으므로. ctrl+c로 나가면 컨테이너는 종료된다. 

  - 즉, httpd가 종료되며 컨테이너도 종료되는 것. 

  - docker ps -a로 확인하면, COMMAND 부분이 "http-foreground"라고 되어있음.

 

#docker run -it httpd:latest /bin/bash

  - 이렇게 하면, 컨테이너 프롬프트가 뜬다. 

  - httpd가 올라가 있는 컨테이너 OS에 /bin/bash를 포그라운드로 실행했으므로. exit로 나가면 컨테이너가 종료된다. 

  - 즉 컨테이너 실행 시 명시한 /bin/bash가 끝났기 때문에 컨테이너 자체가 종료되는 것. 

  - crtl+c 나가기 전에, 창을 하나 더 띄워서 docker ps 로 보면 살아있다. 

  - 이상태에서, docker exec -it 이름 /bin/bash 라고 하면 들어가 짐. 

  - 들어간 후 exit 하면? 컨테이너는 살아있다. 

  - 이유는? exec로 실행한 /bin/bash 만 종료했기 때문. 

  - 최초 실행한 /bin/bash는 실행된 상태에서 아직 유지중. 

  - docker attach 컨테이너명 으로 들어간 후 exit 쳐서 나가면, 컨테이너는 종료된다.

  - attach는 단순히 컨테이너에 붙은 거고, 현재 컨테이너 상태에 대하여 exit를 했기 때문.

 

 

#docker run -d httpd:latest 

  - 이렇게 하면, 그냥 프롬프트 떨어지고, 컨테이너는 계속 살아있다. 

  - 이상태에서, docker exec -it 이름 /bin/bash 라고 하면 들어가 짐. 

  - 들어간 후 exit 하면 컨테이너는 살아있다. 

  - exec로 실행한 /bin/bash 만 종료했기 때문. 

  - docker attach 컨테이너명 으로 들어간 후 exit 쳐서 나가면, 컨테이너는 종료된다. 

  - attach는 단순히 컨테이너에 붙은 거고, 현재 컨테이너 상태, 즉 httpd을 실행한 것에 대하여 exit를 했기 때문.

 

#docker run -d httpd:latest /bin/bash

  - 이렇게 하면 그냥 프롬프트 떨어지고, 컨테이너는 종료된다. 

  - /bin/bash를 백그라운드로 실행시키고 할 게 없으니 종료된 것임.

 

#docker run -it -d httpd:latest

  - 이렇게 하면, 프롬프트 떨어지고 컨테이너는 계속 살아있다. 

  - 이상태에서, docker exec -it 이름 /bin/bash 라고 하면 들어가 짐. 

  - 위와 다른 점은들어간 후 exit 로 나와도 컨테이너는 살아있다.

  - exec로 실행한 /bin/bash 만 종료했기 때문.

  - 그냥 -d로 한 것과 동일하다.

  - docker attach 컨테이너명 으로 들어가면 바로 종료된다.

  - -it 옵션이 인터렉티브 모드이고, 인터렉티브 상태를 attach 했는데 그 후 할 게 없으므로 종료됨.

  - attach는 단순히 컨테이너에 붙은 거고, 현재 컨테이너 상태에 대하여 exit를 했기 때문.

 

 

정리

 

  • 도커 컨테이너 실행 시 어떤 명령어로, 어떤 옵션으로 실행시켰느냐에 따라 도커 생성의 정체성이 달라지므로, 그 정체성에 따라 exit를 쳤을 때 컨테이너가 종료될 수도, 종료되지 않을 수도 있다. 
  • 도커 컨테이너가 종료되지 않으려면, 도커 컨테이너 실행 시 시작한 프로그램을 종료하지 않도록 해야 한다.
  • attach 명령어는 stdout, stderr을 가져오는 것이다.
  • ssh처럼 연결되는 것이 아니다.
  • 모르면 exit로 나가지 말고, ctrl+p+q 하는 게 가장 좋다.
반응형