하나의 이미지는 이미지파일과 이미지에 대한 메타데이터로 구성되어 있습니다.
Env
: 소프트웨어의 실행할 때 사용할 설정 정보Cmd
: 컨테이너 실행 시 프로세스 실행 명령어 지정
- 이미지를 컨테이너로 실행할 때 CMD에 있는 명령어를 통해서 어떤 프로그램을 실행할지를 메타데이터에서 결정합니다.
컨테이너를 실행할 때 이미지의 메타데이터를 읽어서 컨테이너의 메타데이터를 생성합니다.
컨테이너는 실행할때 Cmd 부분을 덮어쓰기해서 실행할 수 있습니다.
컨테이너를 실행할 때 더 큰 유연성과 적응성을 제공합니다. 이를 통해 다양한 환경과 상황에 맞춰 컨테이너의 동작을 쉽게 조정할 수 있습니다.
유연한 실행
: 동일한 이미지를 다양한 용도로 사용할때, 특정 작업을 수행하기 위해- 예) 디버깅이나 특정 스크립트를 실행하는 경우
환경에 맞춘 실행
: 개발, 테스트, 프로덕션 등 환경에 따라 실행해야 하는 명령어가 다를 수 있습니다.- 예) 개발 환경에서는 개발 서버를, 프로덕션 환경에서는 프로덕션 서버를 실행하도록 설정합니다.
docker image inspect 이미지명이미지의 메타데이터를 확인할 수 있습니다.docker container inspect 컨테이너명컨테이너의 메타데이터를 확인할 수 있습니다.
- 예) 개발 환경에서는 개발 서버를, 프로덕션 환경에서는 프로덕션 서버를 실행하도록 설정합니다.
docker image inspect nginx
를 확인해보면?
nginx로 되어있는 것을 확인할 수 있습니다. 이 nginx 이미지를 가지고 컨테이너를 실행하면 컨테이너도 똑같은 Cmd에 nginx -g daemon off
로 쓰여진 것을 확인할 수 있습니다.
docker container inspect defaultCmd
nginx 이미지의 메타데이터를 기준으로 컨테이너가 생성되기 때문에 defaultCmd
컨테이너의 Cmd
역시 nginx -g daemon off
로 되어있습니다.
이번에는 컨테이너의 Cmd를 덮어쓰기 해보겠습니다.
docker run --name 컨테이너명 이미지명 [덮어쓰기할 cmd 명령]
docker run --name customCmd nginx cat usr/share/nginx/html/index.html
customCmd의 Cmd
가 정상적으로 덮어씌워졌습니다.
위에서 리눅스의 cat명령어를 사용했는데, cat 명령어는 일회성이므로 출력을 하고 종료가 됩니다.
docker 컨테이너 cmd를 cat명령어로 실행했다는 것은 실행이 되고 바로 종료가 된다는 것을 의미합니다.
그래서 docker ps
로 컨테이너를 조회하면?
보시는 것처럼 customCmd는 보이지 않습니다.
그렇다면 어떻게 조회를 해야하나? 바로 docker ps -a
로 조회를 해야합니다.
OPTION(-a
)는 all을 의미하고 종료된 컨테이너도 조회가 가능합니다.
customCmd를 보시면 STATUS가 Exited되어 있다고 나옵니다. 이처럼 종료된 컨테이너까지 모두 조회하고 싶다면 doker ps
대신 docker ps -a
를 사용하면됩니다.
Tip)
컨테이너의 Cmd를 변경해도 이미지의 Cmd는 변경되지 않습니다. 컨테이너 Cmd는 이미지의 메타데이터를 복사해서 만들기 때문입니다.
docker run -d 이미지명
-d 옵션 추가 시 | -d 옵션 제거 시 |
---|---|
지속적으로 실행되는 데몬 프로그램을 실행 | 실행 후 종료되는 프로그램에 적합, 실시간 로그를 확인할 경우 |
docker run -d --name defaultCmd nginx | docker run --name customCmd nginx cat usr/share/nginx/html/index.html |
-d는 daemon의 약자로 -d옵션을 추가하면 백그라운드에서 실행됩니다.
nginx 같은 지속적으로 실행되는 컨테이너를 -d옵션 없이 실행하면 다음 명령어를 사용할 수 없게됩니다. 그래서 지속적으로 실행되는 컨테이너 같은 경우 -d 옵션을 사용해서 백그라운드에서 돌게 하고 다른 명령어를 실행할 수 있게합니다.
도커 컨테이너 메타데이터 중 env 실습을 위한 준비
devwikirepo/envnodecolorapp이라는 이미지를 다운받습니다.
docker pull devwikirepo/envnodecolorapp
이미지가 정상적으로 다운받아졌다면 docker run -d -p 8080:3000 --name defaultColorApp devwikirepo/envnodecolorapp
으로 컨테이너를 실행합니다.
컨테이너의 메타데이터의 Env의 COLOR=red
입니다.
빨간 화면으로 나오는 것을 확인할 수 있습니다.
이번에는 env: COLOR=blue로 화면을 띄워보겠습니다.docker run -d -p 8081:3000 --name blueColorApp devwikirepo/envnodecolorapp
파란 화면 역시 정상적으로 출력됩니다.
실습을 모두 마쳤다면 컨테이너를 삭제합니다.docker rm -f defaultCmd customCmd defaultColorApp blueColorApp
컨테이너 이름이 나온다면 정상적으로 삭제되었습니다.
주로 이미지를 디버깅할 때 메타데이터를 수정합니다.