본문 바로가기

Docker\K8s

[Docker] docker foreground vs background 차이

다음과 같은 상황을 보자.

ubuntu 이미지 파일로 mu 라는 컨테이너를 만들어 실행시켰다.

그리고 docker ps -a  명령어로 컨테이너 상태 목록을 확인하니 .. 방금 실행한 mu 컨테이너의 상태가 Exited(0) 로 뜬다.

또 내 pc만 이상한가,,, 도커를 처음 접했을 때 여기서 부터 혼란이 왔다. 

 

1
2
3
4
5
$ docker run --name mu ubuntu
$ docker ps -a
CONTAINER ID   IMAGE                    COMMAND                  CREATED         STATUS                     PORTS                                                NAMES
57f18d313fe9   ubuntu                   "/bin/bash"              5 seconds ago   Exited (05 seconds ago                                                        mu
cs

 

도커 초보자(==나) 는 ubuntu 이미지로 컨테이너를 실행하면 컨테이너가 ubuntu의 모든 기능을 해줄 수 있다고 생각한다. 

반은 맞고 반은 틀리다. 위 쉘에서 COMMAND 인자에 주목할 필요가 있다. COMMAND 는 컨테이너가 시작될 때 실행될 명령어이다. 

docker run --name mu ubuntu 로 우분투 컨테이너를 실행하면 내장된 COMMAND 인 /bin/bash 가 실행되는 것이다. 

우분투에서 /bin/bash 명령은 쉘을 실행하는 명령이다.  그럼 우분투 컨테이너를 실행시키면 쉘이 나와야 하는거 아닌가요 ? 

 

맞다. 다음 화면이 우리가 생각한 이상적인 결과이다. 

1
2
$ docker run ----name mu ubuntu
root@f48d629ce6c4:/
cs

 

위 명령을 실행하니 우분투 컨테이너가 시작되어 실행될 때 /bin/bash COMMAND 가 적용되어 컨테이너 내 쉘이 생겨 

우리가 우분투 컨테이너의 bash 쉘에서 명령을 할 수 있게 되었다. 

위 명령은 앞선 명령과 다른 점이 있다. -i -t 옵션이다. 

-i 옵션은 호스트(내pc)와 컨테이너 간 상호 작용을 활성화 옵션이다. 

-t 옵션은 호스트와 컨테이너 간 tty 모드 활성화 옵션이다. 

호스트와 컨테이너 간 상호 작용이 활성화 되고 tty 모드가 활성화 되어 호스트 터미널에서 컨테이너 내부로 명령을 입력하고, 출력을 볼 수 있다. 두 옵션 중 한 가지만 빼고 컨테이너를 실행시키면 원하는 쉘 기능을 온전히 수행할 수 없을 것이다.

 

그럼 우분투 컨테이너 쉘 말고, 호스트에서 컨테이너를 실행할 때 명령을 수행할 수 있나요? 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ docker run --name mu ubuntu "ls"
bin
boot
dev
etc
home
lib
lib32
lib64
libx32
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
cs

 

물론이다. 앞서 COMMAND 인자만 바꾸면 된다. 내장된 COMMAND 인 /bin/bash 가 아닌 본인이 원하는 명령어를 입력하면 우분투 컨테이너에서 해당 명령어를 실행 후 호스트에게 결과를 주고 종료한다. 

여기서 우리는 한 가지를 알 수 있다. 

Docker 컨테이너는 단지 입력한 명령을 실행하고 출력을 보여준다 !!

 

 

참고한 글/도서

시작하세요! 도커/쿠버네티스 -용찬호 지은이

www.popit.kr/개발자가-처음-docker-접할때-오는-멘붕-몇가지/