docker run -it node
도커에게 컨테이너 내부에서 호스팅 머신으로 대화형 세션을 노출하고 싶다고 알리는 것
이미지는 배후에서 컨테이너에 필요한 모든 논리와 모든 코드를 보관하는데 사용되며 run명령을 사용하요 이미지의 인스턴스를 만든다.
그리고 이것은 이미지를 기반으로 하는 구체적인 컨테이너를 생성한다.
docker ps -a
#모든 컨테이너 표시
동일한 이미지를 기반으로 하는 컨테이너는 1개 이상 있을수 있다.
이미지와 컨테이너의 이면에 있는 아이디어인데, 이미지에는 코드,설정, 여러 것 들이 포함되며 컨테이너는 이미지의 실행 인스턴스 이다.
일반적으로 공식 베이스 이미지를 가져온 다음 그 위에 실행 코드를 추가하여 그 이미지로 코드를 실행한다. (물론 컨테이너 내부에서 모든 작업을 수행함)
도커파일
Dockerfile
FROM node
WORKDIR /app
COPY . .
EXPOSE 80
RUN npm install
CMD ["node", "server.js"]
FROM node
FROM 을 통해 다른 베이스 이미지에 우리 이미지 구축 가능
WORKDIR /app
도커에게 모든 후속 명령이 그 폴더 내부에서 실행될 것 임을 알림(나중에 코드를 냅둘 곳)
COPY . .
앞의 .은 도커에세 기본적으로 도커파일이 포함된 동일한 폴더임을 알리는 것,
두번째 .은 파일을 저장해야 하는 이미지의 내부 경로이다. 모든 이미지와 이미즈를 기반으로 생성된 컨테이너는 로컬 머신의 파일 시스템에서 완전히 분리된 자체 내부 파일 시스템이 있다(내부에 숨겨져 있다.)
실제로 여기에서는 루트 폴더 즉, 도커 컨테이너의 루트 엔트리를 사용하지 않고 전적으로 사용자가 선택한 서브 폴더를 사용하는 것이 좋습니다. 원하는 대로 이름을 지정할 수 있는데요. 여기에서는 /app 이라고 해보죠. 이제 Dockerfile과 동일한 폴더에 있는 모든 파일과 거기에 있는 모든 하위 폴더가 컨테이너 내부의 app 폴더에 복사됩니다. 그리고 이 폴더가 존재하지 않는 경우에는 이미지와 컨테이너에 생성됩니다.
EXPOSE 80
언제나 Dockerfile의 마지막 명령 전에이 컨테이너가 시작될 때 우리의 로컬 시스템에 특정 포트를 노출하고 싶다는 것을 도커에 알리는 EXPOSE 80 명령을 추가해야 합니다. 이 컨테이너를 실행할 우리의 로컬 머신에게 말이죠. 그런 후에 이 80 포트를 수신하고 있는 그런 컨테이너를 실행할 수 있게 되는 거죠.
RUN npm install
모든 작업이 완료되면 서버를 시작하라는 것이다. Run node server.js라고 할순 있지만 BUT 실제론 이건 잘못된 것임 이 이미지가 빌드될 때마다 실행되기 때문에 이 명령은 올바르지 않습니다. 여기에 있는 모든 것은 이미지 설정을 위한 도커에 대한 명령입니다. 이미지는 컨테이너의 템플릿이어야 함을 명심하세요. 이미지를 실행하는 것이 아니라, 이미지를 기반으로 컨테이너를 실행하는 겁니다. 따라서 이 명령을 사용하여 이미지와 템플릿에서 서버를 시작하려고 시도하지만 이는 우리가 원하는 것이 아닙니다. 모든 종속성을 설치하고, 네, 거기에다 모든 코드를 포함하고 싶습니다.하지만 이미지를 기반으로 컨테이너를 시작하는 경우에만 서버를 시작하고 싶은 겁니다. 하나의 동일한 이미지에서 여러 컨테이너를 시작하면 노드 서버도 여러개 시작되죠. 따라서 이를 위한 또 다른 명령이 있습니다.
CMD ["node", "server.js"]
이는 CMD 명령입니다. RUN 과의 차이점은 이미지가 생성될 때 실행되지 않고 이미지를 기반으로 컨테이너가 시작될 때 실행된다는 겁니다. 그것이 우리가 원하는 거죠. 컨테이너가 실행된 후에 노드 서버를 실행하고자하는 거죠.(CMD에 특정하지 않으면 베이스 이미지가 실행되며, 그게 없는 경우 에러가 발생합니다)
포트(포트 80)를 EXPOSE하는 컨테이너로 시작했습니다.
결국 Dockerfile의 'EXPOSE 80'은 선택 사항이라는 점을 다시 한 번 명확히 하고 싶습니다. 그것은 컨테이너의 프로세스가 이 포트를 노출할 것임을 문서화하는 겁니다.
하지만 'docker run'을 실행할 때 '-p'를(publish) 사용하여 실제로 포트를 노출해야 합니다. 따라서 기술적으로 '-p'는 포트에서 수신 대기할 때 유일하게 필요한 부분입니다. 하지만 Dockerfile에 'EXPOSE'를 추가하여 이 동작을 문서화하는 것이 모범적인 사용법입니다.
추가 참고 사항: ID를 사용할 수 있는 모든 docker 명령의 경우, 항상 전체 ID를 복사/기록할 필요는 없습니다.
첫 번째(몇 개) 문자를 사용할 수도 있습니다. 고유 식별자를 갖는 것만으로도 충분합니다.
그래서
docker run abcdefg
이 명령 대신
docker run abc
이 명령을 실행할 수도 있습니다.
또는 "a"로 시작하는 다른 이미지 ID가 없으면, 다음과 같은 명령을 실행할 수도 있습니다.
docker run a
이는 ID를 필요로 하는 모든 Docker 명령어에 적용됩니다.