본문 바로가기

Cloud/Docker

[Docker] 도커를 이용한 애플리케이션 컨테이너화 및 배포 과정

도커를 쓰는 이유

컨테이너를 실행하면 호스트 PC에 영향을 주지 않고 서로 다른 종속성을 동시 실행할 수 있다.

 

 

컨테이너 실행 과정

도커 파일로 도커 이미지를 만들고, 이미지를 실행하면 컨테이너가 된다.

(마치 프로그램을 메모리에 올리면 프로세스가 되듯, 이미지를 실행하면 컨테이너가 됨)

 

 

주요 명령어

  • docker images : 조회
  • docker pull {이미지 이름} : 이미지 다운로드
  • docker run : 실행 (image -> container)
  • docker ps -a : 실행 중인 도커 컨테이너 목록 조회
  • docker exec : 실행 중인 컨테이너 내부에 들어가는 경우 (자주 쓰는 명령어)
  • docker rm : stop, 컨테이너 삭제
  • docker rmi : 이미지 삭제
  • 컨테이너 내부로 들어가는 기본 명령어 : $ docker exec -it {컨테이너 이름} /bin/bash

 

 

도커파일과 이미지는 어떻게 생겼을까

❓<dockerfile>

# syntax=docker/dockerfile:1

FROM node:lts-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000

 

설명

  • FROM : node:lts-alpine 이미지를 기반으로 컨테이너 생성
  • WORKDIR : 컨테이너 내에서 /app 디렉토리를 작업 디렉토리로 지정
  • COPY : 현재 디렉토리(.)의 모든 파일을 컨테이너의 /app 디렉토리로 복사
    • 로컬 프로젝트 파일들이 컨테이너 내부로 복사
    • .dockerignore 파일을 활용하면 불필요한 파일을 제외할 수도 있음
  • RUN : 컨테이너 이미지 빌드 시 해당 명령어를 실행하여 의존성 설치
  • CMD : 컨테이너 시작 시 node src/index.js를 실행
  • EXPOSE : 3000번 포트 노출

 

도커 파일 구성

명령어 동작  
FROM 베이스 이미지 지정  
RUN 컨테이너 이미지 빌드 시 실행할 명령어 지정 빌드 시 1번
ARG  컨테이너 빌드 시 사용할 변수 설정  
CMD 컨테이너 시작 시 실행할 기본 명령어 컨테이너 실행 시 n번
ENTRYPOINT 컨테이너 시작 시 실행할 동작 지정 (CMD와 유사) CMD와 유사하지만 ENTRYPOINT는 컨테이너 실행 시 param 값을 대체할 수 없음
LABEL 이미지 메타데이터 key-value 형식
ENV 실행 시 환경변수 설정 (ARG와 유사) key-value 형식, 실행 시
EXPOSE 컨테이너가 외부와 통신하기 위해 사용하는 포트 지정  
COPY 호스트 내 파일 및 디렉토리를 컨테이너의 파일시스템으로 복사  
ADD 파일 및 디렉토리를 컨테이너로 복사 (COPY와 유사) COPY와 달리 호스트 외에도 경로(URL)를 지정하여 remote 파일/디렉토리 복사 가능
USER 컨테이너 안에서 명령을 실행할 유저명, 유저그룹을 설정  
WORKDIR 작업 디렉토리 설정  
VOLUME 컨테이너 내의 특정 디렉토리를 컨테이너 외부 경로에 마운트(연결)  

 

 

<이미지>

Dockerfile을 기반으로 생성되는 이미지는 내부적으로 계층(layer) 구조로 되어 있어서 시각적으로 보기 어렵지만, 기본적으로 계층구조를 갖는다. 

위의 dockerfile을 $docker build로 이미지화하고 $docker history로 이미지 생성 기록을 볼 수 있다.

$ docker history getting-started

 

IMAGE          CREATED        CREATED BY                            SIZE
d1f10f3b9d48   5 minutes ago  CMD ["node" "src/index.js"]          0B
e74e9609e4c8   5 minutes ago  RUN yarn install --production        62MB
8f19e633f763   5 minutes ago  COPY . .                             500kB
b4d2be07c6d7   5 minutes ago  WORKDIR /app                         0B
78f9f40d4d3a   6 weeks ago    FROM node:lts-alpine                 116MB

 

Docker 이미지는 여러 개의 레이어(layer)로 구성된다. 각 레이어는 베이스 이미지부터 시작해, 필요한 종속성과 애플리케이션 코드가 추가되면서 하나의 최종 이미지를 형성한다.

 

이미지는 어디서 어떻게 구하는가

직접 dockerfile을 작성해 이미지를 만들 수 있지만, 결국 nginx와 같은 환경요소는 기존에 있는 이미지를 불러와 사용해야하므로 제공되는 이미지를 외부에서 내려받아 사용한다.

클라우드 상의 저장소로부터 이미지를 다운로드 받을 수 있는데, 대표적인 레포지토리는 다음과 같다.

  • Docker Hub
  • Amazon ECR
  • Github Container Repository

 

 

전반적이고 기본적인 배포과정 명령어

 

1. 배포할 소스코드 준비

 

도커 워크샵 공식문서를 기반으로, 이미 구현된 코드를 바탕으로 dockerfile를 구성하고 이미지화하여 컨테이너로 배포하는 과정을 기술한다.

$ git clone https://github.com/docker/getting-started-app.git

 

 

여기서 코드를 내려받으면 아래와 같은 디렉토리 구조로 파일이 로드된다.

├── getting-started-app/
│ ├── .dockerignore
│ ├── package.json
│ ├── README.md
│ ├── spec/
│ ├── src/
│ └── yarn.lock

 

 

2. dockerfile 생성

getting-started-app 디렉토리 하위에 Dockerfile을 생성한다.

📍 애플리케이션 코드가 위치한 최상위 폴더에 Dockerfile을 생성한다.

# syntax=docker/dockerfile:1

FROM node:lts-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
├── getting-started-app/  
│   ├── Dockerfile        # 👈🏻 Dockerfile을 여기에 위치
│   ├── .dockerignore  
│   ├── package.json  
│   ├── README.md  
│   ├── spec/  
│   ├── src/  
│   └── yarn.lock

 

 

3. docker 이미지 빌드

getting-started-app/ 디렉토리에서 다음 명령어를 실행한다.

$ docker build -t getting-started .

 

 

4. docker 이미지 실행(=컨테이너화)

$ docker run -d -p 127.0.0.1:3000:3000 getting-started

 

 

5. 프로그램 실행 확인

http://localhost:3000에서 확인 가능!

 

 

6. 실행화면

$docker build로 dockerfile>image
$docker run으로 image>container
컨테이너 실행 시 localhost:3000 화면

 

도커 데스크탑으로 본 이미지 계층