정구리의 우주정복

[Docker] 5. 대화형 셸 말고 내 코드를 실행하는 방법 (Dockerfile 작성 방법) 본문

STUDY/DOCKER

[Docker] 5. 대화형 셸 말고 내 코드를 실행하는 방법 (Dockerfile 작성 방법)

Jungry_ 2023. 10. 15. 21:53
반응형

이전 게시글

https://j-ungry.tistory.com/370

 

[Docker] 4. 컨테이너를 만드는 이미지를 가져오는 두가지 방법 중 첫번째 (Docker hub 사용하기)

컨테이너는 이미지를 베이스로 한다 이미지를 만드는데에는 두가지 방법이 있는데 이번에는 그 첫번째를 알아보려한다 이미 존재하는거 사용하기 아주 당연한 말이지만 이미 존재하는걸 사용

j-ungry.tistory.com

에서 docker hub 의 node 를 가져와서 대화형 셸을 실행시켜봤는데 사실 우리는 대화형 셸에서 코딩을 하는 경우는 거의 없고 내 코드를 실행시키고 싶어하는 경우가 더 많다 !! 그런 경우에는 어떻게 해야할까 !!!

Dockerfile 을 작성하면 된다 !

 

폴더 구조

이러한 폴더 구조를 가지고 있다고 가정해보자 

package.json 파일에는 각종 dependencies 에 대한 정의가 들어있다 (실행에 필요한 친구들)

 

이제 Dockerfile 을 작성해볼거다

Dockerfile 작성


1. FROM

# FROM : 다른 기본 이미지에 이미지를 구축 할  수  있게 해준다
FROM node

다른 기본 이미지에 이미지를 구축할 수 있게 해준다 

여기서 사용할 기본 이미지는 node 이다 ! 만약 실행하게 된다면 local 에 node 이미지가 있다면 사용할것이고, 없다면 docker hub 의 것을 가져오게 될것이다 !

 

2. COPY

# FROM : 다른 기본 이미지에 이미지를 구축 할  수  있게 해준다
FROM node
 
# In my own image, I wanna start by pulling in node image
# tell which local file is going to image
COPY . /app

local 의 어떤 파일들이 이미지로 가야하는지 지정해주는 것이다

위의 경우에는 . /app 인데 local 의 현재 폴더에 있는 애들을 image 의 /app 하위로 복사하겠다는 것이다 !!!

 

3. RUN

run 을 통해 이미지를 생성할 때 실행되어야할 명령어를 작성할 수 있다 

npm 을 통해서 dependencies 를 설치해줄 건데 이때 설치한 녀석이 /app 안에 들어있어야 한다 (위에서 /app 하위에 복사했으니까 ! )

이때 필요한게

 

4. WORKDIR

내가 사용할 워크디렉토리를 지정해주는것이다. workdir 까지 적용한 dockerfile은

# FROM : 다른 기본 이미지에 이미지를 구축 할  수  있게 해준다
FROM node
 
WORKDIR /app

# In my own image, I wanna start by pulling in node image
# tell which local file is going to image
COPY . /app

RUN npm install

이렇게 될 것이다

5. CMD

헷갈리면 안되는게 우리는 이미지를 실행하는게 아니라 "이미지를 기반으로 한 컨테이너를 실행하는 것" 이다 !

CMD 명령어는 RUN 과 다르게 "이미지가 생성될때 시작" 이 아니라 "컨테이너가 실행될때 시작" 되는 것이다 !!!!

배열 형태로 전달한다

# FROM : 다른 기본 이미지에 이미지를 구축 할  수  있게 해준다
FROM node
 
WORKDIR /app

# In my own image, I wanna start by pulling in node image
# tell which local file is going to image
COPY . /app

RUN npm install

# start node server
CMD ["node", "server.js"]

컨테이너 내부의 node 명령을 사용해 server.js 를 실행하는 것이다

 

6. EXPOSE

# FROM : 다른 기본 이미지에 이미지를 구축 할  수  있게 해준다
FROM node
 
WORKDIR /app

# In my own image, I wanna start by pulling in node image
# tell which local file is going to image
COPY . /app

RUN npm install

EXPOSE 80

# start node server
CMD ["node", "server.js"]

container 는 격리된 공간이기 때문에 포트를 열어줘야 외부와 통신할 수 있다

expose 명령을 사용해 특정 post 를 local system 에 노출시킬 수 있다 !!

이제 이미지 만들러 고고링

 

이미지 생성 및 컨테이너 띄우기


docker build .

를 해서 이미지를 생성해준다 실행 과정을 잘 보면 우리가 Dockerfile 에 정의한 대로 동작하는 것을 확인할 수 있다 

 

docker run <image id>

컨테이너를 만들어준다 !! 이미지 아이디는 위에 있는 녀석이다  

근데 이렇게 해도 바로 실행이 안된다 .. 왜냐면 한개를 빼먹었거든요 ..

 

우선 실행되어있는 녀석을 종료해줍니다 ..

 

expose 80 을 추가했지만 이것은 단순히 문서화일 뿐 실제로 80번 포트를 뚫어주는 역할을 하지는 않는다 그냥 나 80번 포트 씁니다 !! 소리지르는 정도 ..? 실제로 80번을 사용하기 위해선 

 

docker run -p <local port>:<expose port> <image id>

이렇게 해야하는 것이다 !!! local 의 3000 을 80 번이랑 붙여주겠다 라고 이해했다 

 

그렇게 실행한 뒤 localhost:3000 을 들어가면 

 

 

잘 나오는 것을 볼 수 있다 !!

 

Dockerfile 을 정의하고 image 생성하고 container 만드는 것 까지 해봤다 넘 재밌다 !

반응형
Comments