
도커 버전 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 이미지는 다음을 사용하여 특정 명령이 기본적으로 실행되도록 지정할 수 있습니다.CMD
Dockerfile의 지시문. 그리고:
사용자가 인수를 지정하면
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
사용하는 동안 에서 명령을 사용할 때 실행되도록 정의된 기본 프로그램에 연결됩니다 .-ti
i
t
run
DockerFile
예를 들어, 이미지가 포그라운드에서 웹 서버를 실행하는 경우, run
없이 사용하면 /bin/bash
해당 웹 서버(실행된 기본 프로그램)의 로그가 표시됩니다.
명령을 지정하는 동안 이미지에서 무슨 일이 일어나고 있는지 또는 실행되고 있는지 신경 쓰지 않는다는 의미입니다. 이 "명령"을 실행하여 대화형 터미널을 제공합니다.
Ubuntu에서 기본 명령은 다음 bash
과 같습니다. 제공하지 않으면 -ti
컨테이너가 실행 직후 중지됩니다. 비대화형 모드에서 bash를 실행했고, 완료 후에는 컨테이너가 더 이상 아무 작업도 하지 않기 때문입니다.
답변3
아래 명령을 실행해 보면 차이점을 이해할 수 있습니다.
sudo docker run -ti python
sudo docker run -ti python /bin/bash