1 minute read

Image & Containers

Images vs Container

이미지

  • 이미지는 컨테이너를 위한 템플릿 / 청사진이다.
  • 코드와 필요한 툴 / 실행환경을 포함한다.
  • 일종의 공유 컨테이너이다.

컨테이너

  • 컨테이너는 소프트웨어가 실행되는 단위이다.
  • 이미지를 기반으로 다양한 환경에서 실행될 수 있다.
  • 일단 컨테이너가 실행되면, 해당 컨테이너는 독립적인 stand-alone이다.

외부 이미지의 사용 및 실행

Dockerhub에서 찾은 이미지를 사용할 수 있다.

docker run node(image-name) 명령어를 통해 dockerhub에 존재하는 이미지를 통해 로컬 컨테이너를 생성할 수 있다.

docker run -it node(image-name) 명령어를 통해 상호작용 가능한 node(받아온 이미지) 쉘을 실행할 수 있다.

node를 실행하기 위해 로컬에 별도로 node를 설치할 필요가 없다.

자체 이미지 빌드하기 (Dockerfile)

Dockerfile 생성

  1. FROM node(baseimage) 명령어로 시작한다.
  2. COPY source dest 를 통해 도커에 넣어줄 이미지를 선택한다.
    • . : 현재 경로 내 모든 파일
    • dest 경로가 존재하지 않으면 폴더를 생성하고 생성된 컨테이너에 넣어준다.
  3. RUN npm install 으로 종속성을 설치해준다.
  4. 종속성을 설정된 경로에서 실행하기 위해, WORKDIR /path/ 명령어를 추가한다.
  5. RUN node server.js 를 통해 이미지를 통해 서버를 구축할 수 있다.
  6. 이미지를 통해 컨테이너를 시작하는 경우에만 서버를 구축하기 위해, RUN 명령어 대신 CMD 명령어로 변경한다.
    • 이를 통해 한 이미지로 여러 컨테이너를 시작하면 node 서버도 여러개를 구축할 수 있다. (Container - based)
  7. EXPOSE 80 명령어를 통해 로컬에 컨테이너 포트를 전달한다.
    • 이 명령어를 추가하지 않으면 포트는 컨테이너 내부에서만 작동한다.
# THIS IS Dockerfile

FROM node

  

WORKDIR /app

  

COPY . ./

  

RUN npm install

  

EXPOSE 80

  

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

Dockerfile 기반 이미지 빌드하기

위의 과정을 거쳤음에도, 컨테이너의 실행은 가능하나 localhost에서의 접근은 불가능하다. EXPOSE 명령어가 도큐먼테이션 목적으로만 추가되었기 때문이다. 이를 해결하기 위해 run시에 -p(Publish) 명령어를 추가한다.

  • -p 명령어는 도커에 어떤 포트가 있는지 알려준다.
  • -p [local port number]:[container port number]를 추가한다.

옵션을 추가해주면 localhost:3000에서 정상작동함을 확인할 수 있다.

  • ID를 사용하는 모든 docker 명령의 경우, 항상 ID 전체를 복사할 필요는 없으며 식별 가능한 문자 길이만을 가지고 있으면 된다.
  • 예 : docker run abcdefg 대신 docker run abc 혹은 docker run a 를 사용할 수 있다.

Image

이미지는 읽기 전용이다.

  • 변경된 소스 코드를 적용하기 위해서는 이미지를 새로 빌드해야 한다.
    • 이미지는 변경되는 소스코드에 따라서 동적으로 변경이 적용되지 않고 한번 빌드된 것이 최종 결과물이다.

이미지 레이어의 이해

  • 도커는 캐시를 사용해, 이전에 명령어를 사용했을때의 결과가 동일하면 캐시된 결과를 재사용한다.
  • 한 부분이라도 변경되면 레이어를 새로 빌드한다.
# THIS IS Dockerfile

FROM node

  

WORKDIR /app

  

COPY package.json /app

  

RUN npm install

  

COPY . /app

  

EXPOSE 80

  

CMD ["node", "server.js"]
  • 변경된 소스코드만을 다시 빌드하게 해주는 변경된 Dockerfile이다.
    • 이전 소스코드는 새 빌드 시마다 매번 npm install을 실행해야 했다.
    • 이제 소스코드 변경 후 빌드되는 시간이 확연하게 줄어든다.(매번 의존성 파일을 새로 설치하지 않으므로)

Leave a comment