5 분 소요


본 내용은 인프런의 데브위키님 강의 “개발자를 위한 쉬운 도커” 내용을 바탕으로 정리한 내용입니다.


이미지 레지스트리(Image Registry )

  • 이미지 레지스트리는 이미지를 저장하고 공유하는 저장소이다. 대표적으로 도커 허브(docker hub)가 있다.
  • 이미지 레지스트리 기능
    • 이미지를 다운로드하고 업로드 할 수 있다.
    • 이미지를 검색할 수 있다.
    • 이미지의 버전을 관리할 수 있다.
    • 원하는 사용자만 이미지를 다운받을 수 있도록 인증 처리권한 관리 기능을 제공한다.
    • 안전한 이미지를 다운로드 받을 수 있도록 업로드된 이미지의 보안을 검증하는 기능을 제공한다.
    • DevOps 파이프라인 기능과 연계해서 이미지를 업로드했을 때 자동으로 배포가 될 수 있도록 연계 기능 및 알림 기능을 제공한다.

이미지 저장 공간

  • 이미지 저장 공간은 크게 세 가지로 분류할 수 있다.
  1. 로컬 스토리지(로컬 저장소): 도커가 실행되는 호스트 OS의 특정 폴더를 의미한다.
  2. 프라이빗 레지스트리(온라인 저장소): 특정 네트워크에서 접근이 가능하다(사내망,내부망)
  3. 퍼블릭 레지스트리(온라인 저장소): 모든 네트워크에서 접근이 가능하다(docker hub)
  • docker run 이미지명 명령어를 실행하면
    1. 로컬 스토리지에 이미지가 있는지 확인한다. 로컬 스토리지에 이미지가 있으면 해당 이미지로 컨테이너를 실행한다.
    2. 로컬 스토리지에 이미지가 없으면 온라인 레지스트리에서 이미지를 로컬 스토리지로 다운로드 받는다.
    3. 다운 받은 이미지를 사용해서 컨테이너를 실행한다.
    4. 이 후 동일한 이미지를 사용하는 경우 로컬 스토리지의 이미지를 통해 컨테이너를 실행한다.

나만의 레지스트리 만들기

  • 서버에 레지스트리를 설치해서 사용하는 방법이 있다.
    • 서버에 하버(HARBOR)도커 프라이빗같은 레지스트리 소프트웨어 제품을 설치해서 사용할 수 있다.
  • 퍼블릭 클라우드의 서비스를 이용하는 방법이 있다.
    • 퍼블릭 클라우드의 서비스로는 AWS의 ECR, Azure의 Container Registry (ACR) 같은 서비스를 사용할 수 있다.


이미지 네이밍 규칙 : 레지스트리주소/프로젝트명/레포지토리명:이미지태그

레지스트리 주소

  • 이미지를 어떤 레지스트리에서 다운로드하고 업로드 할지를 지정해야 한다.
  • 레지스티리주소가 비어 있는 경우 기본 레지스트리 값인인 Docker Hub의 주소인 docker.io로 지정된다.
  • 개인 레지스트리가 있는 경우 레지스트리 주소를 입력해야 한다.

프로젝트 명

  • 이미지를 보관하는 폴더 같은 개념이다.
  • 도커 허브의 경우 가입한 사용자의 계정명이 프로젝트 명이 된다.
  • 프로젝트명이 비어 있는 경우
  • 도커는 도커사가 직접 검증한 이미지는 오피셜 이미지로 제공하고 있다.
  • 그리고 이 오피셜 이미지는 라이브러리라는 프로젝트에서 관리한다.
  • 그래서 별도로 계정명을 입력하지 않으면 기본 값인 library로 지정된다.

레포지토리명

  • 다운받을 이미지의 레포지토리 이름이다.
  • 일반적으로 레포지토리 이름을 이미지 이름으로 만든다. 그래서 보통 레포지토리 명을 이미지 명이라 부른다.

이미지 태그

  • 이미지의 버전 정보이다.
  • 이미지 버전에는 숫자와 영문 모두 사용할 수 있다.
  • 이미지 태그가 비어 있는 경우 기본 값인 latest로 지정된다.


