본문 바로가기
개발/인프라

docker - 컨테이너를 다루는 다양한 옵션 (실행)

by 컴쏘 2023. 6. 29.
728x90

4. 컨테이너 실행

앞서 컨테이너를 다루는 다양한 옵션(1) 에서 예시로 생성한 myubuntu container를 실행하면 바로 중지된다. (docker ps 명령어로 확인해보면 실행 중인 컨테이너 목록에 없음)

docker의 COMMAND를 보면 ubuntu라는 이미지의 shell을 띄우는 것만 한다.

docker는 시스템을 실행하는 것이 아닌, 시스템 상에 실행되는 program을 실행하는 것

따라서, COMMAND 상의 프로그램이 종료가 되면 container 자체도 종료가 된다.

docker start [컨테이너 이름] 

 

docker는 container를 하나의 응용 프로그램으로 다루고 있다.

이것은 운영체제가 아닌, 운영체제 상에서 실행하는 응용 프로그램을 포함해서 하나의 프로그램을 실행하고 중지하는 것으로 다루고 있다.

따라서, 컨테이너에서 실행하도록 설정된 응용 프로그램의 실행이 끝나면, 해당 container는 중지된다.

 

+) 이미지 세부 정보를 알 수 있는 docker inspect 명령을 우선 이해

docker inspect 명령은, Cmd 항목에 해당 container를 실행 시, 실행하는 명령 (응용 프로그램)이 기재되어 있음

docker inspect ubuntu

"Cmd": [
	"/bin/sh",
	"-c",
	"#(nop) ",
	"CMD [\\"/bin/bash\\"]"
],
  • 해당 명령 : /bin/bash (bash는 리눅스의 기본 shell 프로그램)
  • 해당 명령은 터미널을 통해, 키보드 입력을 표준 스트림 중 표준 입력(STDIN)으로 받을 수 있는 상태이어야 대기상태로 계속 실행 (그렇지 않다면, 입력을 받을 수 없기 때문에 종료)
  • 이는 위의 docker start myubuntu 입력에 바로 중지가 되는 현상처럼
  • 별도의 터미널 및 표준 입력 연결 설정이 없이 실행 했을 때, 실행하자마자 끝나고 이에 따라 해당 컨테이너도 바로 중지 상태가 되는 것이다.
  • 어떻게 설정하는가? 와 관련한 설정 및 실행 방법은 docker run 명령으로 이해

참고 : 표준 스트림 (standard streams)

  • 리눅스(유닉스 계열) 에서 동작하는 프로그램은 실행 시, 세 개의 stream이 오픈된다.
    1. STDIN : standard input (표준 입력) - 입력을 넣을 수 있는 방법
    2. STDOUT : standard output (표준 출력) - 어디로 출력할 지
    3. STDERR : standard error (표준 에러) - 에러가 발생하면 어디에 출력할 지 
  • 보통 터미널을 오픈하고, 명령을 실행하면, 터미널의 표준 스트림이 명령에 해당하는 process에 상속되어, 해당 process는 터미널의 표준 입출력을 사용할 수 있게 된다.
    • 터미널 실행 시, 보통 shell 프로그램이 실행되고, shell 프로그램을 통해, 명령을 실행하면, 명령에 해당하는 프로그램을 shell 프로그램이 실행한다.
    • 이때, 내부적으로 shell 프로그램은 fork() system call을 사용해서, 명령에 해당하는 프로그램을 실행시킨다.

정리)

터미널 오픈하고 명령 입력 (로그인) 하면, 3가지 표준 스트림이 연결

이 위에 bash라는 shell 프로그램을 실행하면, 터미널에 연결되어 있는 3가지 표준 스트림이 bash 프로그램에 상속이 되어서 표준 입출력 사용 가능

 

 

참고)

  • fork() system call을 사용하면,
    • 해당 함수를 호출하는 프로그램 : 부모 process
    • fork()를 통해 실행되는 프로그램 : 자식 process

부모 process 가 자식 process에 복사되고, 이후에 자식 process 실행에 필요한 data가 업데이트 되는 형태로 실행

부모 process 의 표준 입출력은 그대로 자식 process에 복사되기 때문에 상속과 유사하다.

따라서, 모든 프로그램의 process는 부모 process가 존재


본 글은 인프런 강의 "풀스택을 위한 도커와 최신 서버 기술"에 대해 공부하여 정리한 글입니다.
[강의 링크] : https://www.inflearn.com/course/%EC%84%9C%EB%B2%84%EA%B8%B0%EC%88%A0-%ED%92%80%EC%8A%A4%ED%83%9D-3/dashboard
728x90