본문 바로가기
Cloud Platform/GCP

Starting with Docker in GCP (1) - 빌드(Build)

by 댓츠굿 2019. 5. 6.

 

 

이 포스트에서는 GCP의 Google Cloud Shell을 이용하여 Docker 컨테이너를 빌드하는 방법을 소개하겠습니다.

소개하기에 앞서 우선 도커에 대해 간단히 설명해 보겠습니다.

 

도커(Docker)리눅스응용 프로그램들을 소프트웨어 컨테이너 안에 배치시키는 일을 자동화하는 오픈 소스 프로젝트입니다. 또한, 어플리케이션 개발과 배포, 그리고 실행을 위한 개방형 플랫폼입니다.

도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감쌉니다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우릅니다. 이는 실행 중인 환경에 관계 없이 언제나 동일하게 실행될 것을 보증합니다.

(출처 : 위키백과

 

아래 링크는 Docker에 대해 더 상세하고 쉽게 설명해주고 있으니 참고바랍니다.

https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

 

초보를 위한 도커 안내서 - 도커란 무엇인가?

도커를 처음 접하는 시스템 관리자나 서버 개발자를 대상으로 도커 전반에 대해 얕고 넓은 지식을 담고 있습니다. 도커가 등장한 배경과 도커의 역사, 그리고 도커의 핵심 개념인 컨테이너와 이미지에 대해 알아보고 왜 이렇게 도커가 인기 인지 하나하나 살펴보겠습니다.

subicura.com

 

 

 

자, 이제 Docker 컨테이너를 빌드하는 방법을 소개하겠습니다.

 

 

 

1. 아래는 GCP 대시보드 화면입니다. 오른쪽 상단 바에서 [>_ ] 생긴 클라우드 쉘 실행 버튼을 클릭합니다.

 

GCP 대시보드

 

 

 

 

2. 그럼 아래와 같은 창이 열리는데, 'CLOUD SHELL 시작'을 클릭합니다.

Google Cloud Shell

 

 

 

2-1. 구글 클라우드 쉘 환경을 프로비저닝하고 연결하고 있습니다.

 

 

 

2-2. 프로비저닝을 마치면 아래와 같은 화면을 볼 수 있습니다.

 

 

 

2-3. docker -v 명령어를 이용하여 현재 설치된 Docker의 버전을 확인합니다.

 

  만약 설치되어 있지 않다면, 다음과 같은 Docker 설치 방법을 참조하시거나 구글링 해보세요.

  https://suwoni-codelab.com/docker/2018/06/06/Docker-Install/

 

Docker가 먼가요? - 2. Docker 설치

Docker 설치방법에 대해 정리해봅니다.

suwoni-codelab.com

 

 

 

 

3. Docker Hub에서 hello-world 이미지를 가져와 컨테이너 실행해보겠습니다.

   

   docker run hello-world 명령어를 치면 "Hello from Docker!" 문구를 포함한 다음과 같은 결과를 볼 수 있습니다.

     Docker 데몬이 로컬에서 이미지를 찾을 수 없으면 기본적으로 공개 레지스트리에서 이미지를 검색합니다.    

     출력된 결과를 보시면, 첫번째 줄에 "Unable to find image 'hello-world:latest' locally" 라는 문구를 볼 수 있습니다.

     이는 로컬에 이미지가 있으면 우선 적용시키지만, 현재 로컬에 hello-world 이미지가 없기때문에 나온 메시지이며,

     로컬에 없기 때문에 공개 registry인 Docker Hub에서 hello-world 이미지를 가져와 컨테이너를 생성하고 실행시켰습니다.

 

     참고) Docker Hub 내 hello-world link : https://hub.docker.com/_/hello-world

 

 

 

 

4. docker images 명령어를 실행하여 Docker Hub에서 가져온 컨테이너 이미지를 확인할 수 있습니다.

    REPOSITORY, TAG, IMAGE ID 등의 정보를 볼 수 있고, IMAGE ID는 SHA256 해시 형식입니다.

 

 

 

 

