docker run ubuntu /bin/bash 대 docker run ubuntu

docker run ubuntu /bin/bash 대 docker run ubuntu

도커 버전 17.06.0-ce

저는 영상 강좌를 보면서 Docker를 공부하고 있습니다.

강사는 다음을 보여줍니다.

sudo docker run -ti ubuntu /bin/bash

이미지 우분투로 docker를 실행합니다. 그리고 나를 괴롭히는 것은 /bin/bash\… 명령임을 man docker run보여줍니다 /bin/bash. 그건 docker run IMAGE [COMMAND]. 글쎄, 괜찮아. 그러나 차이점은 무엇입니까?

sudo docker run -ti ubuntu 

그리고

sudo docker run -ti ubuntu /bin/bash

나에게는 아무것도 없습니다. 그리고 강사는 명령에 집중하지 않습니다. 그는 우리가 단지 docker를 실행하고 있다고 말했습니다. 그것은 코스에서 그의 첫 번째 명령이었습니다. 그런 다음 그는 우리가 호스트 시스템으로부터 격리되어 어떤 손상도 없이 원하는 것을 자유롭게 망칠 수 있음을 보여줍니다(예: rm -rf /bin).

나는 다음을 확인했다:

$ sudo docker run -ti ubuntu
root@aaf7cd26fe18:/# echo $SHELL
/bin/bash


$ sudo docker run -ti ubuntu /bin/bash
root@6b2570958216:/# echo $SHELL
/bin/bash

글쎄요, 저는 이 /bin/bash부분을 쓰레기로 버리기로 결정했습니다.

하지만 어쨌든 나는 여러분에게 물어보기로 결정했습니다. Docker를 실행하는 두 가지 방법 사이에 약간의 차이가 있습니까? 있다면 어떤가요?

답변1

Docker 이미지는 다음을 사용하여 특정 명령이 기본적으로 실행되도록 지정할 수 있습니다.CMDDockerfile의 지시문. 그리고:

사용자가 인수를 지정하면 docker run에 지정된 기본값이 재정의됩니다 CMD.

공교롭게도 다음에 대해 지정된 기본 명령은우분투 도커파일실제로는 bash입니다.

CMD ["/bin/bash"]

따라서 Ubuntu 이미지의 특정 경우 docker run ... ubuntu /bin/bash에는 docker run ... ubuntu.

물론 이것이 항상 사실일 필요는 없습니다. 데이터베이스 엔진용 Dockerfile은 기본적으로 데이터베이스 명령을 실행할 수 있습니다. 이 경우 대화형 셸이 필요하면 다음을 수행해야 합니다 docker run ... /bin/bash.

docker run일반적으로 이것이 대화형 쉘을 제공할 것이라고 가정할 수 없습니다 . /bin/bash쉘이 필요한지 지정하는 것이 더 안전합니다 .

답변2

귀하의 경우 명령을 제공하지 않으면 ( 대화형, 터미널)을 /bin/bash사용하는 동안 에서 명령을 사용할 때 실행되도록 정의된 기본 프로그램에 연결됩니다 .-tiitrunDockerFile

예를 들어, 이미지가 포그라운드에서 웹 서버를 실행하는 경우, run없이 사용하면 /bin/bash해당 웹 서버(실행된 기본 프로그램)의 로그가 표시됩니다.

명령을 지정하는 동안 이미지에서 무슨 일이 일어나고 있는지 또는 실행되고 있는지 신경 쓰지 않는다는 의미입니다. 이 "명령"을 실행하여 대화형 터미널을 제공합니다.

Ubuntu에서 기본 명령은 다음 bash과 같습니다. 제공하지 않으면 -ti컨테이너가 실행 직후 중지됩니다. 비대화형 모드에서 bash를 실행했고, 완료 후에는 컨테이너가 더 이상 아무 작업도 하지 않기 때문입니다.

답변3

아래 명령을 실행해 보면 차이점을 이해할 수 있습니다.

sudo docker run -ti python
sudo docker run -ti python /bin/bash

관련 정보