Q1. 무엇을 컨테이너로 만드는가?
- 개발한 애플리케이션(실행파일)과 운영환경이 모두 들어있는 독립된 공간.
- 개발한 프로그램과 실행환경을 모두 컨테이너로 만들어, 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 |