임대일

3.1 도커(Docker) 이미지와 레지스트리: 이미지 레지스트리 본문

도커/개발자를 위한 쉬운 도커

3.1 도커(Docker) 이미지와 레지스트리: 이미지 레지스트리

limdae94 2024. 6. 19. 13:02
 

개발자를 위한 쉬운 도커 강의 | 데브위키 - 인프런

데브위키 | 현업 개발자가 도커를 사용한 경험을 녹여낸 새로운 커리큘럼으로 기존 교재 및 강의와 차별된 강의를 제공합니다. 단순한 명령어 사용법이 아닌 도커를 왜 사용해야하는지 대한 근

www.inflearn.com

 

학습 목표

이미지 레지스트리는 도커 이미지를 저장하기 위한 저장소이다. 이 이미지 레지스트리를 통해서 개인이나 팀이 이미지를 다른 사람과 공유하거나 필요한 이미지를 다운받을 수 있다. 이전 실습에서 Nginx 컨테이너를 실행했을 때를 떠올려 보면 바로 이 이미지 레지스트리에서 Nginx 이미지를 다운받은 것을 알 수 있다. 이번 파트에서는 대표적으로 사용되는 레지스트리인 도커 허브에 직접 가입을 할 것이다. 새롭게 만든 도커 허브의 계정으로 이미지를 업로드하고 다운로드하자. 그리고 이미지의 네이밍 규칙에 대해서도 다룰 것이다.

 

이미지 레지스트리

1. 이미지 레지스트리란

깃허브와 도커 허브

 

이번 시간에는 이미지 레지스트리와 이미지의 네이밍 규칙에 대해서 학습한다. 이미지 레지스트리는 이미지를 저장하는 저장소이다. 개발을 하지 않았더라도 GitHub는 아마 한 번쯤 들어봤을 것이다. GitHub는 소스 코드를 저장하는 저장소이다. 개발자는 GitHub를 사용해서 자신의 소스 코드를 쉽게 보관하고 다른 개발자들과 공유할 수 있다. Image Registry도 GitHub와 아주 비슷하다. 가장 많이 사용되는 Public Image Registry는 Docker Hub이다. GitHub가 소스 코드를 저장하는 저장소이면, Docker Hub 는 이미지를 공유하는 저장소이다.

 

dockerHub

 

GitHub 에는 소스 코드만 보관하고, Docker Hub에는 이 소스 코드를 사용해서 만들어진 애플리케이션과 그 애플리케이션을 실행할 수 있는 환경이 모두 포함되어 있는 이미지를 저장하는 것이다. 이미지 레지스트리는 많은 종류의 제품들이 있지만 이 제품들이 공통적으로 제공하는 기능들을 정리한다.

 

이미지 레지스트리는 기본적으로 이미지를 다운로드하고 업로드하는 기능을 제공한다. 그리고 이미지 레지스트리에 있는 이미지들을 검색하고 필요한 이미지를 찾아볼 수 있다. 이미지 레지스트리는 이미지의 버전을 관리하기 때문에 사용자는 이미지를 다운로드할 때 특정 버전의 이미지를 지정해서 다운받을 수 있다. 그리고 원하는 사용자만 이미지를 다운받을 수 있도록 인증 처리와 권한 관리 기능도 제공한다. 그리고 안전한 이미지를 다운로드 받을 수 있도록 업로드된 이미지의 보안을 검증하는 기능도 있다. 마지막으로 DevOps 파이프라인 기능과 연계해서 이미지를 업로드했을 때 자동으로 배포가 이루어질 수 있도록 연계 기능이나 알림 기능도 제공한다.

 

2. 이미지가 저장되는 공간

이미지 레지스트리 공간

 

이미지가 저장되는 공간은 크게 세 가지로 분류할 수 있다. 먼저 도커가 설치되어 있는 호스트 머신의 로컬 스토리지이다. 그리고 온라인 저장소는 크게 두 가지 종류로 나눌 수 있는데, 주로 기업에서 많이 사용하는 프라이빗 레지스트리와 도커 허브 같은 퍼블릭 레지스트리가 있다. 컨테이너를 실행할 때 이미지의 이름을 입력했는데, docker run 명령에서 이미지의 이름을 지정하면 먼저 로컬 스토리지에서 해당하는 이미지가 있는지 검색한다. 로컬 스토리지는 도커를 행하는 호스트 OS의 특정 폴더를 의미한다.

 

