핵심 내용
이전 포스트에서 다룬 내용들은 dockerfile을 통해 이미지를 build하고, 해당 이미지를 바탕으로 container를 실행하는 방법에 관한 것이었다. 이번 포스트는 dockerfile을 통해 생성된 이미지를 도커 레지스트리에 공개(ship)하는 방법에 대해 다루고자 한다.
도커 레지스트리와 도커 허브
❔ 도커 레지스트리
도커 이미지를 저장하고 공유하기 위한 저장소이다. 버전 관리, 접근 제어, 이미지 검색, 배포 등의 기능을 제공하며, 도커 이미지의 생명주기 관리를 위한 핵심 요소이다. Docker Hub는 가장 널리 사용되는 공개 레지스트리이지만, 보안 이슈나 특정 환경에서의 요구사항 때문에 private registry를 사용하기도 한다.
❔ 도커 허브
도커 레지스트리 중 하나이며, 도커 커뮤니티에서 공개적으로 사용 가능한 수많은 도커이미지를 제공하는 중앙 저장소이다. 도커 엔진에 기본으로 설정된 레지스트리이며, 로컬 컴퓨터에 없는 이미지를 내려받으려 할 때 가장 먼저 찾아보는 곳이다.
이미지 참조(image reference)
이미지 참조는 도커 이미지를 지칭하는 방법이다. 일반적으로 "이미지명:태그" 형식을 따른다. 이때 "태그"는 이미지의 버전을 나타낸다.
이미지 참조의 구조는 Registry/Username/Repository:Tag로 구성된다.
Registry
레지스트리의 호스트 이름이다. 기본값은 Docker Hub이며, 레지스트리가 Docker Hub인 경우 생략할 수 있다.
(ex. myregistry.com)
Username
이미지 작성자의 계정 이름, 개인 혹은 단체의 이름에 해당한다.
Repository
하나의 리포지터리는 여러 버전의 이미지를 담을 수 있다.
Tag
태그는 이미지의 버전을 나타낸다. 기본값은 latest이며, 생략할 수 있다. latest가 항상 최신 버전을 가리키는 것은 아니므로 태그는 항상 명시적으로 지정하는 것이 좋다.
도커 허브에 이미지 푸시하기
도커 레지스트리 로그인하기
: docker login
'docker login' 명령어는 Docker 클라이언트를 Docker 레지스트리에 로그인 시킨다. 로그인한 레지스트리에 Docker image를 push하거나 pull하기 위한 권한을 얻을 수 있다.
docker login --username $dockerId // 도커 허브에 로그인 하기
'--username' 옵션은 사용자 ID를 지정하는데 사용된다. $dockerId는 허브 계정 이름을 환경 변수로 정의한 것이다.
레지스트리 주소를 명시적으로 지정하지 않았기 때문에, 기본 레지스트리인 Docker Hub에 로그인한다.
이미지 참조 부여하기
: docker image tag [기존 이미지 참조] [새로운 이미지 참조]
docker image tag image-gallery $dockerId/image-gallery:v1 // 기존 이미지에 새로운 이미지 참조 부여하기
Docker 이미지 목록 출력하기
: docker image ls
'--filter' 옵션은 특정 조건에 맞는 이미지만 출력하도록 필터링한다.
docker image ls --filter reference=image-gallery --filter reference='*/image-gallery'
- --filter reference=image-gallery
- image-gallery:tag 형태의 이미지를 찾는다.
- --filter reference='*/image-gallery'
- registry/image-gallery:tag 형태의 이미지를 찾는다.
레지스트리에 이미지 push하기
: docker image push
docker image push $dockerId/image-gallery:v1 // $dockerId/image-gallery:v1 이미지를 레지스트리에 푸시하기
이미지를 docker registry에 push할 때, 실제로 전송되는 것은 이미지 레이어다. 즉, 레지스트리가 이미 가지고 있는 레이어는 다시 전송하지 않으므로 불필요한 네트워크 트래픽과 저장 공간을 줄인다. (여기서 다시 언급되는 Dockerfile 스크립트 최적화의 중요성)
Docker Hub의 특정 사용자의 특정 이미지의 태그 목록 페이지 URL 출력하기
echo "https://hub.docker.com/r/$dockerId/image-gallery/tags"
Docker Core Registry
Docker Core Registry는 Docker Hub에서 제공하는 웹 기반 사용자 인터페이스를 포함하지 않는다는 것을 제외하고는 유사하다. 가볍게 동작하며, 특정 사용자가 패키징한 이미지를 사용해 컨테이너로 직접 실행할 수 있다. 즉, Docker Core Registry를 사용하면 사용자는 자신의 로컬 네트워크에 도커 이미지를 저장하고 관리하는 데 필요한 기본적인 도구를 가질 수 있다.
Docker registry를 로컬 네트워크에 설정할 때의 장점
- 네트워크 리소스 절약
- 이미지를 원격 레지스트리에서 가져오는 것이 아닌 로컬 네트워크 내에서 가져온다.
- 따라서 로컬 레지스트리를 사용하면 인터넷 사용량을 줄이고 데이터 전송 시간을 절약할 수 있다.
- 데이터 보안 향상
- 자체 레지스트리를 운영하면 데이터를 직접 관리할 수 있으므로 ..
- 신속한 전환
- 공개 레지스트리가 접근이 불가능한 상황에서도 로컬 레지스트리르 사용하여 작업을 계속할 수 있다.
로컬 컴퓨터에 도커 레지스트리 설정하기
docker container run -d -p 5000:5000 --restart always diamol/registry
- -d
- 컨테이너를 detached mode에서 실행한다.
- 분리 모드에서는 컨테이너가 백그라운드에서 실행된다.
- -p 5000:5000
- 호스트의 포트 5000을 컨테이너의 포트 5000에 바인딩한다.
- --restart always
- 컨테이너가 어던 이유로든 종료되면 항상 재시작되도록 설정한다.
그러나 이 레지스트리는 현재 로컬 컴퓨터에서만 접근 가능하다. 즉, 'localhost:5000' 혹은 '127.0.0.1:5000'으로 로컬 컴퓨터에서만 도커 레지스트리에 접근할 수 있다.
도커 레지스트리에 도메인 이름 지정하기
hosts 파일은 도메인과 IP 주소의 매핑을 관리하는 시스템 파일이다. 아래 명령은 hosts 파일을 변경하여 'registry.local'이라는 도메인을 로컬 컴퓨터의 IP 주소인 '127.0.0.1'에 매핑하는 것이다. 이렇게 설정하면 'registry.local:5000'과 같이 도메인 이름을 사용하여 로컬 레지스트리에 접근할 수 있다.
만약 로컬 네트워크 내의 다른 컴퓨터에서 로컬 도커 레지스트리에 접근하게 하려면, "192.168.1.100 registry.local"처럼 추가하면 된다. 이 방식은 보안상의 이슈가 발생할 수 있으므로, 로컬 컴퓨터에서 데모 용도로만 사용하자.
# 윈도 환경의 파워셸
Add-Content -Value "127.0.0.1 registry.local" -Path /windows/system32/drivers/etc/hosts
# 리눅스 또는 macOS 환경의 배시 셸
echo $'\n127.0.0.1 registry.local' | sudo tee -a /etc/hosts
이미지 push하기
docker image push registry.local:5000/gallery/ui:v1
이미지 태그 관련 팁
[major].[minor].[patch]
- patch
- 변경 내용이 버그 수정뿐이고 기능은 지난 버전과 같다.
- minor
- 추가된 기능은 있지만 기존 기능은 유지한다.
- major
- 완전히 다른 기능을 가진다.
소프트웨어 버전 관리 및 이미지 태깅 전략
- 'gallery/ui:2.1' 태그는 7월에는 '2.1.106' 버전을 가리켰지만, 8월에는 '2.1.114' 버전을 가리킨다.
- 이처럼 태그는 릴리스가 이루어질 때마다 가리키는 버전이 변경될 수 있다.
- 이 방식을 사용하는 이유는 사용자가 원하는 버전에 대한 유연성을 제공하기 위함이다.
- 특정 버전의 이미지를 항상 사용하려면 해당 버전의 태그를 사용하면 되며, 자동으로 patch 업데이트를 받고 싶다면 minor 버전 태그(ex. 2.1)를, minor 업데이트까지 받고 싶다면 major 버전 태그(ex. 2)를 사용하면 된다.
- 특정 패치 버전을 사용할 경우
- 항상 동일한 버전의 환경을 유지할 수 있지만, 새로운 보안 패치를 받지 못할 수 있다.
- 메이저 버전 태그를 사용할 경우
- 지속적인 업데이트를 받을 수 있지만, 예기치 않은 기능 변경으로 인한 문제를 겪을 수 있다.
- 따라서 Dockerfile에서 사용하는 기반 이미지의 버전을 지정할 때는 최대한 구체적으로 지정하는 것이 좋다.
- 구체적으로 지정하지 않을 경우, 이미지가 업데이트 되면서 빌드 과정이나 애플리케이션 실행 과정에서 문제가 발생할 수 있다.
골든 이미지
- 도커 허브 같은 레지스트리에는 누구나 이미지를 push하고 pull할 수 있으므로, 신뢰성에 문제가 있을 수 있다.
- 이를 방지하기 위해 도커 허브에서는 검증된 퍼블리셔(verified publisher)와 공식 이미지(official image)라는 제도를 사용한다.
- 검증된 퍼블리셔(verified publisher)
- 마이크로소프트, 오라클, IBM와 같은 대형 기업들을 말한다.
- 검증된 퍼블리셔에서 배포하는 이미지는 취약점 검증 절차를 거친 후 공개된다.
- 공식 이미지(official image)
- 해당 프로젝트의 개발팀과 도커가 관리하며, 취약점 검사를 거치고 주기적으로 업데이트된다.
- 주로 오픈소스이다.
- 골든 이미지
- 개발자가 직접 만든, 특정한 요구사항이나 보안 정책을 충족하는 커스텀 도커 이미지이다.
- 공식 이미지 또는 검증된 퍼블리셔의 이미지를 기반으로 만들어진다.
- 즉, 이미지의 신뢰성도 보장하면서도, 자신의 요구에 맞게 커스텀할 수 있다.
- 공식 이미지와 달리 필요한 시점에만 업데이트하면 된다.
- 특히 지속적 통합(CI) 파이프라인에서는 골든 이미지를 사용하여 일관된 작업 환경을 유지해야 한다.
레퍼런스
[Docker / Kubernetes] 6-1. 도커 레지스트리
도커 이미지를 저장하고 관리하는 도커 레지스트리에 대해 자세히 알아봅시다. 🤔
velog.io
'DevOps > Docker' 카테고리의 다른 글
[Docker] 헬스 체크와 디펜던시 체크 (0) | 2023.07.18 |
---|---|
[Docker] 도커 컴포즈와 분산 애플리케이션 (0) | 2023.07.18 |
[Docker] 도커 볼륨과 마운트 (0) | 2023.07.18 |
[Docker] 멀티 스테이지와 애플리케이션 빌드 (0) | 2023.07.09 |
[Docker] Docker image와 image layer (0) | 2023.07.09 |