본문 바로가기
Docker/이론

[Docker] 3.Container(3)

by Haengsin 2021. 8. 3.

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

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

 

 

 

Polyglot

- 개발한 프로그램과 실행환경을 모두 컨테이너로 만들어, MSA(Micro Service Architecture) 환경이 Polyglot 애플리케이션 운영. 예를 들어, shopping cart는 java, competed order는 php로 Inventory&Item price는 node.js로 Application을 개발하는 데 가장 적합한 언어를 선택하여 하나의 플랫폼(E-commerce Platform)을 구현할 수 있다.

- 위와 같이 개발될 경우, Shopping Cart에 업데이트할 사항이 있다면 해당 컨테이너만 업데이트시켜주면 된다. 독립된 공간으로 서비스가 되기 때문에 다른 컨테이너에는 영향을 주지 않는다.

- 즉, 각각의 Application 에 맞춰 Container를 만들어낸다.

 

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

 

 

Q2. 컨테이너 어떻게 만들어요? Dockerfile이 뭐죠?

※ Dockerfile : Container를 만들 수 있도록 도와주는 명령어 집합

- Dockerfile 을 이용해 컨테이너를 빌드한다.

- Dockerfile 은

                 > 쉽고, 간단, 명확한 구문을 가진  text file로 Top-Down 해석.

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

                 > 대소문자 구분하지 않으나 가독성을 위해 사용함

                     $ mkdir build

                     $ cd build

                     $ vi hello.js 

const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req,res)=>{
 res.statusCode = 200;
 res.setHeader('Content-Type','text/plain');
 res.end('Hello World');
});
server.listen(port, hostname, ()=>{
 console.log('Server running at http://$(hostname):$(port)/');
});

                     $ vi dockerfile

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

                     $ docker build -t imagename:tag

# '.' 빼먹지 않도록 주의. 현재 디렉토리에 있는 file 들을 기준으로 dockerfile을 가지고 Container 를 Build 하겠다는 의미이다.

 

[Dockerfile 문법]

            

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

- Top-Down 방식이므로 운영 환경을 From으로 가장 먼저 정의해주어야 함.

- COPY와 ADD의 차이점은, ADD의 경우 tar라는 Archive 파일을 풀어서 복사해줄 수 있다. 혹은 ftp 등의 url을 다운로드 받아 복사해줄 수 있다.

- RUN의 경우, Base Image에서 제공하는 명령을 Container에서 빌드할 때 실행. (ex. pip)

- MAINTAINER와 LABEL은 실제로 Container에 영향을 주는 것은 아니지만, 빌드한 사람의 이름, 라벨 등을 기록

- ENV는 컨테이너 안에서 환경 변수를 만들 때 사용. 

- Container가 빌드되면 Default로 root 권한으로 내려지나, USER를 지정하여 주면 USER로 Switch해준다. Container를 root로 시작하는 것은 보안 상으로 바람직하지 않다.

- VOLUME은 컨테이너가 빌드될 때 Volume Mount를 지원. 보통 Application의 Data가 저장되는 공간을 Volume으로 지정. Data가 영구적으로 보존될 수 있도록 지원.

- CMD와 ENTRYPOINT는 Container가 동작될 때 자동으로 실행시켜줄 명령어. 차이점으로 CMD의 경우, 예를 들어 CMD ["node", "/hello.js"]의 명령어 부분을 바꿔서 사용할 수 있다. ENTRYPOINT는 이를 차단하는 것(보호)

 

$ docker build -t hello.js:latest 

 

 

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

위에서 빌드된 Container를 배포하려면 Public 혹은 자체 Private Hub에 올려야 한다.

아무나 Hub에 올릴 순 없기 때문에 먼저 인증을 받아야 한다.

$ docker login

user와 password를 넣어 인증을 받은 후,

$ docker push hello.js:latest

내 Docker Host에서 만들어놓은 Container 그대로 Hub에 저장되게 된다.

 

※ hub.docker.com 에 있는 dockerfile들을 많이 모방하고 해석하며 공부하자.

 

 

 


※ 이성미, [따배도] 도커 시리즈 ,TTABAE-LEARN, https://www.youtube.com/watch?v=9qnD8aODu-4&list=PLApuRlvrZKogb78kKq1wRvrjg1VMwYrvi&index=11, 2021-08-31

'Docker > 이론' 카테고리의 다른 글

[Docker] 7.Container 리소스 관리  (0) 2021.09.07
[Docker] 5.Container 운영  (0) 2021.08.24
[Docker] 4.Container Registry  (0) 2021.08.12
[Docker] 2.Container(2)  (0) 2021.07.30
[Docker] 1.Container  (0) 2021.07.29