로컬 스토리지에 이미지를 저장하면 프로젝트명(사용자)/레포지토리명 로 조합되어 REPOSITORY에 저장된다.

  • 저장된 이미지를 검색해 보면 알 수 있다.
$ docker image ls


  • 명령어 예시 : 레지스트리주소 생략, 이미지태그 생략
# 사용자 기준 명령어
$ docker run devwikirepo/tencounter

# 시스템이 실제 실행하는 명령어 : `레지스트리주소/프로젝트명/이미지명:이미지태그`
$ docker run docker.io/devwikirepo/tencounter:latest


  • 명령어 예시 : 레지스트리주소 생략, 프로젝트명 생략, 이미지태그 생략
# 사용자 기준 명령어
$ docker run nginx

# 시스템이 실제 실행하는 명령어 : `레지스트리주소/프로젝트명/이미지명:이미지태그`
$ docker urn docker.io/library/nginx:latest


주요 핵심

- 이미지명은 `레포지토리명:태그`로 관리 된다.
- `docker run nginx` 명령어의 `ngninx`는 이미지명이 아니라 `레포지토리명`이다. 
- 숨어있는 latest 태그를 지정한 `nginx:latest` 가 온전한 이미지명이다.

Docker Hub의 이미지

  • 도커 허브(Docker Hub)에서 이미지를 검색하면 원하는 이미지를 찾을 수 있다.

Docker Hub의 이미지 분류

  • 왼쪽 필터링 메뉴의 Trusted Content 항목을 보면 이미지를 세 가지로 분류하고 있다.
    • Docker Official Image : 도커의 라이브러리 프로젝트에서 제공하는 공식 이미지를 의미한다.
    • Verified Publisher : 외부 기업에 의해 제공된 이미지로 도커의 검증을 통과한 이미지를 의미한다.
    • Sponsored OSS : 도커가 후원하는 오픈 소스 프로젝트들의 이미지를 의미한다.
  • docker run nginx 명령어를 실행하면 Docker Official Image로 지정된 nginx 이미지를 다운로드 받게 되는 것이다.


Docker Hub의 이미지 상세 정보

  • 이미지를 클릭하면 다운로드 수와 좋아요 수를 확인할 수 있다.


Docker Hub의 이미지 상세 정보 - Tags

  • 이미지 상세정보의 Tag 탭을 클릭하면 다양한 버전의 이미지들을 확인할 수 있다.
  • 태그에 stable 이라고 적혀 있는 것은 안정적인 버전이라 생각하면 된다.
  • 한 이미지당 OS와 시스템 아키텍처에 따라 여러 파일들이 존재하는 걸 볼 수 있다.
  • 도커는 이미지 다운로드 요청이 오면 먼저 명령어를 실행한 시스템의 아키텍처와 운영체제를 확인한 후 해당 시스템과 호환되는 가장 적절한 버전을 자동을 선택해서 다운로드 해준다.

Docker Hub 레포지토리

  • 이미지를 업로드 하면 저장되는 공간이다.

Docker Hub에 이미지 업로드 하기

  • 이미지명은 네이밍 규칙에 맞게 작성한다.

이미지 다운로드

명령어 : docker pull 레포지토리명:태그

$ docker pull devwikirepo/simple-web:1.0


이미지명 변경

명령어 : docker tag 기존[사용자명/레포지토리명:태그] 추가할[사용자명/레포지토리명:태그]