5. 다시 docker run hello-world 명령어를 쳐서 컨테이너를 실행시켜 보겠습니다.

3번과 달리, 이번에는 Docker 데몬이 로컬 registry에서 이미지를 찾은 뒤 이 이미지에서 컨테이너를 실행시킨 것을 확인할 수 있습니다.

 

 

 

 

4. docker ps 명령어를 실행하여 실행 중인 컨테이너를 확인합니다.

   hello-world 컨테이너가 종료되었기 때문에 실행중인 컨테이너가 하나도 없는 것을 확인할 수 있습니다.

 

 

 

 

5. 이번에는 docker ps -a 명령어를 실행하여 모든 컨테이너를 확인합니다.

 

 

 

 

6. 다음은 노드 어플리케이션을 기반으로 하는 Docker 이미지를 빌드해 보겠습니다. 

   mkdir study 명령어를 이용해 study 디렉토리를 만들고, study 디렉토리로 이동합니다.

   그리고 아래와 같이 vi 에디터로 Dockerfile 을 만듭니다.

  vi 에디터가 열리면 아래와 같이 설정해 줍니다.

# 어떤 이미지로부터 새로운 이미지를 생성할지를 지정

FROM node:10

 

# /app

WORKDIR /app

 

# /app

ADD . /app

 

# 80

EXPOSE 80

 

# (, app.js )

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

 

  위의 내용을 그대로 복사하고 붙여넣은 다음 Dockerfile을 저장하고, vi 에디터를 빠져나갑니다.

 

   Dockerfile이란 컨테이너 내부 환경을 말하며, Docker 이미지 외부 리소스와의 매핑 정보를 의미합니다.

   또한 빌드된 이미지를 Docker가 설치된 어디에서나 똑같이 실행되는 것을 기대할 수 있습니다. 

   Dockerfile도 .gitignore처럼 .dockerignore 파일을 가질 수 있으며, 이미지 빌드시 무시 할 파일들을 기재합니다.

 

   참조 ) Dockerfile 명렁어 참조 링크 : https://docs.docker.com/engine/reference/builder/#known-issues-run

 

 

 

 

7. 다음은 http://0.0.0.0:80/ 서버에 'Hello World!'를 반환하는 코드이며, 파일명은 app.js 입니다.

const http = require('http');

const hostname = '0.0.0.0';
const port = 80;

const server = http.createServer((req, res) => {
    res.statusCode = 200;
      res.setHeader('Content-Type', 'text/plain');
        res.end('Hello World!\n');
});

server.listen(port, hostname, () => {
    console.log('Server running at http://%s:%s/', hostname, port);
});

process.on('SIGINT', function() {
    console.log('Caught interrupt signal and will exit');
    process.exit();
});

 

 

 

 

8. Dockerfile이 있는 디렉토리에서 docker build 명령어를 이용하여 이미지를 빌드해 보겠습니다.

 docker build -t 레파지토리명/이미지명:태그명 빌드대상디렉토리

  -t는 name:tag 형식으로 이미지명과 태그를 지정합니다. 이미지명은 myapp이고 태그는 0.1입니다.

  태그를 지정하지 않으면 디폴트값인 latest가 지정됩니다.

 

  제가 친 명령어는 아래와 같습니다. 마지막 "."은 현재 디렉토리를 의미합니다.

docker build -t myapp:0.1 . 

docker 빌드

 

 

 

 

9. docker images 명령어를 실행하여 빌드한 이미지를 봅니다.

   myapp 이미지를 이미지 목록에서 볼 수 있습니다.

 

 

 

 

다음 포스트는 빌드된 이미지를 기반으로 하는 컨테이너를 실행시켜 보겠습니다.

 

 

반응형

'Cloud Platform > GCP' 카테고리의 다른 글

Starting with Docker in GCP (2) - 실행(execution)  (0) 2019.05.08