본문 바로가기
Framework and Tool/Kubernetes

Kubernetes - Docker basic

by ocwokocw 2022. 10. 6.

- 출처: Kubernetes in action

- Docker를 사용한 컨테이너 이미지 생성

간단한 Node.js 앱을 만들어서 컨테이너 이미지로 패키징해보자. 앱의 기능은 http 요청을 받아 해당 호스트머신의 이름을 응답하는 것이다.
 
 
 
위의 코드는 8080으로 http 서버를 시작하고 모든 요청에 대해 200을 상태코드와 함께 hostname 정보를 응답한다.
 
위의 앱을 이미지로 패키징하려면 우선 Dockerfile을 생성해야 한다. Dockerfile은 이미지를 생성하기 위해 수행해야할 사항들을 기술한 파일이라고볼 수 있다.
 
FROM node:7
ADD app.js /app.js
ENTRYPOINT ['node', 'app.js']
 
app.js와 동일한 path에 위의 내용으로 Dockerfile을 생성해준다. FROM 절에는 컨테이너 이미지를 기술한다. ADD 절에 기술한 내용은 로컬의 app.js를 이미지내의 루트 디렉토리에 추가한다는 의미이다. 마지막으로 ENTRYPOINT는 이미지를 실행할 때 수행되는 명령어를 의미한다.
 
"docker build -t kubia ." 명령어를 실행하면 이미지를 빌드할 수 있다. 이 명령어의 빌드를 수행하는 주체는 Docker client가 아닌 Docker demon이다. Docker client가 Dockerfile과 app.js를 Docker demon에 업로드 한다.
 
이미지는 하나의 큰 덩어리가 아니라 여러 계층으로 된 레이어 구조이다. 예를 들어 서로 다른 앱의 이미지를 여러 개 만들더라도 기본 이미지로 node:7을 사용하면 해당 기본이미지는 한번만 저장되어 공유된다. 예제 앱은 규모가 작아서 별로 중요하지 않지만 실제 개발할때 이를 잘 활용하면 이미지 저장과 전송을 효율적으로 할 수 있다.
 
빌드를 완료했다면 이미지가 생성 되었는지 확인한다. "docker images" 명령어로 확인해보자.
 
 

 

- 이미지 실행

"docker run --name kubia-container -p 8080:8080 -d kubia" 명령어를 통해 생성한 이미지를 실행한다.
 
 
 
위의 명령어의 의미는 컨테이너 이름을 kubia-container로 지정하고, local의 8080 포트를 컨테이너 내부의 8080포트와 맵핑시켜서 docker의 kubia 이미지에서 새로운 컨테이너를 실행하겠다는 의미이다.
 
그 후 컨테이너가 잘 실행됐는지 확인하기 위해 "docker ps" 명령어를 실행하면 kubia-container 이름의 컨테이너를 확인할 수 있다. 앱을 올바르게 작성했는지 기능 확인을 위해 "curl localhost:8080"을 입력하면 기대한대로 host 명을 응답한다.
 
컨테이너 내부를 확인해보고 싶을 수 있다. 보통은 셸을 포함한 기본이미지를 많이 사용하므고 셸을 실행해서 탐색한다.
 
 
 
"docker exec --help" 명령어를 통해 옵션을 살펴보자. 셸을 통해서 탐색해야 하므로 -i 옵션을 통해 STDIN을 유지해야 하고, -t 옵션을 통해 pseudo 터미널을 할당한다. 두 옵션을 줘야 일반적인 셸을 사용하는것과 똑같이 사용할 수 있다. "docker exec -it kubia-container /bin/bash"를 실행하면 셸이 실행될것이다.
 
컨테이너 셸에서 "ps aux"로 프로세스를 조회해보면 host OS의 프로세스는 볼 수 없는 반면 host OS에서는 컨테이너에서 실행중인 프로세스도 조회할 수 있다. (1번째 그림 - 컨테이너 셸에서 조회, 2번째 그림 host OS에서 조회)
 
 
 
 
 
프로세스만 격리되는 것이 아니라 파일 시스템도 격리된다.
 
 
 
root에서 "ls"를 수행해보면 작성한 앱에 해당하는 app.js와 기본 이미지의 시스템 파일만 조회된다.
 
이제 컨테이너를 중지시키고 삭제해보자. 컨테이너 중지는 docker stop 명령어를 사용하고 삭제는 docker rm 을 사용한다. 도커를 중지시키면 "docker ps" 명령어로 컨테이너 목록을 조회해도 나오지 않는데 중지된 컨테이너 목록까지 보려면 "docker ps -a"와 같이 옵션을 줘야한다.
 
 

- 이미지 Push

빌드한 이미지를 다른 컴퓨터에서도 실행하기 위해서는 저장소에 푸쉬를 해야 한다. 일반적으로 회사에서는 사설 저장소를 구축해서 사용하지만 학습용이므로 도커 허브를 이용한다.
 
도커 허브에 이미지를 푸쉬하기 위해서는 ID로 시작해야하는 규칙을 갖고 있다. 각자 "docker tag kubia [자신의 ID]/kubia" 로 tag 를 지정한다.
 
 
 
docker images의 결과를 유심히 살펴보면 알 수 있는데 "[ID]/kubia" 의 새로운 이미지를 생성한것이 아니라 tag 만 붙인것이다. IMAGE ID 필드를 참조해보면 hash 값이 같으므로 이를 알 수 있다.
 
이제 저장소에 푸쉬해보자. "docker push [ID]/kubia" 를 통해 docker hub에 푸쉬한다. 
 
 
 
도커 허브에서 이미지를 받아서 실행하는 테스트를 하기 위해 local의 이미지를 지워주고 실행해보자. "docker rmi [ID]/kubia" 명령어를 입력하면 이미지를 삭제한다. docker images로 확인해보면 이미지가 지워진것을 확실하게 알 수 있다.
 
 
 
이제 "docker run -p 8080:8080 -d [ID]/kubia" 명령어를 실행해서 컨테이너를 실행한다.
 
 
 
명령어 실행 후 로그를 살펴보면 로컬의 이미지가 없기 때문에 다운로드해서 실행한다는것을 알 수 있다. "docker ps"로 확인해보면 [ID]/kubia 이미지에서 작성했던 app.js를 실행했고 컨테이너 이름을 지정하는 옵션은 생략했기 때문에 임의로 네이밍이 된것을 확인할 수 있다.
 
 

'Framework and Tool > Kubernetes' 카테고리의 다른 글

Kubernetes - Label 및 Annotation  (0) 2022.10.09
Kubernetes - Pod  (0) 2022.10.09
Kubernetes - deploy app tutorial  (0) 2022.10.06
Kubernetes - cluster 생성  (0) 2022.10.06
Kubernetes - 개요  (0) 2022.10.02

댓글