지난 글에 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하는 방법, 두 가지에 대해서 명확하게 알고
자기가 잘 사용할 수 있는 방법에 대해 유연하게 대처하는 것이
도커를 다루는 능력의 핵심이다.
'인프라' 카테고리의 다른 글
ECS(1) - ECS 클러스터를 사용해보자 (0) | 2023.08.13 |
---|---|
Docker(7) - 도커를 활용하는 클라우드 서비스 + ECS란? (0) | 2023.08.10 |
Docker(5) - 도커 이미지 업로드 (0) | 2023.08.08 |
Docker(4) - 한번에 Container 여러개를 다뤄보자, 'Docker-compose' (0) | 2023.08.08 |
Docker(3) - 도커를 실행해보자 (0) | 2023.08.05 |