Docker

Docker - 이미지 빌드 및 실행

androowl 2020. 5. 26. 11:03

소개 

Docker Desktop 덕분에 개발 환경을 설정 했으므로 컨테이너화 된 응용 프로그램 개발을 시작할 수 있다. 일반적으로 개발 워크 플로는 다음과 같다.

  1. 먼저 Docker 이미지를 만들어 애플리케이션의 각 구성 요소에 대한 개별 컨테이너를 만들고 테스트.
  2. 컨테이너와 지원 인프라를 완전한 애플리케이션으로 조립.
  3. 완전한 컨테이너화 된 응용 프로그램을 테스트, 공유 및 배포.

이 단계에서는이 워크 플로우의 1 단계 : 컨테이너의 기반이 될 이미지 작성에 초점을 맞춘다. Docker 이미지는 컨테이너화 된 프로세스가 실행될 개인 파일 시스템을 캡처한다. 응용 프로그램을 실행하는 데 필요한 내용만 포함 된 이미지를 만들어야한다.

컨테이너화 된 개발 환경 은 아래에서 논의 할 이미지 작성 방법을 익히면 기존 개발 환경보다 설정하기 쉽다. 컨테이너화 된 개발 환경이 앱이 Docker 이미지 내부에 필요한 모든 종속성을 분리하기 때문이다. 개발 시스템에 Docker 이외의 것을 설치할 필요가 없다. 이러한 방식으로 개발 시스템에서 아무 것도 변경하지 않고도 다른 스택에 대한 응용 프로그램을 쉽게 개발할 수 있다.

 설정

Docker Samples 페이지 에서 예제 프로젝트를 다운로드.

Git

Git을 사용하는 경우 GitHub에서 예제 프로젝트를 복제 할 수 있다.

git clone https://github.com/dockersamples/node-bulletin-board 
cd node-bulletin-board/bulletin-board-app

 

 node-bulletin-board프로젝트는 Node.js로 작성된 간단한 게시판 응용 프로그램이다. 이 예제에서는이 앱을 작성했으며 이제 컨테이너화하려고한다고 가정하겠음.

Dockerfile을 사용하여 컨테이너 정의 

Dockerfile게시판 애플리케이션에서 호출된 파일을 살펴보자. Dockerfile은 컨테이너의 개인 파일 시스템을 어셈블하는 방법을 설명하고 이 이미지를 기반으로 컨테이너를 실행하는 방법을 설명하는 메타 데이터도 포함 할 수 있다. 게시판 앱 Dockerfile은 다음과 같다.

# Use the official image as a parent image. 
FROM node:current-slim 

# Set the working directory. 
WORKDIR /usr/src/app 

# Copy the file from your host to your current location. 
COPY package.json . 

# Run the command inside your image filesystem. 
RUN npm install 

# Inform Docker that the container is listening on the specified port at runtime. 
EXPOSE 8080 

# Run the specified command within the container. 
CMD [ "npm", "start" ] 

# Copy the rest of your app's source code from your host to your image filesystem. 
COPY . .

Dockerfile 작성은 애플리케이션 컨테이너화의 첫 번째 단계다. 이러한 Dockerfile 명령은 이미지를 작성하는 방법에 대한 단계별 레시피로 생각할 수 있다. 이것은 다음 단계를 수행한다.

  • FROM 기존 node:current-slim이미지를 시작. 이것은 node.js 벤더가 빌드하고 Docker가 Node.js LTS (Long Term Support) 인터프리터 및 기본 종속성을 포함하는 고품질 이미지임을 확인한 공식 이미지다.
  • WORKDIR 모든 후속 조치가 /usr/src/app 이미지 파일 시스템 의 디렉토리 (호스트의 파일 시스템이 아님) 에서 수행되도록 지정하는 데 사용.
  • COPY package.json 호스트에서 이미지의 현재 위치 ( ) 까지의 파일 (이 경우 /usr/src/app/package.json)
  • RUN npm install 이미지 파일 시스템 내부 의 명령 ( package.json앱의 노드 종속성을 확인하고 설치하기 위해 읽음 )
  • COPY 호스트에서 이미지 파일 시스템으로의 나머지 앱 소스 코드에서.

이 단계는 호스트에서 앱을 설정하고 설치하기 위해 수행 한 단계와 거의 동일하다. 그러나 이러한 파일을 Dockerfile로 캡처하면 격리 된 휴대용 Docker 이미지 내에서 동일한 작업을 수행 할 수 있다.

위의 단계는 이미지의 파일 시스템을 구축했지만 Dockerfile에는 다른 줄이 있다.

CMD지시어는 이 이미지를 기반으로 컨테이너를 실행하는 방법에 대해 설명 이미지에 약간의 메타 데이터를 지정하는 최초의 예이다. 이 경우, 이 이미지가 지원하는 컨테이너화 된 프로세스는 npm start 다.