레지스트리의 이미지 다운로드
컨테이너 실행

 

실습 환경에서는 실습하는 PC의 특정 폴더를 의미한다. 그래서 이 로컬 스토리지에 이미지가 있으면 바로 실행된다. 스토리지에 이미지가 없으면 호스트 외부의 온라인 레지스트리에서 이미지를 로컬 스토리지로 다운받는다. 그리고 다운받은 로컬 스토리지의 이미지를 사용해서 컨테이너를 실행한다. 그리고 이제 다음부터는 Nginx 컨테이너를 실행할 때마다 로컬 스토리지에 이미 다운로드 받아놓은 이미지가 있기 때문에 온라인 레지스트리를 검색하지 않고, 바로 컨테이너로 실행된다.

 

docker run nginx

 

온라인 레지스트리는 프라이빗 레지스트리와 퍼블릭 레지스트리 로 나눌 수 있다. 특정한 네트워크에만 접근이 가능하면 프라이빗 레지스트리이고, 모든 네트워크에서 접근이 가능하면 퍼블릭 레지스트리이다. 도커 허브는 온라인에서 가입만 하면 모두가 사용할 수 있기 때문에 퍼블릭 레지스트리이다. 사내망처럼 내부망에서만 사용할 수 있는 레지스트리는 프라이빗 레지스트리라고 부른다. 도커 허브 같은 경우는 모두가 접근할 수 있는 레지스트리이기 때문에 이런 공간에 이미지를 저장하는 것은 보안상 문제가 될 수도 있다. 그래서 도커 허브 같은 서비스를 사용하지 않고 여러분만의 레지스트리를 사용하는 방법도 있다.

 

3. 레지스트리 사용 방법

레지스트리 사용

 

대표적으로 두 가지 방법이 있다. 첫 번째는 직접 여러분의 서버에 레지스트리를 설치해서 사용하는 방법이 있다. 두 번째는 퍼블릭 클라우드의 서비스를 사용하는 방법이다. 서버에 설치하는 레지스트리 소프트웨어는 하버나 도커 프라이빗 레지스트리 같은 제품이 있다. 퍼블릭 클라우드의 서비스로는 AWS의 ECR, Azure의 ACR 같은 서비스를 사용할 수 있다. 설치형 레지스트리는 사용자가 직접 레지스트리를 서버에 설치해야 한다. 퍼블릭 클라우드의 레지스트리를 사용하면 시간당 사용 요금을 지불하고 레지스트리를 사용할 수 있다.

 

4. 이미지 네이밍 규칙

docker run -d -p 80:80 --name hellonginx nginx

 

다음으로 이미지의 네이밍 규칙에 대해서 얘기하겠다. 이전에 Nginx를 처음 실행했을 때를 떠올려보자. 화면에 보이는 명령어 docker run -d -p 80:80 --name hellonginx nginx로 컨테이너를 실행했다. 맨 끝에 nginx라는 이미지 이름으로 이미지를 지정했었다. 그런데 보통 이미지 이름에는 이미지를 어디서 다운받는지, 어떤 버전의 이미지를 다운받는지에 대한 정보가 모두 포함되어 있어야 한다. 그런데 실습할 때 nginx라는 이미지 이름만 적었는데도 이미지를 다운로드할 수 있다. nginx라는 이름만 가지고 이미지를 다운받을 수 있었던 이유는 이 이미지 이름에 규칙이 있고 디폴트로 지정되는 기본 값이 있기 때문이다. 이 이미지의 네이밍 규칙은 이미지를 만들고 공유하는 데 있어서 꼭 필요한 정보이기 때문에 꼼꼼하게 알아보도록 하자.

 

5. 이미지명 기본값

레지스트리주소/프로젝트명/이미지명:이미지태그

 

