반응형

(Docker)도커 - 도커 build, commit 명령어로 이미지 생성하기

 

도커 이미지를 생성하는 명령어는 2가지가 있습니다.

  1.  docker build 명령어
  2.  docker commit 명령어

1번은 도커 이미지 설정 파일인 Dockerfile을 만들어 설정 내용대로 이미지를 생성하는 명령어입니다.

2번은 도커 컨테이너를 원하는 데로 수정한 이후 컨테이너를 이미지로 생성하는 명령어입니다.

 

도커 컨테이너와 이미지가 없는 깨끗한 상태에서 작업을 시작하겠습니다.

비어있는 이미지, 컨테이너

 

 

docker build로 이미지 생성하기

node로 돌아가는 웹서버 이미지를 만들어 보겠습니다.

먼저 폴더를 하나 생성 후 생성한 폴더로 이동합니다.

$ mkdir nodejs
$ cd nodejs

폴더 생성, 이동

 

다음은 build 할 이미지가 컨테이너로 실행될 때 CMD로 자동 실행될 node.js 파일을 생성합니다.

서버를 여는 node.js 파일생성

 

다음은 도커 build에서 사용할 Dockerfile을 생성합니다.

$ vi Dockerfile

# 베이스 이미지
FROM node

# 라벨(관리자)
LABEL maintainer="reddb <reddb.tistory.com>"

# 생성되는 이미지로 파일 카피(호스트의 현재폴더/node.js 파일을 -> 이미지의 /루트로 카피)
COPY node.js /

# 이미지를 이용하여 컨테이너가 생성될 때 실행되는 명령어
CMD ["node", "/node.js"]

Dockerfile 생성

 

이제 도커 build 명령어를 실행합니다. -t 옵션은 태그 명령이고 태그 뒤에는 이미지명:버전명을 입력해야 합니다. 마지막 인자로 Dockerfile이 있는 '.' 현재 폴더를 반드시 넣어주어야 합니다.

$ docker build -t nodejs:ver_1 .

docker build

 

도커 이미지 목록을 확인하면, 내가 만든 nodejs:ver_1 이미지와 그걸 만들 때 사용한 베이스 node 이미지가 존재하는 게 확인됩니다.

$ docker iamges

docker images

 

내가 만든 nodejs:ver_1을 run 합니다. 실행 시 반드시 버전을 함께 입력해야 합니다. 버전을 입력하지 않으면 기본값인 latest가 자동 입력되어 이미지를 찾을 수 없다는 에러가 발생할 수 있습니다.

$ docker run --name nodejs_ver1 -d -p 80:80 nodejs:ver_1

docker run

 

이제 호스트(내 서버, 내 PC)에서 브라우저로 localhost:80으로 접속하면 node.js 파일에서 접속 시 응답 값으로 주도록 코딩해놓은 Hello nodejs가 보입니다.

localhost:80

 

 

docker commit로 이미지 생성하기

도커 컨테이너의 수정된 내용은 컨테이너가 증발(삭제)되버리면 모든 내용이 사라집니다. 
컨테이너에서 수정한 내용이 이미지에 영향을 끼치지 않기 때문입니다. 
하여, 수정사항이 있을때마다 수정된 컨테이너로 새로운 이미지를 생성해 두어야 
컨테이너가 삭제 됐을때 이미지를 통해서 컨테이너를 복구 할 수 있습니다.

먼저 nodejs_ver1 컨테이너에 bash로 접속하여 /node.js 파일 안에 "Hello nodejs" 문구를 "commit ver2"로 수정하겠습니다.

 

top 명령어로 nodejs_ver1 컨테이너를 살펴보면 root로 node 프로세스 하나만 실행되고 있는 걸 알 수 있습니다.

$ docker top nodejs_ver1

docker top

 

exec 명령어로 bash를 실행시키고 컨테이너 쉘로 접속합니다.

루트 폴더에서 ls 명령어로 node.js 파일이 있는 것을 확인합니다.

$ docker exec -it nodejs_ver1 /bin/bash
# ls

exec -it로 쉘접속

 

처음 쉘에 접속하면 노드 말고는 설치되어 있는 패키지가 없기 때문에 업데이트 후 vim 패키지를 설치해줍니다.

# apt-get update
# apt-get install vim

vim 설치

 

이제 vim으로 node.js 파일을 수정합니다. 

파일 안에 내용을 'hello nodejs'에서 'commit ver2'로 수정하였습니다.

웹서버 포트도 80에서 8080으로 수정하고 exit를 입력하여 호스트로 돌아옵니다.

node.js 파일 수정

 

현재 nodejs_ver1 컨테이너는 run 이후에 실행한 update, vim설치, node.js 파일 수정이 모두 적용된 상태입니다. 하지만 nodejs:ver1 이미지에는 영향을 끼치지 않기 때문에 만약 컨테이너를 종료(삭제)하면 여태까지 했던 모든 작업이 사라지게 됩니다.

 

그래서 nodejs_ver1 컨테이너의 수정 내용이 반영된 이미지를 생성해야 합니다.

이때 사용하는 명령어가 docker commit입니다.

 

먼저 현재 도커 컨테이너 목록과, 이미지 목록을 확인합니다.

컨테이너, 이미지 목록

 

다음은 commit 명령어로 컨테이너를 이미지로 생성합니다. 그리고 이미지 목록을 확인합니다.

($ docker commit 컨테이너명 만들이미지명:버전)

$ docker commit nodejs_ver1 nodejs:ver2
$ docker images

수정된 컨테이너를 nodejs:ver2 이미지로 생성

 

이제 만든 nodejs:ver_2 이미지로 nodejs_ver2 컨테이너를 실행하여 줍니다. 포트는 8080을 포워딩해 줍니다.

$ docker run --name nodejs_ver2 -d -p 8080:8080 nodejs:ver_2
$ docker ps -a

도커 컨테이너 실행

 

이제 브라우저로 locahost:80과 localhost:8080으로 접속해 봅니다.

그럼 변경된 내용이 잘 작동하는 것을 확인할 수 있습니다.

nodejs ver1, ver2 실행중

(Docker)도커 전체보기

 

'(Docker)도커' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

반응형