도커 허브(DockerHub)
Docker Hub
가장 많이 사용되는 Public Image Registry로 깃허브가 소스코드를 저장하는 저장소라면,
도커허브는 이미지를 저장하는 저장소를 뜻한다.
즉, 깃 허브에는 소스 코드만 보관하고, 도커 허브에는 이 소스 코드를 사용해서 만들어진 애플리케이션과 애플리케이션을 실행할 수 있는 환경이 모두 포함되어 있는 이미지를 저장한다.
이미지 레지스트리의 역할
- 이미지 공유 : 이미지를 다운로드하고 업로드 하는 기능 제공
- 이미지 검색 : 이미지 레지스트리에 있는 이미지 검색하고 필요한 이미지 찾을 수 있음
- 이미지 버전 관리 : 버전별로 이미지를 관리하기 때문에, 특정 버전의 이미지를 사용자가 지정하여 다운로드 가능
- 보안 : 원하는 사용자만 이미지를 다운받을 수 있도록 인증 처리와 권한 관리 기능 제공/ 업로드된 이미지 보안 검증
- 파이프라인 : DevOps 파이프라인 기능과 연계하여 자동 배포가 가능하도록 연계하거나 알림 기능 제공
이미지가 저장되는 3 종류의 공간
1) 도커가 설치되어 있는 호스트 머신의 로컬스토리지
2) 주로 기업에서 사용하는 프라이빗 레지스트리
3) 도커 허브와 같은 퍼블릭 레지스트리
- Private Registry : 특정한 네트워크에서만 접근이 가능한 레지스트리(사내망)
- Public Registry : 모든 네트워크에서 접근이 가능한 레지스트리(Docker Hub)
=> 실무에서는 보통 이미지를 업로드하고 다운로드할 때 사용하는 사내용 레지스트리가 있는 경우가 많음
이미지 검색 과정
1) 컨테이너 실행 시 이미지의 이름을 입력한다.
ex ) docker run nginx
2) 먼저 호스트 머신의 로컬스토리지에 해당 이미지가 있는지 검색
3) 로컬 스토리지에 이미지가 없다면 호스트 외부의 온라인 레지스트리에서 이미지를 로컬 스토리지로 다운로드한다.
4) 로컬 스토리지에 있었거나 다운로드한 이미지를 사용해서 컨테이너를 실행시킨다.
5) 이 다음부터는 온라인 레지스트리에 접곤하지 않고도 로컬 스토리지에 이미지가 존재하기 때문에 바로 컨테이너로 실행이 가능하다.
이미지 네이밍 규칙
레지스트리주소/프로젝트명/이미지명:이미지태그
이미지의 이름은 위 형식으로 구성된다.
1) 레지스트리 주소 : 어떤 레지스트리에서 이미지를 다운로드할지 지정
- 아무것도 적지 않으면 도커 허브의 레지스트리 주소인 docker.io가 기본값으로 지정된다.
2) 프로젝트명 : 이미지를 보관하는 폴더
- 도커 허브의 경우에는 가입한 사용자의 계정명이 프로젝트명이 된다.
- 도커 허브를 사용하면서 프로젝트명을 입력하지 않으면 도커사가 별도 제공하는 library 폴더가 기본값으로 지정된다.
3) 이미지명 : 다운로드 받을 이미지의 이름
4) 이미지태그 : 다운로드 받을 이미지의 버전
- 아무것도 적지 않으면 최신버전을 의미하는 latest가 기본값으로 지정된다.
ex1) chaeros.com/myProject/myNginx:2.1.0-alpine
=> chaeros.com이라는 레지스트리에서 myProject라는 프로젝트의 myNginx라는이미지를 2.1.0-alpine 버전으로 다운
ex2) chaeros/myImage
=> 도커 허브에서 chaeros라는 계정의 myImage 이미지를 최신 버전으로 다운로드한다.
ex3) nginx
=> 도커사가 직접 검증한 이미지는 오피셜 이미지로 지정하여, 라이브러리라는 프로젝트에서 별도 관리한다.
따라서 별도의 계정명을 입력하지 않았을 경우, library가 기본값으로 지정된다.
그렇기에 프로젝트명을 비워두면 docker.io의 library 폴더에 있는 이미지를 다운로드 하게 되는 것이다.
도커허브 명령어
1. 로컬 스토리지로 이미지 다운로드
docker pull {이미지명}
2. 로컬스토리지의 이미지명 추가
docker tag {기존이미지명} {추가할이미지명}
- 원래 있더 이미지에서, 내가 원하는 이름으로 새로운 이미지로 하나 더 생성한다.
- 이미지명을 바꾸는 이유는 프로젝트의 이름을 바꾸고 다른 레지스트리로 전송하기 위해서이다.
(도커허브에서 프로젝트의 이름은 도커 사용자의 계정명인데, 해당 이미지를 내 이미지 레지스트리로 옮기고 싶을 때 tag 명령을 통해 이미지의 프로젝트명을 변경하고, 내 이미지 레지스트리로 push하여 업로드할 수 있다.)
- 이름만 바꿨기 때문에 이미지의 ID는 동일하다. 이미지의 ID가 동일하다는 것은 실제로 파일이 하나만 있다는 의미다.
3. 이미지 레지스트리에 이미지 업로드
docker push {이미지명}
- 내 Hub에 push한다.
4. 이미지 레지스트르 인증 정보 생성
docker login
5. 이미지 레지스트르 인증 정보 삭제
docker logout
6. 로컬 스토리지의 이미지 삭제
docker image rm {이미지명}
- 로컬 스토리지에 하나의 이미지에 대해 여러 이름의 이미지가 저장되어 있을 경우, 모든 이름의 이미지가 삭제되었을 경우에만 실제 파일이 디스크에서 삭제된다.
- docker rm {컨테이너명} 은 실행중인 컨테이너를 삭제하는 명령어이다.
[이 블로그에 정리된 Docker 관련 자료는 인프런 데브위키님의 강의 내용을 바탕으로 작성되었습니다.]