이미지 이름은 크게 레지스트리 주소, 프로젝트 명, 이미지 명, 이미지 태그로 구성된다. 레지스트리 주소는 어떤 레지스트리를 사용할지 지정한다. 아까 말씀드렸던 것처럼 도커 허브 말고도 레지스트리가 여러 개 있을 수 있기 때문에 이미지를 어느 레지스트리에서 다운로드하고 업로드할지를 지정해야 한다. 이 레지스트리 주소가 비어 있는 경우에는 기본 값으로 지정된 레지스트리 주소가 사용된다. 도커를 사용하면 기본 레지스트리 값은 도커 허브의 주소인 docker.io 이다. 만약에 개인 레지스트리 주소가 deviki.com 이고 이 레지스트리에서 이미지를 다운받고 싶으면 맨 앞에 deviki.com 이라는 레지스트리의 주소를 입력해야 한다. 정리하면 이미지를 어디서 다운받을지 지정하기 위해서 레지스트리의 주소를 맨 앞에 적어줘야 하고 아무것도 적지 않으면 도커 허브의 레지스트리 주소인 docker.io 가 기본값으로 사용된다.

 

프로젝트명은 이미지를 보관하는 폴더 같은 개념이다. 레지스트리마다 이 프로젝트를 정의하는 방식이 조금 다를 수 있다. 도커 허브 같은 경우는 가입한 사용자의 계정명이 프로젝트명이 된다. 그리고 이미지명은 다운로드 받을 이미지의 이름을 의미한다. 이미지 태그는 이미지의 버전이다. 이미지 버전에는 숫자와 영문을 모두 사용할 수 있다. 그럼 이제 실제 이미지의 이름을 보면서 분석해 보자.

 

6. 이미지명 분석

devwiki.com/myProject/myNginx:2.1.0-alpine

 

화면의 이미지명을 읽어보면, devwiki.com 이라는 레지스트리에 myproject 라는 프로젝트에 mynginx 라는 이미지로 2.1.0- alpine인 버전을 다운로드 받게 된다. 그리고 이전 실습에서 사용했던 이미지 명들도 다시 확인해 보자.

 

docker.io/devwikirepo/tencounter:latest

 

화면의 이미지명을 보면, 먼저 레지스트리 주소가 비어 있기 때문에 도커 허브에서 이미지를 다운받게 된다. 프로젝트명은 계정명이기 때문에 저희 실습용 계정인 devwikirepo 의 계정에서 이미지를 다운받게 된다. 이미지명은 tencounter 이미지를 다운받는다. 여기서 이미지 태그를 빈값으로 입력하면 최신 버전을 의미하는 latest 가 기본값으로 사용된다. 그래서 생략된 이미지까지 포함하면 docker.io/devwikirepo/tencounter:latest 가 되는 것이다. 그럼 다음으로 Nginx 이미지를 확인해 보자.

 

docker offical image

 

Nginx 이미지를 다운받을 때는 프로젝트 명까지 생략했다. 도커는 도커사가 직접 검증한 이미지는 오피셜 이미지로 제공하고 있다. 그리고 이 오피셜 이미지는 라이브러리라는 프로젝트에서 관리한다. 그래서 별도로 계정명을 입력하지 않으면 라이브러리가 기본 값으로 적용된다. 그래서 프로젝트명을 비워놓으면 공식 nginx 이미지를 다운받게 되는 것이다.

 

정리하자면 지금까지 컨테이너를 실행할 때 사용했던 nginx 라는 이미지명은 docker.io/library/nginx:latest 에 축약된 이미지명이다. 실무에서는 보통 이미지를 업로드하고 다운로드할 때 사내용 레지스트리가 있는 경우가 많이 있다. 그리고 버전 관리를 하는 경우가 대부분이기 때문에 이미지의 네이밍 규칙을 잘 알고 넘어가시는 것이 좋다. 이번 시간에는 이미지 레지스트리의 기본 개념에 대해서 알아아봤다. 이미지가 어떻게 다운로드 받아지는지 순서를 확인했다. 그리고 이미지의 네이밍 규칙에 대해서 정리했다. 다음 시간에는 실제로 도커 허브에 가입해 보고 이미지를 다운로드 받은 다음에 실습 계정의 이미지를 직접 업로드해 보자.