$ docker tag devwikirepo/simple-web:1.0 midoban/my-simple-web:1.0
  • tag : 새로운 이미지 명(레포지토리명:태그)을 추가하는 명령어다. 좀 더 정확하게 말하자면, 실제 이미지 파일은 하나만 존재하고 하나의 이미지 파일에 태그를 추가하는 것이다.
  • 실제 이미지와 이미지 명은 파일과 참조 링크 관계라고 생각하면 된다.
  • tag 명령어로 이미지 명을 추가한 후 docker image ls 명령어로 확인해 보면 기존 이미지와 추가된 이미지의 IMAGE ID가 동일한 것을 확인할 수 있다.

  • tag 명령어를 통해 새로운 이미지를 만드는 이유는 사용자명 변경 후 새로운 레지스트리에 업로드 하기 위해서다.
    • 만약 다른 레지스트리에서 이미지를 다운로드 받았다면 프로젝트명(사용자명)이 지정되어 있을 수 있다.
    • docker pull otheruser/nginx 이렇게 다운로드 받은 후 로컬 스토리지를 보면 레포지토리에 otheruser/nginx로 지정되어 있다.
    • 이미지 네이밍 규칙 상 레지스트리주소/프로젝트명/레포지토리명:이미지태그 이 구조를 지켜야 하는데 이미 otheruser/nginx 이렇게 지정되어 있으면 프로젝트명(사용자명)을 내껄로 변경할 수가 없다.
    • 그로 인해 내 레포지토리에 업로드 할 수가 없다. 따라서 tag 명령어로 otheruser/nginx -> my-nginx 이렇게 변경해 줘야 한다.
    • 그래야 이후 내가 myuser/my-nginx:l.0 이렇게 업로드 할 수 있다.


이미지 업로드

명령어 : docker push 레포지토리명:태그

$ docker push midoban/my-simple-web:1.0
  • 도커 허브에 이미지를 업로드할 때는 업로드할 레지스트리 계정의 인증 정보가 필요하다.
  • 그래서 우선 도커 허브의 계정에 로그인을 해야 한다. 로그인이 되어 있지 않으면 denied: requested access to the resource is denied 접근이 거부된다.


이미지 레지스트리 인증 정보 생성

명령어 : docker login

$ docker login
  • 도커 로그인 명령으로 로그인하면 스토리지의 특정 공간에 인증 정보가 파일 형태로 저장된다.
  • 아이디와 비밀번호를 입력해야 한다.


이미지 레지스트리 인증 정보 삭제

명령어 : docker logout

$ docker logout
  • 도커 로그아웃을 입력하면 인증 정보가 저장되어 있는 파일이 삭제된다.


이미지 삭제

명령어 : docker image rm 레포지토리명:태그

$ docker image rm midoban/my-simple-web:1.0


도커 허브에 이미지 업로드

명령어 : docker push 레포지토리명:태그

$ docker push midoban/my-simple-web:1.0

도커 허브 이미지로 컨테이너 실행

명령어 : docker run -d -p 80:80 midoban/my-simple-web:1.0

  • 로컬 스토리지에 있는 이미지를 삭제한 후 진행하자.
# 이미지 삭제
$ docker image rm 레포지토리명:태그

# 컨테이너 실행
$ docker run -d -p 80:80 midoban/my-simple-web:1.0

이미지 공유와 개발 환경 구축

지금까지 다른 레지스트리에 있는 이미지를 다운로드하고 내 레지스트리의 레포지토리에 이미지를 업로드해 보았다.
그리고 내 레포지토리에 있는 이미지를 가지고 컨테이너를 실행까지 해 보았다.

도커를 사용하기 전에는 이미지가 아닌 소스 코드나 애플리케이션을 파일로 공유했다.
실제로 애플리케이션을 실행할 때 OS나 라이브러리가 PC별로 차이가 있기 때문에 개발자의 개발용 PC에서는 잘 실행되던 애플리케이션도 운영 환경이나 다른 PC에서는 제대로 동작하지 않는 문제가 빈번하게 발생한다.
그래서 운영 환경을 테스트할 수 있는 QA 환경을 만들고 운영 환경과 완벽하게 일치시키는데 많은 노력을 기울이지만 그럼에도 불구하고 환경의 불일치로 인해서 많은 문제들이 발생한다.

컨테이너를 사용하면 이렇게 환경의 차이에서 나오는 문제들을 근본적으로 해결할 수 있다.
간단한 웹서버부터 복잡한 애플리케이션 서버 구성까지 이미지에 실행 가능한 형태로 저장해서 공유하면 서버를 운영하는 비용을 줄이고 새로운 서버를 구성하는 시간을 크게 단축시킬 수 있다.

이미지를 통해 실행된 컨네이너로 인해 누구든지 장소와 상관없이, 환경과 상관없이 동일한 애플리케이션을 사용할 수 있다.

댓글남기기