Docker file 생성
FROM node
COPY . .
NODE : 시스템이나 도커허브에 존재하는 이미지 이름
COPY
첫번째 경로 : 컨테이너 외부경로, 이미지의 외부경로로 이미지로 복사되어야 할 파일들이 있는 경로
두번째 경로 : 내부경로, 파일을 저장하는 이미지의 내부경로
여기에 '.'을 넣으면, 이는 도커에게 기본적으로 Dockerfile이 포함된 동일한 폴더임을 알리는 것이다.
하지만 Dockerfile은 제외된다.
첫 번째 '.'은 이 프로젝트의 모든 폴더, 하위 폴더 및 파일을 복사해야 한다고 도커에게 알리는 것이다.
두 번째 '.'은 그 파일을 저장해야 하는 이미지 내부의 경로다.
모든 이미지와 이미지를 기반으로 생성된 모든 컨테이너에는 로컬 머신의 파일 시스템에서 완전히 분리된 자체 내부 파일 시스템이 있다.
도커 컨테이너 내부에 숨겨져 있다.
실제로 여기에서는 루트 폴더 즉, 도커 컨테이너의 루트 엔트리를 사용하지 않고 전적으로 사용자가 선택한 서브 폴더를 사용하는 것이 좋다.
여기에서는 /app 이라고 이름을 지정하고
이제 Dockerfile과 동일한 폴더에 있는 모든 파일과 거기에 있는 모든 하위 폴더가 컨테이너 내부의 app 폴더에 복사된다.
FROM node
WORKDIR /app
COPY . ./
RUN npm install
EXPOSE 80
CMD ["node", "server.js"]
WORKDIR : 작업이 실행되는 폴더 지정
RUN : 컨테이너 내부에서 실행할 명령어
CMD : 이미지가 생성될 때 실행되지 않고 이미지를 기반으로 컨테이너가 시작될 때 실행
작업 디렉토리를 /app으로 변경했기 때문에 RUN 뿐만 아니라 COPY도 이 작업 디렉토리를 기준으로 수행된다.
그런데 CMD의 경우, 구문이 약간 다르며 배열을 통해 명령를 전달한다.
이렇게 명령을 두 개의 문자열로 분할한다.
도커에게 이미지를 기반으로 컨테이너가 생성될 때마다 그 컨테이너 내부에 있는 node 명령을 사용하여 server.js 파일을 실행하도록 지시한다. (CMD에 특정하지 않으면 베이스 이미지가 실행되며, 그게 없는 경우 에러가 발생한다)
하지만 이런 식으로 실행하려고 하면 한 가지 중요한 이유로 인해 우리의 애플리케이션을 볼 수 없을 것이다.
이 노드 웹 서버는 포트 80에서 수신 대기하게 된다.
도커 컨테이너가 로컬 호스트와 격리되어 있다.
컨테이너 내부의 노드 애플리케이션에서 포트 80을 수신할 때 컨테이너는 그 포트를 우리의 로컬 머신에 노출하진 않는다.
(직접 포트를 열어주어야 한다)
따라서 컨테이너 내부에서만 무언가를 수신 대기 중이기 때문에 그 포트에서 수신할 수 없는 것이다.
Dockerfile의 마지막 명령 전에 이 컨테이너가 시작될 때 우리의 로컬 시스템에 특정 포트를 노출하고 싶다는 것을
도커에 알리는 EXPOSE 80 명령을 추가해야 한다.
Dockerfile 빌드
docker build .
실행하면 빌드 진행상황과 이미지 이름이 출력된다.
$ docker build .
[+] Building 19.3s (9/9) FINISHED
=> [internal] load .dockerignore 0.5s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from Dockerfile 0.6s
=> => transferring dockerfile: 136B 0.1s
=> [internal] load metadata for docker.io/library/node:latest 0.0s
=> [1/4] FROM docker.io/library/node 1.0s
=> [internal] load build context 0.3s
=> => transferring context: 8.26kB 0.1s
=> [2/4] WORKDIR /app 0.2s
=> [3/4] COPY . ./ 0.3s
=> [4/4] RUN npm install 16.2s
=> exporting to image 0.6s
=> => exporting layers 0.5s
=> => writing image sha256:c9e294b29eebb6b1eac8f15fc292281f498525e35614490 0.0s
컨테이너 실행
docker run 이미지이름
docker run -p 외부포트:내부포트 이미지이름
ex. docker run -p 3000:80 이미지이름
컨테이너 중지
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a5166fb417e6 c9e294b29eeb "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 80/tcp nifty_jones
34e15e164a57 node "docker-entrypoint.s…" 2 days ago Exited (0) 21 hours ago priceless_ride
$ docker stop nifty_jones
nifty_jones
'Infra > Docker' 카테고리의 다른 글
[Docker] Mongo-DB 설치 & MongoDB Compass 사용 (0) | 2021.08.11 |
---|---|
Docker 외부 접속 실습 - (feat. vscode) (0) | 2021.08.11 |
Docker 개념, 명령어 (0) | 2021.08.10 |