본문 바로가기

Web Dev

[Docker] : Docker에서 API 패키징 하는 방법 + Port 포워딩 !

반응형
FROM node:14    
# 안정적인 버전

COPY ./index.js centumjooncode/
#local pc 파일 복사에서 가상 pc에 옮기기

WORKDIR /centumjooncode/
# 어디서 시작할 건지 

CMD node index.js
#CMD 로 실행

이미  build 에서 컴퓨터가 형성 되고 프로그램이 작동합니다. 

그리고 꺼집니다.  - 

가상 pc를 지속 시킬려면 local 서버가 계속 돌아야합니다.

이번에는 이렇게 여러 파일이 있는 걸 바탕으로 Dockerfile을 작성해 보겠습니다. 

.dockerignore 파일도 만들어서 node_modules를 무시해줍니다.

요렇게 작성하시면 됩니다. 

.gitignore하고 비슷합니다.

FROM node:14

WORKDIR /myfolder/
# 어기 폴더에 커서 ! 

COPY . /myfolder/
# myfolder를 만들어서 모든 파일을 복사해줘

RUN npm install
#node_modules 생성을 위해서 
#여기까지 image로 생성 ! 

CMD npm run dev

위의 파일 모두 를 의미하는 건 [   .   ] 입니다. 

그래서 COPY 뒤에 점만 찍어줍니다. 

 

$ docker build .
$ docker build .
[+] Building 17.1s (9/9) FINISHED                                                                                                 
 => [internal] load build definition from Dockerfile                                                                         0.0s
 => => transferring dockerfile: 245B                                                                                         0.0s
 => [internal] load .dockerignore                                                                                            0.0s
 => => transferring context: 52B                                                                                             0.0s
 => [internal] load metadata for docker.io/library/node:14                                                                   1.9s
 => CACHED [1/4] FROM docker.io/library/node:14@sha256:0443d511c77586fbeff8e32ea55565acbcf666fafa14e995eddbbbba5ff352b0      0.0s
 => [internal] load build context                                                                                            0.0s
 => => transferring context: 82.04kB                                                                                         0.0s
 => [2/4] WORKDIR /myfolder/                                                                                                 0.1s
 => [3/4] COPY . /myfolder/                                                                                                  0.0s
 => [4/4] RUN npm install                                                                                                   14.3s
 => exporting to image                                                                                                       0.6s
 => => exporting layers                                                                                                      0.6s
 => => writing image sha256:e13058b9416a01c5d2b3780c63196fa8a8c715c70f474e8cd0b7eca8e8e914ee                                 0.0s

 빌드가 잘 되었습니다. 

위에 보시면 CACHED 라는 부분은 기존에 설치 된걸 재 설치하면 오래 걸리니까 

보관하다가 다시 가져 왔다는걸 의미합니다.

했던 작업을 다시 명령하면 CACHED가 많아지는 걸 볼 수 있습니다. 

$ docker images 
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
<none>       <none>    e13058b9416a   About a minute ago   930MB
<none>       <none>    02ded6651d3f   29 minutes ago       916MB
$ docker run e13058b9416a

> back@1.0.0 dev /myfolder
> nodemon index.js

[nodemon] 2.0.20
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node index.js`
Example app listening on port 3000

docker 컴퓨터 안에서 동일한 코드가 실행 되었습니다. 

이제 이 프로그램은 앞으로 24시간 돌게 되겁니다. 

이 컴퓨터가 진짜 있는지 보고싶다면 접속을 해봐야겠죠 ! 

$ docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS     NAMES
e292f5c9a5b9   e13058b9416a   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes             hopeful_shtern

container 한 개가 실행 중이다 라고 나옵니다. 

$ docker exec -it e292f5c9a5b9 /bin/bash

docker 실행 container id /실행 폴더 / 명령창

번역하면 : 도커야 이 컨테이너 를 /bin 실행 폴더 안에서 bash 명령창을 띄워서 실행해줘 

root@e292f5c9a5b9:/myfolder#

이렇게 터미널 창 주인이 바뀝니다. 

root@e292f5c9a5b9:/myfolder# pwd
/myfolder
root@e292f5c9a5b9:/myfolder# ls
Dockerfile  index.js      package-lock.json  phone.js
email.js    node_modules  package.json       utils.js

이렇게 경로와 내부에 들어가 있는 파일도 확인됩니다.

원래 터미널로 돌아오고 싶으면 

exit 만 입력해주시면 됩니다. 

일단 

docker localhost : 3000이 운영되고 있으니 

postman을 통해 api에 요청을 보내 보겠습니다. 

안됩니다. 

당연하죠 

로컬이 아니라 

도커 안에서 운영 중이니까 저 주소가 아닙니다. 

포트 포워딩을 추가 해줘야 합니다. 

 

postman -> localhost:8000/boards -> send -> 내컴퓨터 : 8000 찾기 -> [포트 포워딩 8000 : 2500] -> docker : 3000

일단 도커를 멈춰 봅시다 

포트 포워딩 명령어를 포함 시켜 다시 실행합니다.

$ docker stop e292f5c9a5b9
$ docker run -p 8000:3000 e13058b9416a
$ docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS                    NAMES
c8781371b500   e13058b9416a   "docker-entrypoint.s…"   25 seconds ago   Up 25 seconds   0.0.0.0:8000->3000/tcp   admiring_edison

0.0.0.0:8000->3000/tcp

0.0.0.0 -> 뜻은 누구나 접속 가능하다 

 

너무 잘 들어 옵니다. 

행복 !

반응형