반응형
  • 무엇을 컨테이너로 만드나요?
  • 컨테이너 어떻게 만들어요? Dockerfile이 무엇인가요?
  • 내가 만든 컨테이너를 배포하려면??

 

무엇을 컨테이너로 만드는거죠?

  • 개발한 애플리케이션(실행파일)과 운영환경이 모두 들어있는 독립된 공간

node.js애플리케이션을 예로들어보자.
먼저, 운영환경이 필요하다. (node.js) 왜냐하면, node.js소스코드이기 떄문에, node.js환경이 없이는 소스코드를 해석할 수 없기 때문이다. 그러니 node.js운영환경이 필요하다.
그리고 소스코드가 들어가고, 해당 컨테이너가 실행될 때 자동으로 동적시켜줄 명령어를 넣어주면 하나의 애플리케이션 컨테이너가 독립된 공간으로 만들어진다. 

이렇게 독립된 공간으로 만들어진 컨테이너를 어떻게 사용하는 것일까? 

  • 개발한 프로그램과 실행환경을 모두 컨테이너로 만든다.
  • MSA(Micro Service Architecture) 환경의 Polyglot 애플리케이션 운영 

✓ Polyglot Programming : 다양한 언어를 사용하여 프로그래밍 하는 것

예를 들어 backend를 처리할 때 적합한 language는 node.js, front의 ui를 처리하는데에 적합한 language는 php, 또는 빅데이터를 처리하는데에 적합한 language는 python, r 등 이러한 프로그램 언어가 있는데, 
하나의 e-commerce platform을 구현하는데 "shopping cart'라고하는 컨테이너를 만들 때는 Java로, 'Competed Orders'라는 컨테이너를 만들 때에는 php로, 상품관리를 위한 "Inventory & Item Price"컨테이너를 만들 때는 node.js로 만드는 등 다양한 언어를 이용하여 해당 어플리케이션을 구현하는데에 가장 적합한 언어를 선택해서 하나의 플랫폼을 구현할 수 있다. 

즉, e-commerce platform을 구축한다고 가정하면,  해당 플랫폼을 구현하는데에 다양한 컨테이너를 이용해서(컨테이너화 시켜서) 만들 수 있다. 

이렇게 만들어진 컨테이너는, 예를들어 shopping cart에 기능을 추가하려면 해당 컨테이너만  업데이트 시켜주면 된다. 다른 컨테이너에는 영향을 주지 않는다. 네트워크를 통해서 독립된 공간으로 서비스가 되기 때문이다. 이렇게 운영하는 플랫폼을 MSA(Micro Service Architecture)라고 부른다. 

 

컨테이너 만드는 법? Dockerfile?

  • Dockerfile을 이용해 컨테이너를 빌드한다.
  • Dockerfile은 (Container를 만들 수 있도록 도와주는 명령어 집합) 
    • 쉽고 간단, 명확한 구문을 가진 text file로 Top-Down해석
    • 컨테이너 이미지를 생성할 수 있는 고유의 지시어(Instruction) 를 가짐
    • 대소문자 구분하지 않으나 가독성을 위해 사용함

$ mkdir build
$ cd build
$ vi dockerfile
FROM node:12
COPY hello.js /
CMD ["node", "/hello.js"]

$ docker build -t imagename:tag .

도커파일을 만들어서 컨테이너를 만드는 작업이 어렵고 복잡하지는 않다. 다만, 어떤 형태로 컨테이너를 만들어 낼것인지 먼저 기획을 하고 그런다음 그것들을 하나하나의 컨테이너로 만들어내는 작업을 하는 것이다. 

많이 사용하는 Dockerfile문법을 간단히 알아보자.

  • Dockerfile 문법
