[Docker] Section 2 - docker 이미지 & 컨테이너(1)
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 생성
FROM node(baseimage)
명령어로 시작한다.COPY source dest
를 통해 도커에 넣어줄 이미지를 선택한다..
: 현재 경로 내 모든 파일- dest 경로가 존재하지 않으면 폴더를 생성하고 생성된 컨테이너에 넣어준다.
RUN npm install
으로 종속성을 설치해준다.- 종속성을 설정된 경로에서 실행하기 위해,
WORKDIR /path/
명령어를 추가한다. - RUN node server.js 를 통해 이미지를 통해 서버를 구축할 수 있다.
- 이미지를 통해 컨테이너를 시작하는 경우에만 서버를 구축하기 위해,
RUN
명령어 대신CMD
명령어로 변경한다.- 이를 통해 한 이미지로 여러 컨테이너를 시작하면 node 서버도 여러개를 구축할 수 있다. (Container - based)
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