[Docker] 도커 이미지
10 Feb 2023해당 포스트는 inflearn에서 subicura님의 초보를 위한 도커 안내서의 강의를 듣고 정리한 문서입니다.
도커 이미지
이번 포스트에는 도커의 컨테이너를 실행하는데 필요한 이미지에 대해서 알아보고, 만들어보고자 한다.
이미지란?
이미지는 컨테이너가 실행되는데 필요한 파일들(서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행파일 등등..)을 묶은 형태를 말한다.
프로세스를 실행하기 위한 모든 파일과 설정값(환경)을 지님으로써, 더이상 서버구동에 의존되는 파일을 설치할 필요가 없다.
프로세스는 이미지의 환경(파일)을 변경할 수 있으며, 이 변경된 환경을 저장해서 새로운 이미지를 생성할 수있다.
특징
- 도커 이미지의 용량은 보통 수백 MB ~ 수 G 이다. 하지만 가상머신보다 용량이 작다.
- 이미지의 상태 값은 변하지 않는 (immutable) 값이다.
- 하나의 이미지는 여러 컨테이너를 생성할 수 있고, 컨테이너가 삭제되더라도 이미지는 변하지않고 남아있다.
- 다양한 API가 제공되어 마음껏 자동화가 가능하다.
- 도커에서는 DockerFile이라는 파일을 이용해 이미지를 만든다. DockerFile에는 소스와 함께 의존성 패키지를 사용했던 설정 파일을 버전 관리하기 쉽도록 명시되어 진다.
레이어드 파일 시스템 (layered file system)
처음에는 이미지의 환경(파일)을 변경할 수 있다고 했지만, 특징에서는 이미지의 상태 값은 또 immutable로 변하지 않는다고 하였다. 앞뒤가 안맞다?
아니다. 이것은 도커의 특징으로, 내부 상태를 변경하는 것이 아니라, 새로운 환경을 추가해 이미지를 만드는것을 말한다.
도커의 이미지는 읽기 전용 영역(Read only layer)과 쓰기 가능 영역(Readable/Writable layer)으로 나누어 진다.
예를들어, 처음 ubuntu의 이미지를 실행시킨다고 하자.
docker run ubuntu
그렇다면 ubuntu의 내부 설정은 변경할 수 없지만, ubuntu에 MySql을 추가하거나, Git을 추가하는 방식으로 새롭게 이미지를 커스텀 할 수 있다.
만약에 사용자가 Container Layer 단계에서 종료할 경우 추가한 새로운 리소스는 삭제가 된다.
만약 작업하던 내용을 이미지로 덧씌어 새로운 이미지로 만들기 위해서는 docker commit
을 이용해 새로운 커스텀 이미지를 생성 할 수 있다.
실습
한번 이미지를 새로 만들어보는 실습을 진행해보자.
ubuntu에 git을 설치한뒤 새로운 이미지를 생성해 보려한다.
아래의 명령어를 실행하면 git
이라는 컨테이너 이름을 명명해 ubuntu의 최신버전의 이미지를 실행시킨뒤 ubuntu의 bash를 실행시켜 준다.
docker run -it --name git ubuntu:latest bash
아직 git을 설치하기 이전이므로, git의 명령어를 입력해도 ubuntu에서는 git을 찾지 못한다.
root@3b268f967dc3:/# git
bash: git: command not found
ubuntu의 패키지를 업데이트 해준뒤에 git을 설치해 주자.
설치시 조금 시간이 걸리니 여유를가지고 기다려 주도록 하자.
root@2f8bfff679f9:/# apt-get update
root@2f8bfff679f9:/# apt-get install -y git
설치가 완료되면 깃버전을 확인해보자.
정상적으로 git이 설치된걸 확인 할 수있다.
root@3b268f967dc3:/# git --version
git version 2.34.1
commit
이후 실습을 진행하기에 앞써 commit
에 대해 간단하게 설명해보고자 한다.
$ docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
commit
은 컨테이너의 파일 변경 사항이나 설정을 새 이미지로 커밋할 수 있다. 커밋되는 컨테이너와 해당 프로세스는 이미지가 커밋되는 동안 일시 중지가 된다.
하지만 commit
은 컨테이너 내부에 마운트된 볼륨에 포함된 데이터는 포함되지 않는다.
일반적으로 Dokerfile
을 사용하여 문서화 하고 유지관리한다. Dokerfile
에 대한 내용은 뒤에 후술할 예정이다.
[OPTIONS]
옵션 | description |
---|---|
–author,-a | 저자 설정 |
–change,-c | 생성된 이미지에 Dockerfile 명령어를 적용한다. |
–message,-m | 커밋 메시지 |
-pause,-p | 커밋 중 컨테이너를 일시 중지한다. (기본값 : true) |
commit 실습
이제 commit
을 이용해 ubuntu에 git이 설치되어있는 새로운 이미지를 생성해 보도록 하자.
먼저 설치되어있는 이미지를 확인해보자. docker images
를 입력하면 확인 할 수 있다.
방금 설치한 ubuntu:latest의 이미지가 있는걸 확인할 수 있다.
PS C:\WINDOWS\system32> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 6b7dfa7e8fdb 2 months ago 77.8MB
아까 만든 git이라는 이름의 컨테이너를 commit 해보자.
다시 이미지들을 확인해면 TAG가 git으로된 ubuntu 이미지가 추가된걸 볼 수 있다.
PS C:\WINDOWS\system32> docker commit git ubuntu:git
PS C:\WINDOWS\system32> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 6b7dfa7e8fdb 2 months ago 77.8MB
ubuntu git 5e9ad85dea09 2 seconds ago 194MB
이제 방금 만든 git이라는 ubuntu의 컨테이너를 실행해보자.
git2라는 이름으로 컨테이너를 실행시켜 줄것이다.
이후 git의 설치를 확인해보면 방금 컨테이너로 실행한 이미지에 git이 설치된것을 볼 수 있다.
docker run -it --name git2 ubuntu:git bash
root@9099659a01bc:/# git --version
git version 2.34.1
이렇게 docker는 새로운 상태를 이미지를 저장하는 방식을 사용한다.
Docker 명명 규칙
도커의 이미지에는 명명규칙이 있다.
그래서 이미지지의 목록들을 살펴본다면, /
가 없는 이미지들은 docker에서 제공하는 공식 이미지를 뜻하고, {namespace}/{imagename}
의 형식으로 되어있는 이미지는 {namespace}
해당하는 사람이 만든 이미지라는 것이 된다.
아래의 목록에서는 ubuntu, php와 같은것이 공식이미지, hashicorp/http-echo가 개인의 이미지로 볼 수 있다.
PS C:\WINDOWS\system32> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu git 5e9ad85dea09 23 minutes ago 194MB
php 7.4-cli 7bbbb12d1498 2 months ago 474MB
centos 8 5d0da3dc9764 17 months ago 231MB
hashicorp/http-echo latest a6838e9a6ff6 5 years ago 3.97MB
다음 포스트는 commit의 방법이 아닌 Dockerfile을 이용해 build하는 방법의 이미지 생성방법을 알아보자.