Dockerfile 명령어 기능
# comment
FROM 컨테이너의 BASE IMAGE(운영환경)
MAINTAINER 이미지를 생성한 사람의 이름 및 정보
LABEL 컨테이너이미지에 컨테이너의 정보를 저장
RUN 컨테이너 빌드를 위해 base image에서 실행할 commands
COPY 컨테이너 빌드시 호스트 파일을 컨테이너로 복사
ADD 컨테이너 빌드시 호스트 파일(tar, url포함)을 컨테이너로 복사
WORKDIR 컨테이너 빌드시 명령이 실행될 작업 디렉토리 설정
ENV 환경변수 지정
USER 명령 및 컨테이너 실행 시 적용할 유저 설정
VOLUME 파일 또는 디렉토리를 컨테이너의 디렉토리로 마운트
EXPOSE 컨테이너 동작 시 외부에서 사용할 포트 지정
CMD 컨테이너 동작 시 자동으로 실행할 서비스나 스크립트 지정
ENTRYPOINT CMD와 함께 사용하면서 command 지정 시 사용

 

아래의 컨테이너를 만든다고 가정해보자.(Dockerfile 예제)

  • Dockerfile 예제

$ mkdir build 
$ cd build
$ vi hello.js
$ vi dockerfile
FROM node:12
COPY hello.js /
CMD ["node", "/hello.js"]

$ docker build -t hellojs:latest .

먼저 $ mkdir build, $ cd build  를 통해 서브디렉토리를 하나 만들어 놓는다. 
그리고 해당 디렉토리에 hello.js파일 (소스코드)가 있어야하고,
그리고나서 dockerfile을 만든다.
FROM뒤에는 운영환경을 넣어준다. (해당 어플리케이션이 실행되기 위한 운영환경) - 위 예제의 node:12 도 컨테이너임(base image)

base image(node:12)에 있는 해석키를 이용해서 hello.js의 소스코드를 동작시킬 수 있다. 

그리고 COPY를 이용해서 hello.js소스코드를 컨테이너의 최상위 디렉토리로 복사해서 넣어주었다. 

그리고 CMD로 node hello.js동작시켜 달라고 넣어주었다. 

이렇게 넣어준 다음 $ docker build -t hellojs:latest . 명령어로 컨테이너를 빌드해서 만들어주면 된다. (.을 잊으면 안된다-현재 디렉토리에 있다는 뜻)

그러면 "hellojs:latest"라는 이름의 컨테이너가 만들어 진다.

 

내가 만든 컨테이너를 배포하려면?

Docker Host와 Hub가 환경으로 존재한다.

앞서, 무엇을 컨테이너로 만들지 구상 및 기획을 했고, 컨테이너를 만들었다. 
이때, docker build라는 명령어를 이용했다.

그러면, 이미지화된 컨테이너가 하드디스크에 저장되어 있다. 

이제 이 컨테이너를 다른사람들도 사용할 수 있도록 배포해야 한다. 그러면 hub에 넣으면 될 것이다.  
hub에 넣기 위해서는 어떻게 해야할까? Private hub든,  public hub든 아무나 hub에 넣진 못할 것이다.
따라서 먼저 허가를 받아야 한다.(인증을 받아야 한다) 허브에서 허가받은 유저의 유저네임,패스워드를 넣어준다.

인증 받은 다음에, docker push를 명령을 내리면, Docker Host에 있는 내가 만든 컨테이너 이미지가 hub에 저장이 되게 된다. 

이렇게 해주면 해당 컨테이너는 다른사람이 사용할 수 있게 된다. 

이것을 이제 고객사가 이용할 수 있게 된다. 

이것이 컨테이너를 배포하는 방법이다. 

추가로 해보면 좋은 것을 소개하겠다.

https://hub.docker.com/

 

Docker Hub Container Image Library | App Containerization

We and third parties use cookies or similar technologies ("Cookies") as described below to collect and process personal data, such as your IP address or browser information. You can learn more about how this site uses Cookies by reading our privacy policy

hub.docker.com

해당 사이트에 접속해서 Eplore탭에 들어가보자.

수많은 컨테이너가 있다. 그중에 mysql을 클릭해보자.

클릭을 하면, mysql에 대한 설명이 쭉 나온다.

mysql container

그중에 여러가지 버전을 볼 수 있는데 해당 버전을 클릭하면 해당 버전의 도커파일을 볼 수 있다.

클릭하면 다음과 같이 도커파일 소스코드를 볼 수 있다.

이렇게 도커파일을 자주 접하며 소스코드를 분석해보자. 도커파일 생성에 도움이 될 것이다.

반응형