레지스트리 vs 리포지토리 vs 도커 허브 개념정리!!
레지스트리(Registry)
- 이미지를 배포하는 장소
- 공개일 수도, 비공개일 수도
- 주로 회사나 부서 혹은 개인 단위로 사용됨
리포지토리(Repository)
- registry를 구성하는 단위
- 주로 소프트웨어 단위로 사용됨
도커 허브
- 도커 제작사에서 운영하는 공식 도커 레지스트리
- 아파치, MySQL, 우분투 등의 공식 이미지가 있음
run
커맨드 사용하면 도커 허브에서 이미지를 내려받음
이미지 업로드하기
업로드하고자 하는 repository의 공개 여부에 상관 없이, 이미지를 업로드하려면 이미지에 태그를 부여해야 한다.
태그
- 로컬에서 사용하던 이름이 아닌, registry 주소, repository 이름과 버전 표기를 추가한 정식 명칭
레지스트리_주소(도커 허브는 ID)/리포지토리_이름:버전
- 버전은 생략 가능하지만 있는게 관리에 용이함
- e.g. 로컬 컴퓨터에서의 이름 :
nyapa00ex22
⇒ 태그 :zoozoo.coomm/nyapacchi:13
Step1. docker tag
이미지에 태그 부여하기
docker tag 원래_이미지_이름 레지스트리_주소/리포지토리_이름:버전
- 이미지에 태그를 부여해서 복제하게 된다.
- 따라서 ID는 동일하지만 서로 다른 (1. 기존 이미지 / 2. 태그가 부여된 이미지) 이미지가 2개 존재하게 됨
Step2. docker push
이미지 업로드하기
docker push 레지스트리_주소/리포지토리_이름:버전
- 어느 레지스트리의 어느 리포지토리에 업로드할지는 태그로 판단함
- 리포지토리는 처음 업로드할 경우 새로 생성됨
레지스트리 구축하기
1) 로컬 비공개 레지스트리
- 위와 같이 레지스트리용 컨테이너가 따로 있기 때문에 이를 사용하면 됨 (레지스트리도 도커를 통해 운영 가능)
- 이미지를 올리거나 내려받을 때 이 레지스트리를 지정하면 됨
- 레지스트리는 포트 5000번을 사용함
docker run -d -p 5000:5000 registry
🚨🚨로컬 레지스트리의 경우 레지스트리 컨테이너가 삭제되면 모든 데이터가 삭제되기 때문에 주의해야 한다!!
2) 도커 허브
The World’s Largest Container Registry | Docker
Docker Hub is a container registry built for developers and open source contributors to find, use, and share their container images and access verified content.
www.docker.com
- 이메일 주소로 도커 허브 가입한 후 리포지토리 생성 가능
- push 커맨드로 이미지를 업로드하며 리포지토리가 생성될 경우 자동으로 공개(public) 상태가 됨
- 도커 허브에서 비공개 설정을 통해 공개 여부 전환 가능
[직접해보기1] 로컬 비공개 레지스트리 구축 및 이미지 업로드하기
1️⃣ 도커 허브에서 registry 이미지 다운로드 및 컨테이너 실행하기
docker run --name local-repo -d -p 5000:5000 registry
- docker (container) run : 도커 이미지를 내려받고 컨테이너를 생성해 실행함 (docker image pull, docker container create, docker container start 3개의 명령어를 하나로 합친 것과 같음)
- -- name locl-repo : 컨테이너 이름. 원하는 대로 지어도 됨. (초반에 이해를 잘못해서 이름을 잘못 지었다.. local-repo보다는 local-regi 정도가 적당할 것 같다. 이 컨테이너는 repository가 아닌 registry이다!!)
- - d : 백그라운드 실행. detach.
- - p 5000:5000 : 포트 번호 지정. publish. 호스트의 5000번 포트와 컨테이너의 5000번 포트를 연결함. ( ※레지스트리는 포트 5000번을 사용함 )
- registry : registry 컨테이너의 이미지 이름
- docker ps (= docker container ls) : 컨테이너 목록 출력
- docker image ls : 이미지 목록 출력
registry 이미지를 가져와서 컨테이너를 생성하고 실행해준다. (docker run)
실행 후에 컨테이너와 이미지 목록을 확인해 보면 잘 실행되고 있음을 볼 수 있다.
2️⃣ 로컬 registry에 이미지 업로드하기
우선, dockerfile을 이용해서 업로드할 이미지를 하나 만들어줬다.
(만들 필요 없이 도커 허브에서 아무 이미지나 내려받아서 테스트해봐도 될 것이다!)
👇이미지 만드는 방법은 이전 포스팅을 참고하면 된다.
2023.10.22 - [♾️DevOps/Docker] - [Docker] 이미지 만들기
'img_test'라는 이름의 이미지를 만들었고, 이제 이 이미지에 tag를 부여해서 복제한 후, push 명령어를 통해 앞에서 만든 로컬 레지스트리에 업로드 해 줄 것이다.
docker tag img_test localhost:5000/img_test:1.0
- docker tag : 이미지에 태그를 부여하는 명령어
- img_test : 기존 이미지 이름
- localhost:5000 : 레지스트리 주소 (로컬에 만들었고, 호스트의 5000번 포트에 바인딩해줬음)
- img_test:1.0 : 리포지토리_이름:버전 (임의로 1.0버전이라고 해줬음)
docker image ls
를 통해 이미지 목록을 출력해 보면, 원래 있던 img_test도 존재하고, localhost:5000/img_test라는 이름의 복제된 이미지가 하나 더 생긴 것을 볼 수 있다.
docker push localhost:5000/img_test:1.0
- docker push : 이미지를 업로드하는 명령어
- localhost:5000/img_test:1.0 : 업로드하고자 하는 이미지 이름. <레지스트리_주소>/<리포지토리_이름:버전>
3️⃣ 로컬 registry에서 이미지 내려받기
우선, 헷갈리지 않기 위해서 img_test 이미지들을 docker image rm <이미지_이름>
명령어를 이용해 지워줬다.
docker image pull localhost:5000/img_test:1.0
- docker (image) pull : 이미지를 내려받는 명령어
- localhost:5000/img_test:1.0 : 내려받고자 하는 이미지 이름. <레지스트리_주소>/<리포지토리_이름:버전>
이미지 목록을 출력해보면 이미지를 잘 받은 것을 확인할 수 있다.
📌 registry 안의 리포지토리에 있는 이미지 목록 출력하기
현재 로컬 registry를 구축하고, 그 안에 img_test라는 이름의 리포지토리를 만들어서 localhost:5000/img_test:1.0이라는 이름의 이미지를 업로드 해 둔 상태이다.
리포지토리에 이미지가 잘 업로드 되었는지 확인하기 위해 리포지토리에 있는 이미지 목록을 출력하고 싶다면 다음과 같이 할 수 있다.
docker image ls localhost:5000/img_test
🌟 이 때 image ls(=images) 뒤에는 registry 이름이 아닌 repository 이름이 와야 한다!!
레지스트리 이름(localhost:5000)만 입력했을 때는 이미지가 출력되지 않았지만, 리포지토리까지 입력했을 때는(localhost:5000/img_test) 이미지가 제대로 출력된 것을 알 수 있다.
[직접해보기2] 도커 허브에 (비)공개 레지스트리 구축 및 이미지 업로드하기
1️⃣ 도커 허브에 repository 생성하기
나는 계정이 없어서 도커허브 공식 사이트에서 우선 계정을 만들어줬다.
계정 생성 후, 상단의 Repositories 탭으로 이동.
우측 상단의 Create repository 버튼을 눌러 repository를 생성할 수 있다.
1) Repository Name을 입력하고, 2) Visibiltiy에서 공개 여부를 선택해준다.
나는 private로 생성했다. 무료 계정의 경우 private repository는 1개까지만 사용 가능하다고 한다.
※ visibility는 repository 생성 후에 Settings에서 변경 가능하다!!
2️⃣ 터미널에서 도커 허브에 로그인하기
로컬의 터미널에서 도커 허브의 repository에 접근하려면 로그인이 필요하다.
docker login
위의 명령어 입력 후, 도커허브 계정의 아이디와 비밀번호를 입력해서 연동을 해준다.
3️⃣ 이미지 생성 및 도커허브 업로드하기
우선, 위에서 했던 것처럼 dockerfile을 이용해서 img_dockerhub라는 이름의 이미지를 생성했다.
이 이미지를 도커허브에 업로드할 것이다.
마찬가지로 docker image tag
명령어를 이용해 업로드를 위한 형식의 이름으로 태그를 부여한다.
(이 과정을 따로 거치지 않고, 위의 build 과정에서부터 이름을 형식에 맞게 부여해도 된다!!)
docker push heoyujung/private_repo:1.0
docker push
명령어를 통해 이미지를 업로드하면 도커 허브의 heoyujung이라는 registry의 private_repo라는 repository에 1.0이라는 태그를 가진 이미지가 업로드된 것을 확인할 수 있다!
4️⃣ 도커허브에서 repository 생성하지 않은 상태에서 바로 이미지 업로드하기
위에서는 도커허브에서 private repository를 생성한 후, 해당 repository에 이미지를 업로드했지만 별도의 repository를 생성하지 않고 바로 이미지를 업로드할 수도 있다.
우선 업로드하고자 하는 이미지에 형식에 맞게 태그를 부여한 후, docker push
명령어를 이용해 업로드했다.
- heoyujung/public_repo:1.0 : heoyujung이라는 registry의 public_repo라는 repository에 1.0이라는 tag로 이미지를 업로드 하겠음
이렇게 이미지를 바로 업로드하면, 해당 이름을 가진 repository가 자동으로 생성되는데, 이 때의 repository는 public인 상태로 생성된다.
참고 자료
📓 그림과 실습으로 배우는 도커 & 쿠버네티스
그림과 실습으로 배우는 도커 & 쿠버네티스: 개념과 작동 원리가 쏙쏙 이해되는 완벽 입문서
컨테이너나 도커를 도통 이해하기 어려운 분들을 위한 본격 도커 입문서! 이 책은 컨테이너 기술이 어렵게 느껴지는 엔지니어나 백엔드 기술에 자신이 없는 분들을 위한 도커 입문서입니다. 자
wikibook.co.kr