반응형

Dockerfile을 만드는 실습을 해보도록 하겠습니다.


 아래에 node.js  express서버에 대한 코드가 준비되어 있습니다.

app.js파일은 express를 이용하는 node환경의 코드입니다. node app.js로 express 서버를 실행할 수 있습니다.

 

Dcokerfile 파일 만들기

이제 Dockerfile 이라는 빈 파일을 추가해 보겠습니다.

Dockerfile이라는 빈 파일을 만들었지만, 실제로 원하는 다른 파일명으로도 이름을 정할 수 있습니다. 확장자를 붙여도 상관 없습니다.

node.dockefile로 이름을 바꿔 보았습니다. 프로젝트에 여러 도커 파일이 있는 경우에는 각각 이름을 다르게 주는것이 구별하기 편리하지만, 일반적으로 Dockerfile이 하나만 존재하는 경우는 사실상의 표준인 Dockerfile이라는 이름을 확장자 없이 사용합니다. dockerfile은 그냥 단순한 텍스트 파일이라는걸 기억해 주세요. 예제 에서는 Dockerfile로 다시 바꾸고 진행하겠습니다.

 

FROM 

Dockerfile에 처음 사용할 명령어는 FROM입니다.

우리는 다른 기본 이미지에서 커스텀 이미지를 만들려고 하고 있습니다. 이 예제는 Node 실행해야 하므로 dockerhub에 있는 공식 노드 저장소 이미지를 사용하게 됩니다.  이미지는 여러 가지 버전이 있습니다. node:latest라고  적어놓으면 이미지를 재구성할 때마다 최신 버전의 노드를 사용할 수 있습니다. 이러한 방법은 좋을 수도 있고 경우에 따라서는 나쁠 수도 있습니다.  특정 버전을 원한다면 FROM node:5.5.0 과 같이 적으면 됩니다.

 

LABLE 

다음으로 LABEL을 기술하겠습니다.

LABEL에 dockerfiler의 제작자의 이름을 적을 수도 있고 이메일을 넣을 수도 있습니다. 이것은 단순한 메타데이터에 불과하지만 다른 사람들이 Docker파일을 볼 때, 어떤 이유로 연락을 취하고 싶을 때 사용하게 됩니다.

 

EXPOSE 

다음 명령어는 EXPOSE입니다.

이 특정 이미지와 이 이미지에서 나오는 컨테이너가 실제로 3000 포트에서 실행되기를 원한다고 알려주는 역할입니다.

 

ENTRYPOINT

다음은  ENTRYPOINT라는 것을 넣을 것입니다.

ENTRYPOINT 명령은 컨테이너가가 실제로 시작될 때, 그 컨테이너를 작동시킬 진입점이 어디인지 지정해 줍니다. 그리고  node app.js 를 진입점 명령어로 넣어주고 있습니다. 여기서 흥미로운 점은, JSON 배열에 명령어를 넣는다는 것입니다. 배열이기 때문에 이중 따옴표에 명령어를 넣어주어야 한다는 점을 기억해주세요.

 

현재 이 상태의 이미지에는 소스코드가 없기 때문에 볼륨을 사용해야 할 것입니다. 혹은 볼륨 대신 소스코드를 복사해서 이미지 안에 넣어줄 수 있습니다. 그렇게 하면 팀의 팀원들이 컨테이너를 이용할 때 아무것도 하지 않아도 됩니다. node.js가 될 수도 있고 RESTful API가 될 수도 있습니다.

 

COPY

이제 dockerfile에 COPY라는 명령어를 사용해서 소스코드를 복사해 주도록 하겠습니다.

COPY 명령어를 사용하면 말 그대로 원하는 것을 복사할 수 있습니다. 개별 파일일 수도 있고 전체 폴더 구조가 될 수도 있습니다. 예제에서는 왼쪽에 보이는 전체 프로젝트를 복사하고 있습니다. var/www에 복사하고 있습니다. 이렇게 하므로 소스 코드를 파일 계층으로 만들어 도커가 이미지를 위해 구축한 계층화된 파일 시스템에 굽습니다. 그래서 이제 코드는 이미지 안에 있을 것이고 컨테이너에서 사용할 수 있게 됩니다.

 

WORKDIR

이제 WORKDIR를 설정하겠습니다.

작업 디렉터리는 실행할 수 있는 여러 명령의 컨텍스트를 설정합니다.  Docker 및 Docker 파일에 내장된 RUN 같은 명령어를 사용할 때 컨텍스트가 실행되어야 하는 폴더가 알아야 하기 때문에 작업 디렉터리 설정이 필요합니다.

 

RUN

작업 디렉터리를 설정하였기 때문에 RUN 명령어로 npm install 을 폴더 지정 없이 실행할 수 있습니다. 작업 디렉토리를 설정하지 않았다면 실제로 RUN 명령어를 실행할 곳의 컨텍스트를 알려줘야 package파일을 찾을 수 있을 것입니다.

 

VOLUME

이 작업 디렉토리와 관련하여 우리가 할 수 있는 또 다른 일은 컨테이너가 궁극적으로 실행될 호스트 시스템에서 어떤 이유로든 작업 디렉터리를 원할 수 있다는 겁니다. 그리고 그 방법은 볼륨을 사용하는 것입니다.

이제 컨테이너가 실행되면 Docker가 컨테이너에 있는 이 특정 볼륨을 호스트 파일 시스템의 폴더에 탑재하게 됩니다.

 

 


 

여기까지  읽어주셔서 감사합니다. 다음 포스트에서 실제로 만든 Dockerfile로 이미지를 만들고 컨테이너를 실행해 보도록 하겠습니다.

 

 

 

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기