도커 플랫폼은 소프트웨어 배포 기능을 내장하고 있다. 우리가 내려 받은 이미지는 도커 레지스트리라고 불리는 서버에 저장된다. 도커 허브는 도커 레지스트리 중 가장 유명한 레지스트리로, 수십만 종 이상의 이미지를 제공하며 다운로드 횟수가 한 달에 수십억 회에 달한다. 도커 허브는 도커 엔진에 기본으로 설정된 레지스트리이기도 한다. 달리 말하면, 로컬 컴퓨터에 없는 이미지를 내려받으려 할 때 가장 먼저 찾아보는 곳이 도커 허브라는 말이다.
도커 이미지에는 이름이 부여되는데, 이 이름에 해당 이미지를 내려받기 위해 필요한 모든 정보가 들어 있다. 지금까지 우리가 사용했던 이미지는 image-gallery나 diamol/golang처럼 하나 혹은 두 개의 요소로 구성되는 간단한 이름을 가졌다. 그러나 이미지의 전체 이름은 네 개의 요소로 구성된다.
docker.io/diamol/golang:latest
직접 개발한 애플리케이션의 이미지를 관리하면 이미지 참조의 모든 구성 요소를 다 사용해야 한다. 로컬 컴퓨터에서만 사용한다면 이미지 이름을 마음대로 지어도 문제가 없지만, 레지스트리를 통해 다른 사람이 이미지를 사용하게 하려면 좀 더 상세한 정보를 이미지 이름에 포함시켜야 한다. 바로 이 이미지 참조가 레지스트리에서 특정한 이미지를 식별하는 식별자 역할을 하기 때문이다.
레지스트리와 태그 등의 정보는 따로 지정하지 않아도 도커가 미지 정해진 기본값을 사용한다. 레지스트리의 기본값은 도커 허브이고, 태그의 기본값은 latest다. 도커 허브의 도메인은 docker.io이므로 diamol/golang 이미지의 전체 이름, 즉 이미지 참조는 docker.io/diamol/golang:latest가 된다. 우리가 사용할 때는 이 두 가지 중 어느 것을 사용해도 무방하다. diamol 단체의 소속원만이 리포지터리에 이미지를 푸시할 수 있다.
규모가 큰 회사는 사내 네트워크나 전용 클라우드 환경에 자사의 도커 레지스트리를 별도로 꾸리는 경우가 많다. 이미지 참조의 첫 부분에 이런 인하우스 레지스트리의 도메인을 기재하면 도커는 도커 허브 대신 해당 레지스트리를 찾아 간다. 이미지 참조에서 가장 중요한 부분은 태그다.
우리는 아직 이미지 태그를 지정해 본 적이 없다. 처음에는 태그를 사용하지 않는 편이 더 이해하기 쉽기 때문이다. 그러나 직접 애플리케이션을 패키징하려면 항상 태그를 부여해야 한다. 태그는 같은 애플리케이션의 서로 다른 버전을 구별하기 위해 쓰인다. OpenJDK의 공식 도커 이미지에는 수백 개에 달하는 태그가 있다. openjdk:13은 가장 최신 버전이고 openjdk:8u212-jdk는 자바 8의 특정 릴리스를 가리키며, 이 외에도 서로 다른 리눅스 배포판이나 윈도 버전을 위한 태그가 따로 있다. 이미지를 빌드할 때 태그를 따로 지정하지 않으면 기본적으로 lstest 태그가 부여된다. 그러나 새로 만든 이미지가 항상 최신 버전일 수는 없기 때문에 태그를 명시적으로 지정하지 않으면 오해를 일으키기 쉽다. 레지스트리에 이미지를 푸시할 때는 항상 명시적으로 태그를 부여해야 한다.
도커 허브에 이미지를 푸시하려면 먼저 도커 허브 계정이 필요하다. 도커 허브 계정을 아직 만들지 않았다면 https://www.docker.com/ 에 가서 계정을 생성하기 바라낟.
레지스트리에 이미지를 푸시하려면 두 가지 절차가 필요하다. 첫 번째는 도커 명령행을 통해 레지스트리에 로그인을 해야 한다. 이 로그인을 통해 레지스트리에 이미지를 푸시할 권한이 부여된다. 두 번째는 이미지에 푸시 권한을 가진 계정명을 포함하는 이미지 참조를 붙여야 한다.
# 윈도 환경의 파워셸
$dockerId = "도커 허브 계정 이름"
# 리눅스 또는 macOS 환경의 배시 셸
export dockerId = "도커 허브 계정 이름"
먼저 도커 허브에 로그인부터 하자. 이미지를 레지스트리에 업로드하거나 다운로드하는 일은 도커 엔진이 맡지만, 그 전에 도커 명령행을 통해 인증을 마쳐야 한다. login 명령을 입력하면 패스워드를 물어 올 것이다. 도커 허브 계정의 패스워드를 입력하면 된다.
docker login --username $dockerId
패스워드를 입력할 때 입력된 내용은 화면에 나타나지 않는다.
이미지 참조에는 계정 이름이 지정돼 있지 않기 때문에 지금 상태로는 이 이미지를 레지스트리에 푸시할 수 없다. 그러나 이미지 참조를 새로 부여하기 위해 이미지를 다시 빌드할 필요는 없다. 이미지는 여러 개의 참조를 가질 수 있다.