1. 무엇을 컨테이너로 만드는가?
    1. 개발한 프로그램 (애플리케이션, 실행파일) 과 운영환경을 모두 컨테이너로 만듬. 
    2. MSA (Micro Service Architecture) 환경의 plyglot 애플리케이션 운영
      • MSA : 작고, 독립적으로 배포가능한 각각의 기능을 수행하는 서비스로 구성된 프레임워크
      • polyglot programming : 다양한 언어를 사용하여 프로그래밍하는것
  2. 컨테이너를  만드는 방법과 docker file의 정의
    1. dockerfile : container를 만들 수 있도록 도와주는 명령어 집합
      • 쉽고, 간단, 명확한 구문을 가진 text file 로 top-down 해석
      • 컨테이너 이미지를 생성할 수 있는 고유의 지시어(instruction)를 가짐
      • 대소문자를 구분하지 않으나, 가독성을 위해 사용함.
        $mkdir build
        $cd build
        $vi hello.js
        $vi dockerfile
        FROM node:12
        COPY hello.js /
        CMD ["node", "/hello.js"]
        $docker build -t imagename:tag .
        ㄴ . 은 현재 디렉토리에 있음을 의미함. 
    2. dockerfile 문법
      • # : comment, 간단한 설명 작성가능
      • FROM : 컨테이너의 base image(운영환경) 정의
                     항상 가장 먼저 정의해야 함 (top down 방식)
      • MAINTAINER : 컨테이너 빌드한 이름 등을 참조해서 넣을 수 있음
      • LABEL : 컨테이너 이미지에 컨테이너의 정보를 저장함.
      • RUN : base image에서 지원해주는 명령을 컨테이너를 빌드할 때 실행해줌.
      • COPY : 컨테이너 빌드 시 호스트의 파일을 컨테이너로 복사 (컨테이너 빌드 시점)
      • ADD: 컨테이너 빌드 시 호스트의 파일(tar, url 포함) 을 컨테이너로 복사
        ㄴ copy와 add의 경우, 컨테이너 빌드한 시점에, host의 파일을 컨테이너 안에 복사할 때 사용
      • WORKDIR : 컨테이너 안에서 명령이 실행될 작업 디렉터리 설정.
      • ENV : 컨테이너 안에서 환경변수 지정
      • USER : 명령 및 컨테이너 실행 시, 적용할 유저 설정 (보안적 관점과 연결됨)
      • VOLUME : 컨테이너가 동작될 때 volume mount 할 수 있도록 지원.
                          보통 컨테이너에서 애플리케이션 데이터가 저장되는 공간을 볼륨으로 선언.
      • EXPOSE : 컨테이너 동작 시, 외부에서 사용할 포트 지정
      • CMD : 컨테이너가 실행될 때 자동으로 동작 시켜주고 싶은 명령어 추가.(서비스 및 스크립트 지정)
      • ENTRYPOINT : cmd와 함께 사용하면서 commmand 지정 시 사용.
        ㄴ cmd는 컨테이너를 실행할 때, 명령어를 치환할 수 있음.
        ㄴ entrypoint는 컨테이너를 실행할 때, 명령어 치환을 차단함.
  3. 내가 만든 컨테이너 배포
    1. docker host / docker hub
      • $docker build -t imagename:tag .  : 이미지화 된 컨테이너가 HDD에 들어가있음.
      • $docker login : 컨테이너를 허브에 넣기 위해 인증(login)
      • $docker push imagename:tag : 컨테이너를 허브에 넣음 (다른사람이 사용할 수 있게됨)
    2. 예시