하나의 이미지는 이미지파일과 이미지에 대한 메타데이터로 구성되어 있습니다.

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
컨테이너 이름이 나온다면 정상적으로 삭제되었습니다.
주로 이미지를 디버깅할 때 메타데이터를 수정합니다.