6. 도커 컨테이너 만들어보기

1. 무엇을 컨테이너로 만드는가

컨테이너 = 개발한 애플리케이션과 운영환경이 모두 들어있는 독립된 공간

MSA 환경의 Polyglot 애플리케이션 운영

독립적인 구조에서 운영환경과 실제 어플리케이션이 같이 들어있기 때문에
필요한 부분만 수정/업데이트가 가능하다.(MSA) 
따라서 어플리케이션마다 적합한 다양한 언어나 환경이 동시에 필요한 상황에서 진면모를 발휘함.(Polyglot)

2. 어떻게 컨테이너를 만드는가

Dockerfile : Container를 만들 수 있도록 도와주는 명령어 집합(Text file)

컨테이너 이미지를 생성할 수 있는 고유의 지시어를 가짐

Ex.

$ mkdir build
$ cd build
$ vi hello.js
$ vi dockerfile

FROM node:12
COPRY hello.js /
CMD ["node", "/hello.js"]

$ docker build -t hellojs:latest .
#			comment
FROM		컨테이너의 BASE IMAGE(운영환경)						#도커파일 가장먼저
COPY		컨테이너 빌드시 호스트의 파일을 커넽이너로 복사			#컨테이너 빌드 시점에서 파일 적용
ADD			컨테이너 빌드시 호스트의 파일을 컨테이너로 복사			#copy 능력 + tar, url 적용 등 추가 기능
RUN			컨테이너 빌드를 위해 base image에서 실행할 commands

MAINTAINER	이미지를 생성한 사람의 이름 및 정보
LABEL		컨테이너이미지에 컨테이너의 정보를 저장


WORKDIR		컨테이너 빌드시 명령이 실행될 작업디렉터리 설정
ENV			환경변수 지정											#컨테이너 안에 남아 있음
USER		명령 및 컨테이너 실행시 적용할 유저 설정					#기본은 root, 보안적 관점에서 시스템 관리자를 따로 두는 것이 안전
VOLUME		파일 또는 디렉토리를 컨텡이너의 디렉토리로 마운트			#컨테이너 running 시 애플리케이션이 동작하는 공간을 volume으로 설정(영구 보존)
EXPOSE		컨테이너 동작 시 외부에서 사용할 포트 지정

CMD			컨테이너 동작 시 자동으로 실행할 서비스나 스크립트 지정		#명령어 치환이 가능	argument/option
ENTRYPOINT	CMD와 함께 사용하면서 command 지정 시 사용				#명령어 치환이 불가(명령 보호)	bin

 

3. 어떻게 컨테이너를 배포하는가

Docker Host --- Docker Hub(Registery)

제작한 컨테이너를 허브에 올려 놓아야함.

 

1. 허브 인증

2. 허가받은 계정 로그인

3. 도커 컨테이너 이미지 Push

docker build -t hellojs:latest .		#도커 컨테이너 제작
docekr login							#인증 계정으로 로그인
docker push hellojs:latest				#도커 컨테이너 허브로 푸쉬

 

 


[실습]

1. nodejs 애플리케이션 컨테이너 만들기 : hellojs
2. 우분투 기반의 웹 서버 컨테이너 만들기
3. 만들어놓은 컨테이너 배포하기

1. nodejs 애플리케이션 컨테이너 만들기 : hellojs

```

node.js - 백그라운드에서 실행되는 어플리케이션 제작에 많이 사용되는 언어

```

1. node.js 소스코드 제작

const http = require('http');         		#Web service 지원
const os = require('os');					#OS service 지원
console.log("Test server starting...");		#실행시 standard output에 로그 메세지 출력

var handler = function(request, response) {	#사용자가 80포트를 이용하여 서비스를 실행하면
        console.log("Received request from " + request.connection.remoteAddress); #접속 로그 메세지 출력        
	response.writeHead(200);	#200번 상태 코드 전송( = Web service에서 지극히 정상이라는 표현)
        response.end("Container Hostname : " + os.hostname() + "\n");	#호스트 네임 출력(컨테이너 호스트 네임 = 컨테이너 네임)
};

var www = http.createServer(handler);		#클라우드 서비스 대기
www.listen(8080);							#포트 80(8080) 사용

2. 도커파일 제작

코드는 존재하지만 인터프리팅 할 수 있는 환경(node)이 필요 - 컨테이너 내 포함

node.js 자체도 컨체이너로 존재(Base Image)

FROM node:12		#Base image(하나의 컨테이너) - 운영환경
COPY hello.js /		#현재 디렉토리의 hello.js 를 컨테이너의 최상위 디렉토리로 복사(ADD도 가능)
CMD ["node", "/hello.js"]	#명령 - node라는 명령을 가지고 루트에 있는 hello.js를 실행

컨테이너 이미지 제작

docker build -t hellojs:latest .
#이미지 빌드
# . 현재 디렉토리에 있는
# -t hellojs:latest = hellojs라는 태그로 최신파일을 대상으로 빌드한다

입력한 소스코드에 따라 3개의 이미지 생성(FROM, COPY, CMD) - Top-down 방식으로 진행

컨테이너 제작 완료!

 


2. Ubuntu 기반의 웹 서버 컨테이너 만들기

```

nginx, httpd - 웹서버 제작에 많이 쓰이는 언어

```

FROM ubuntu:18.04		#우분투 18.04 버전
LABEL maintainer="DongCheon Kim <kindongsy@cinamon.co.kr>"		#개발자 정보
# install apche		#Comment
RUN apt-get update \	#컨테이너 빌드시 작동할 내부 명령
        && apt-get install -y apache2		#&&를 사용하여 여러개의 명령을 한 줄로 실행(Ubuntu - Bash) [= 1 layer = 1 image]
RUN echo "TEST WEB" > /var/www/html/index.html		#apache web server 설치시 해당 폴더에서 웹서비스 제공
EXPOSE 80		#서비스 포트 웹(80)
CMD ["/usr/sbin/apache2ctl", "-DFOREGROUND""]		#ubuntu - apache web server daemon, apache 동작 argument
이전 시간에 배운 hello.js - 어플리케이션 / 이번시간에 배운 것은 실제 인프라 구축

 

동작확인(+컨테이너 삭제 -f 는 강제종료)

 

hello.js 도 확인

 

3. 만들어놓은 컨테이너 배포하기(Push)

docker login		#도커 허브 계정

docker tag webserver:v1 kindongsy/webserver:v1		#도커 개인 저장소에 업로드하기 위해서는 본인의 아이디로 시작되어야함.
docker tag webserver:v1 kindongsy/hellojs:latest

docker images	#tag 명령어로 인해복사된 모습 확인 가능

docker push kindongsy/webserver:v1
docker push kindongsy/hellojs:latest	#도커 허브에 푸쉬

 

 

모든 출처는 https://youtu.be/9qnD8aODu-4

유튜브 - 'TTABAE-LEARN'