본문 바로가기
Cloud/Docker

도커 이미지

by 민휘 2023. 4. 22.

목차

1. 도커 이미지 생성

2. 도커 이미지의 구조

3. 도커 이미지 삭제

4. 도커 이미지 추출

5. 도커 이미지 배포

 

1. 도커 이미지 생성

도커 이미지는 도커 컨테이너를 만드는 데 사용되는 읽기 전용 템플릿이다.

도커로 개발하는 경우 컨테이너에 애플리케이션 개발 환경을 구축한 뒤 사용자 이미지를 직접 생성해야 한다.

도커 이미지를 생성하는 방법은 두 가지이다.

 

(1) 컨테이너 작업 내용을 이미지로 만들기

(2) 도커 파일로 이미지 만들기

 

컨테이너 안에서 작업한 내용을 이미지로 만드는 방법

  1. 기존 이미지로 컨테이너를 생성한다.
  2. 컨테이너에서 변경사항을 만들고 커밋한다.
docker run -it --name commit_test ubuntu:14.04
root@bfb471511b4e:/# echo test_first! >> first

docker commit \\
> -a "minpearl" -m "my first commit" \\
> commit_test \\
> commit_test:first
sha256:7dc06fa21eb130566123ba45716790085af8f5ae798bbcad5a5316451b8d866f

docker images
REPOSITORY              TAG       IMAGE ID       CREATED          SIZE
commit_test             first     7dc06fa21eb1   17 seconds ago   187MB

 

 

2. 도커 이미지 구조

도커 이미지는 차분 방식으로 만들어진다.

즉, 변경사항만 캡쳐해서 따로 보관한다.

아까 컨테이너로 만든 도커 이미지의 Layers를 확인해보면 커밋한 변경사항이 하나의 Layer로 만들어진 것을 볼 수 있다.

변경사항으로 이미지를 만들 때 기존 이미지의 레이어가 복사되는 것이 아니다.

변경사항만 새로운 레이어로 만들어 기존 이미지의 레이어와 함께 구성해 새로운 이미지를 만든다.

따라서 이미지의 전체 용량은 기존 이미지의 레이어 용량 + 변경사항 레이어 용량*이다.

 

 

inspect 명령어로 찍어본 기존 이미지와 파생 이미지.

파생 이미지는 기존 이미지의 레이어와 변경사항의 레이어를 가진다.

# 기존 이미지
"Layers": [
	"sha256:59199d90878e4fda42bcd8a43bfe3ecd964265b2008746c6b18ae3d6ca659033",
	"sha256:926ca971b512878d4e3b3fc8ab8db30203cfe83c9473b6a0255f9ccf6087e8f3",
	"sha256:000e628b3e715c1beb942816938590a5ba1a991c83d23b69603e309934be4e17"
]

# 파생 이미지
"Layers": [
	"sha256:59199d90878e4fda42bcd8a43bfe3ecd964265b2008746c6b18ae3d6ca659033",
	"sha256:926ca971b512878d4e3b3fc8ab8db30203cfe83c9473b6a0255f9ccf6087e8f3",
	"sha256:000e628b3e715c1beb942816938590a5ba1a991c83d23b69603e309934be4e17",
	"sha256:ef9f14f504abeecef8098358db942c2bc4d2ee4ecebb04ec7e77215551cd3971"
]

 

 

3. 도커 이미지 삭제

도커 이미지는 다음 조건을 만족할 때 삭제 가능하다.

  • 실행 중인 컨테이너가 없다
  • 하위 이미지가 없다

rmi 명령어로 이미지를 삭제할 수 있다.

이때 commit_test:first 이미지의 레이어와 이미지 이름이 삭제된다.

docker rmi commit_test:first

 

 

4. 도커 이미지 추출

도커 이미지를 별도로 저장하거나 옮기는 등

필요에 따라 이미지를 단일 바이너리 파일로 저장해야할 때가 있다.