EXPOSE 8080컨테이너가 런타임에 포트 8080에서 수신되는 정보 용 도커.

위에서 본 것은 간단한 Dockerfile을 구성하는 좋은 방법이다. 항상 FROM명령으로 시작하고 개인 파일 시스템을 빌드하는 단계를 수행하고 메타 데이터 사양으로 마무리하자. 위에서 본 것보다 더 많은 Dockerfile 지시문이 있다. 전체 목록은 Dockerfile 참조를 참조.

이미지 빌드 및 테스트 

이제 소스 코드와 Dockerfile이 준비되었으므로 이제 첫 번째 이미지를 빌드하고 시작된 컨테이너가 예상대로 작동하는지 확인해야 한다.

Windows 사용자 :이 예제는 Linux 컨테이너를 사용한다. 시스템 트레이에서 Docker 로고를 마우스 오른쪽 버튼으로 클릭 하고 옵션이 나타나면 Linux 컨테이너로 전환을 클릭하여 환경이 Linux 컨테이너를 실행 중인지 확인 . 이 학습서의 모든 명령은 Windows 컨테이너에 대해 동일한 방식으로 작동한다.

cd node-bulletin-board/bulletin-board-app 명령을 사용하여 터미널 또는 PowerShell 의 디렉토리에 있는지 확인. 게시판 이미지를 만들어 보자 :

docker build --tag bulletinboard:1.0 .

Docker가 Dockerfile의 각 명령을 단계별로 수행하여 이미지를 그대로 빌드하는 것을 볼 수 있다. 성공하면 빌드 프로세스가 메시지로 끝나야한다 Successfully tagged bulletinboard:1.0.

Windows 사용자 : 이 단계에서 이미지에 추가 된 파일에 대해 설정된 읽기, 쓰기 및 실행 권한을 나타내는 '보안 경고'라는 제목의 메시지가 표시 될 수 있다. 이 예에서는 민감한 정보를 다루지 않으므로이 예에서는 경고를 무시.

컨테이너로 이미지 실행 

  1. 새 이미지를 기반으로 컨테이너를 시작.

docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0
  1. 여기에 몇 가지 공통 플래그가 있다.

    • --publish Docker는 호스트의 포트 8000에서 들어오는 트래픽을 컨테이너의 포트 8080으로 전달하도록 요청. 컨테이너에는 자체 전용 포트 세트가 있으므로 네트워크에서 포트에 도달하려면 이러한 방식으로 트래픽을 전달. 그렇지 않으면 방화벽 규칙으로 인해 모든 네트워크 트래픽이 기본 보안 상태로 컨테이너에 도달하지 못함.
    • --detach Docker 에게 이 컨테이너를 백그라운드에서 실행하도록 요청.
    • --name 이 경우 후속 명령에서 컨테이너를 참조 할 수있는 이름을 지정 bb.

    또한 컨테이너를 실행할 프로세스를 지정하지 않았다. CMDDockerfile을 빌드 할 때 지시문을 사용 했으므로 필요하지 않다 . 덕분에 Docker는 프로세스 npm start가 시작될 때 컨테이너 내부에서 프로세스를 자동으로 실행하는 것을 알고 있다.

  2. 브라우저에서 localhost:8000으로 애플리케이션을 실행한다. 게시판 응용 프로그램이 시작되어 실행 중이어야 한다. 이 단계에서는 일반적으로 컨테이너가 예상 한대로 작동하도록 할 수있는 모든 작업을 수행한다. 예를 들어 지금은 단위 테스트를 실행할 때이다.

  3. 게시판 컨테이너가 올바르게 작동하면 다음을 삭제할 수 있다.

    docker rm --force bb

     --force옵션은 실행중인 컨테이너를 중지하므로 제거 할 수 있습니다. docker stop bb먼저 컨테이너 실행을 중지하면 컨테이너 --force를 제거 할 필요가 없다 .

결론 

이 시점에서 이미지를 성공적으로 빌드하고 응용 프로그램의 간단한 컨테이너화를 수행 한 다음 해당 컨테이너에서 앱이 성공적으로 실행되는지 확인했다. 다음 단계는 Docker Hub 에서 이미지를 공유하여 대상 컴퓨터에서 쉽게 다운로드하여 실행할 수 있도록 하는 것이다.

'Docker' 카테고리의 다른 글

Docker - macOS에 Docker Toolbox 설치  (0) 2020.05.26
Docker - Docker Hub에서 이미지 공유  (0) 2020.05.26
Docker - 오리엔테이션 및 설정  (0) 2020.05.26
Docker 개요  (0) 2020.05.26