지난 글에 build를 통해 도커파일(금형 설계서)를 가지고 이미지(금형)를 만들어서 레지스트리에 공유하는 작업까지 같이 해 보았다.

 

그런데, 이미지 생성 방식에는 dockerfile만을가지고 build하는 방법 외에도, 기존 사용하고 있는 컨테이너를 이미지로 만드는 방법또한 존재한다.

바로 commit라는 기능이다.

 

도커파일로 빌드하면 되는데 커밋 왜 씀?이라는 물음에 대답하자면,

물론 build와 commit의 공통점은

'나만의 커스텀 이미지를 만들 수 있다'는 것이지만,

도커파일로 build하는것이 아무것도 없는 백지상태에서 이미지를 새로 창조하는 것이라면,

commit은 기존에 쓰고 있는 컨테이너를 보통 '백업 용도'로 이미지를 생성하는 것이 차이점이다.

 

조금 더 자세한 예를 들어보자.

우리가 ubuntu라는 이미지를 pull하고, run해서 container를 만들었다고 치자.

팀 모두는 git을 이용해 형상관리를 해야 하고,

A팀은 python3를,

B팀은 php를,

C팀은 Nodejs를 이용해서 개발을 한다.

그럼 결국 3개의 컨테이너는 다음과 같은 구상을 띄어야 한다.

  • A container : ubuntu + git + python3
  • B container : ubuntu + git + php
  • C container : ubuntu + git + nodeJs

이 때 이용하는것이 commit이다.

ubuntu가 설치되어 있는 컨테이너에 git을 설치하고, commit을 해서 ubuntu+git이 설치되어 있는 컨테이너를 만들고,

그 컨테이너에서 이미지를 추출해서 A/B/C팀에 전달하고 각 팀은 자신이 필요한 개발 툴만 새로 설치해서 개발을 진행하면 된다.

도식도로 확인하면 다음과 같은 시나리오가 완성된다.

물론, dockerfile로도 가능은 하다.

 

그럼 위의 케이스 대로 한번 실행을 해보자.

먼저, ubuntu를 설치한다.

$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
Digest: sha256:0bced47fffa3361afa981854fcabcd4577cd43cebbb808cea2b1f33a3dd7f508
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

이제는 컨테이너를 띄워보자. 컨테이너 안에 들어가서 작업할 것이기 때문에 -it 명령어를 준다.

$ winpty docker run -it --name my-ubuntu ubuntu bash
root@304d6eb32b3f:/#

winpty 명령어는 내가 윈도우의 bash를 설치할 때 기본 쉘로 설정하지 않아서 tty 설정때문에 준 옵션이고,

컨테이너의 이름을 잘 알아보기 위해 my-ubuntu라는 이름을 주었다.

그리고 ubuntu 이미지를 기반으로 하는 컨테이너를 띄우고 bash shell을 띄우기 위해 위의 명령어들을 주었다.

root@304d6eb32b3f:/# apt update
root@304d6eb32b3f:/# apt install git

주의할 점은, 이렇게 설치한 git은 이 컨테이너에서만 깔려있지, 새로운 컨테이너에서는 깔려 있지 않다는 점이다.

이제 이 컨테이너에서 나와서, 이미지를 만들어보자.

$ docker commit my-ubuntu choincnp:ubuntu-git
sha256:117b6e2b4de30fcbdf08983bd98d4bfde6a410fd63f54bf25c3e137bbd6006f3

$ docker images
REPOSITORY               TAG          IMAGE ID       CREATED         SIZE
choincnp                 ubuntu-git   117b6e2b4de3   5 seconds ago   196MB

docker commit [IMAGE NAME] [REPOSITORY] : [TAG]

의 syntax로 작성하면 된다. 

https://choincnp.tistory.com/72

에서 기술했던 도커 허브에 이미지를 업로드할때와 똑같은 구조이다.

 

이제 이 이미지를 기반으로 다시 컨테이너를 만들고,

$ docker run -it --name nodejs choincnp:ubuntu-git bash

# apt update
# apt install nodejs

이렇게, C팀의 컨테이너를 만들 수 있다. 이런식으로 A팀과 B팀의 컨테이너도 만들어서 돌릴 수 있다.

물론, 이를 도커파일로도 만들어 제공할 수 있다.

dockerfile

FROM ubuntu:latest
RUN apt update && apt install -y git

도커파일에서 RUN을 돌릴때마다 레이어가 하나씩 추가되므로 가급적이면 한 번에 쓸 명령어는 한 줄에 위치시키는 것이 좋다. 설치할 때 INSTALL을 돌리면 아까 봤듯 설치할거냐고 묻는 ‘Y/N’ 이 뜨는데, 이게 뜨면 도커는 설치를 하지 않는다. 그래서 Y를 선택하게 하는 -Y 옵션도 준다. 

도커파일의 다른 옵션들은 이전 글에 설명하였으므로 따로 기술하지 않겠다.


도커파일은 이런 일련의 명령어들을 한 번에 스크립트로 작성해서 보여주므로,

이 이미지가 어떻게 생성되었는지에 대해 굉장히 명료하다.

 

그래서 도커파일로 build하는 방법과 commit하는 방법, 두 가지에 대해서 명확하게 알고

자기가 잘 사용할 수 있는 방법에 대해 유연하게 대처하는 것이

도커를 다루는 능력의 핵심이다.

+ Recent posts