save, load / export, import 명령어로 단일 바이너리 파일을 저장할 수 있다.

하지만 이렇게 추출된 이미지는 레이어 구조를 가지지 않으므로 이미지 용량을 각각 차지한다.

효율적인 방법은 아니다.

save, load 명령어로 컨테이너와 이미지의 메타 데이터를 포함해 이미지를 추출하고 로드할 수 있다.

docker save -o ubuntu_14_04.tar ubuntu:14.04
docker load -i ubuntu_14_04.tar

export, import 명령어는 컨테이너의 파일시스템만을 추출하며 컨테이너 및 이미지 설정 정보는 저장하지 않는다.

docker export -o ubuntu_14_04.tar ubuntu:14.04
docker import -i ubuntu_14_04.tar

 

 

5. 도커 이미지 배포

이미지를 생성해 다른 도커 엔진에 배포할 방법을 알아본다.

단일 이미지 파일을 추출하는 방식은 비효율적이다.

도커 허브 이미지 저장소를 사용하거나 도커 사설 레지스트리를 사용하는 방법이 있다.

 

도커 허브 - 개인 계정

개인 계정으로 로그인하고 저장소를 생성했다.

저장소에 이미지를 올릴 때는 이미지의 이름을 사용자계정/레포지토리이름:태그로 지정해야 한다.

저장소에 이미지를 올리면 해당 이미지의 레이어만을 전송한다.

ubuntu 기본 이미지에 변경사항을 만들어 새로운 이미지를 만들었다면

ubuntu 이미지는 이미 도커 허브에 있으므로 변경사항 레이어만 전송하는 것이다.

 

도커 허브 - 조직 계정

깃허브랑 똑같다.

조직과 팀 단위로 이미지 저장소를 사용할 때 권한 설정이나 조직 구성을 할 수 있다.

실습을 해보려고 했는데 어라 Organization 유료 플랜이다 - !

아쉽게도 책에 소개된 명령어만 정리해봐야지.

 

일단 도커허브에서 조직(minorg)을 생성하고, 조직에 소속되는 팀을 생성한다.

팀은 권한을 가지는 계정 그룹으로, 읽기 쓰기 권한을 지정할 수 있다.

조직에 레포지토리(my-image-name)를 생성한다.

 

이미지 이름 양식은 개인 계정과 동일하게 조직이름/레포지토리이름:태그이다.

docker push minorg/my-image-name:0.0

 

저장소 WebHook

저장소에 이미지가 push 됐을 때 특정 url로 http 요청을 전송하도록 설정할 수 있다.

저장소에 추가된 새로운 이미지를 각 서버에 배포하는 애플리케이션을 작성할 때 유용하게 활용할 수 있다.

 

사설 레지스트리

지금 당장 필요한 기능은 아니라고 생각해서 실습은 진행하지 않았다.

하지만 간단하게 요약해보겠습니다.

  • 도커 허브가 제공하는 registry 이미지로 컨테이너를 실행한다
  • 5000번 포트를 사용하며, Restful API를 사용한다.
  • 이미지 푸시 : docker push 호스트IP:5000/이미지:태그
  • 이미지 풀 : docker push 호스트IP:5000/이미지:태그
  • 도커 데몬은 https를 사용하지 않는 레지스트리 컨테이너에 접근하지 못하도록 설정한다.
  • 레지스트리 접근 권한을 인증하기 위해 레지스트리 컨테이너 자체의 인증 정보를 설정하거나 Nginx 서버 컨테이너로 인증 기능을 레지스트리 컨테이너에 연동할 수 있다.

'Cloud > Docker' 카테고리의 다른 글

도커 데몬  (0) 2023.04.22
Dockerfile  (1) 2023.04.22
컨테이너 로깅, 컨테이너 자원 할당 제한  (0) 2023.04.22
도커 네트워크  (0) 2023.04.22
도커 볼륨  (0) 2023.04.22