컨테이너 실행 중에 업데이트된 내용은 컨테이너를 제거하면 사라진다. 특정 상태의 컨테이너를 보관하고 싶다면 도터 이미지로 만들어야 한다.
이미지를 도커 컨테이너 프로세스를 실행하기 위한 환경으로 정의할 수 있다. 이미지는 컨테이너를 실행하기 위한 파일들의 집합이고 내부는 계층화된 구조로 이루어져있다.
예를 하나 살펴보자. 리눅스 이미지를 하나 다운로드하고 활성화(컨테이너)한 후 Git을 설치한 상태를 이미지로 저장해보자(①리눅스 이미지 다운로드 → ②컨테이너에 Git 설치 → ③새로운 이미지 생성).
①리눅스 이미지(Base image) 다운로드
$> docker run -it ubuntu:latest --name git /bin/bash
②컨테이너에 Git 설치
도커 컨테이너의 쉘 환경에서 Git을 설치한다.
root@ubuntu> apt-get update
root@ubuntu> apt-get install -y git
root@ubuntu> git --version
③새로운 이미지 생성
컨테이너에서 빠져나온(exit 명령 또는 Ctrl+p, Ctrl+q) 후 호스트의 쉘 환경을 통해 컨테이너를 이미지로 만들 수 있다. 컨테이너가 기반 이미지(base image)에서 달라진 점을 docker diff 명령을 이용해 살펴볼 수 있다.
$> docker diff '컨테이너 이름'
docker commit 명령을 이용하면 컨테이너를 이미지로 만들 수 있다.
$> docker commit '컨테이너 이름 or 컨테이너 ID' '새로운 이미지 이름:태그'
예) $> docker commit abeswxc3d0 ubuntu:git
이미지를 컨테이너로 활성화시킨 후 컨테이너 내부에서 직접 작업하고 이미지로 저장할 수 있다. 하지만 일반적으로 그렇게 작업하지는 않는다(만약 컨테이너 내부에서 해야할 작업들이 사용자와의 상호 작용이 반드시 필요한 작업들이라면 그렇게 할 수도 있다). Dockerfile이라는 스크립트를 이용해서 이미지를 생성(build)하는 것이 훨씬 일반적이다.
Dockerfile은 이미지 생성 과정을 기술한 DSL(Domain Specifil Language)이다. 즉, 도커에서 이미지 생성을 위해 특별히 사용하는 스크립트라는 의미다. 문법은 그다지 어렵지 않다. 리눅스 위에 Git을 설치한 컨테이너를 이미지로 만드는 위에서 살펴본 과정을 Dockerfile을 이용해서 다시 기술하면 아래와 같다(Dockerfile은 vim 같은 에디터를 이용해서 작성하면 된다).
▶ Dockerfile
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y git
docker build 명령을 이용해서 Dockerfile의 내용을 이미지로 생성(build)할 수 있다.
$> docker build [-f Dockerfile] -t '이미지 이름:태그' .
예) docker build -t ubuntu:git .
보통 하나의 디렉토리에 하나의 도커 이미지 빌드 프로젝트만 두기 때문에 Dockerfile도 하나만 두는 것이 일반적이다. 따라서 docker build 명령어는 기본적으로 Dockerfile이라는 이름의 스크립트를 사용한다. 만약 이름을 달리 지정한 이미지 빌드 스크립트를 사용하려 한다면 -f 옵션을 사용하고 파일 이름을 지정해주면 된다.
docker build 명령어 가장 마지막의 마침표 .는 현재 디렉토리라는 뜻이다. 즉, 현재 위치에서 Dockerfile 그리고 도커 이미지 빌드에 필요한 파일들을 찾는다.
■
'풀스택 개발 들여다보기' 카테고리의 다른 글
[Docker] Dockerfile 명령어 살펴보기 (0) | 2022.03.16 |
---|---|
[Docker] 도커 이미지 빌드 - Dockerfile 기본 구조 (0) | 2022.03.15 |
[Docker] docker 커맨트를 sudo 없이 실행시키기 (0) | 2022.03.07 |
[Docker] docker-compose networks&volumes (0) | 2022.03.04 |
[Docker] docker-compose.yml 파일의 기본 구조 (0) | 2022.03.02 |
댓글