본 글은 도커 교과서를 읽고 정리한 내용입니다.
5장은 공유에 대해 공부할 예정.
도커에서 공유란 로컬 컴퓨터에서 빌드한 이미지를 다른 사람이 사용할 수 있게 하는 것.
레지스트리, 레포지터리, 이미지 태그 다루기
도커 플랫폼은 SW 배포 기능을 내장하고 있음.
로컬에 이미지가 없다면 도커는 자동으로 이미지를 내려받음. -> 이 이미지는 도커 레지스트리라 불리는 서버에 저장됨.
도커 허브는 도커 레지스트리 중 가장 유명한 레지스트리.
도커 이미지엔 이름이 부여되는데, 이 이름에 해당 이미지를 내려받기 위해 필요한 모든 정보가 있음.
이미지 전체 이름은 4개의 요소로 구성됨.
예를 들어 diamol/golang은 다음과 같이 구성됨.
이미지 참조 시 이미지의 첫 부분(위 사진에선 docker.io)에 인하우스 레지스트리의 도메인을 적으면 도커는 도커 허브 대신 해당 레지스트리를 찾아감!
직접 애플리케이션을 패키징할 땐 꼭 태그를 붙여줘야 함.
태그는 애플리케이션의 서로 다른 버전을 구별하기 위해 사용됨.
(기본값으로 latest)
레지스트리에 이미지를 푸시할 때는 항상 명시적으로 태그를 부여해야 함.
도커 허브에 직접 빌드한 이미지 푸시하기
레지스트리에 이미지를 푸시하려면 두 가지 절차가 필요함.
- 도커 명령행을 통해 레지스트리에 로그인하기 -> 레지스트리에 이미지를 푸시할 권한이 생김.
- 이미지에 푸시 권한을 가진 계정명을 포함하는 이미지 참조 붙이기
도커 허브 계정을 터미널에 환경 변수로 정의해보자!
export dockerId="도커허브계정이름"
(리눅스 또는 macOS 명령어)
도커 허브에 로그인하기위해 터미널에 아래 명령어 입력!
docker login --username $dockerId
그 후 비밀번호를 입력!
로그인이 됐으면 본인의 계정 또는 푸시 권한이 부여된 단체 계정에 이미지를 푸시할 수 있음.
하나의 이미지는 여러 개의 참조를 가질 수 있음.
다음 명령어를 통해 기존 이미지에 새로운 이미지 참조를 부여할 수 있다.
docker image tag image-gallery $dockerId/image-gallery:v1
이제 이미지는 2개의 참조를 가지게 됨!
이미지는 유일 식별자를 갖고 있기에 여러 개의 이미지 참조가 같은 이미지를 가리키고 있는지 알 수 있음.
아래 명령어를 통해 image-gallery 이미지의 이미지 참조 목록을 볼 수 있음.
docker image ls --filter reference=image-gallery --filter reference='*/image-gallery'
도커이미지를 푸시하려면
docker image push
명령어를 사용하면 된다.
이미지를 푸시할 때 실제로 업로드 대상이 되는 것은 이미지 레이어!
레지스트리 역시 도커 엔진과 같은 방식으로 이미지 레이어를 다룸.
레지스트리에서도 캐시상에 레이어 해시와 일치하는 레이어가 없을 경우에만 실제로 업로드가 이뤄짐.
레이어가 90%가 기존 캐시를 재사용할 수 있도록 이미지를 최적화했다면, 이 이미지를 푸시할 때 90%의 레이어는 레지스트리의 캐시를 재사용할 수 있다.
나만의 도커 레지스트리 운영하기
로컬 네트워크에 전용 레지스트리가 있을때 장점은 다음과 같다.
- 인터넷 회선 사용량을 줄여 주며 전송 시간도 절약 가능.
- 데이터를 다른 사람의 손에 맡기지 않아도 된다는 장점이 있음.
- 주로 사용하는 공개 레지스트리가 다운됐을 때 신속하게 전환할 수 있음.
도커 코어 레지스트리 서버는 깃허브 저장소 docker/distribution에서 개발이 진행됨.
코어 레지스트리 서버는 도커 허브와 동일한 레이어 캐시 시스템을 통해 이미지를 내려받고 푸시하는 기본적인 기능을 제공함.
코어 레지스트리 서버는 매우 가볍게 동작하는 서버.
docker container run -d -p 5000:5000 --restart always diamol/registry
위 명령어를 통해 로컬 컴퓨터에서 도커 레지스트리를 실행시킬 수 있음(Mac을 사용하는 경우, 시스템 설정 -> 일반 -> AirDrop 및 Handoff-> AirPlay 수신 모드 끄기 - 5000 포트가 AirPlay에 의해 사용되고 있어서 이것을 꺼줘야함!)
아래 명령어를 통해 로컬 컴퓨터에 registry.local 이라고 별명을 추가할 수 있음!
echo $'\n127.0.0.1 registry.local' | sudo tee -a /etc/hosts
로컬 컴퓨터의 레지스트리 컨테이너는 이미지를 푸시하고 내려받기 위해 보안 프로토콜인 HTTPS 대신 비보안 프로토콜인 HTTP를 사용함.
도커의 기본 설정에선 비보안 프로토콜이 적용된 레지스트리를 사용할 수 없게 되어있으므로, 비보안 레지스트리를 사용하려면 로컬 컴퓨터의 레지스트리를 비보안 레지스트리의 허용 목록에 추가해야 함
도커 엔진의 설정은 daemon.json이란 설정 파일에 들어있다.
윈도우의 경우 C:\Program Data\docker\config
리눅스의 경우 /etc/docker 에 위치함.
비보안 레지스트리를 사용할 땐 주의가 필요함.
도커 엔진과 레지스트리의 통신 내용을 제삼자가 엿볼 수 있고 이미지 푸시 과정에서 레이어가 유출될 수 있음
레지스트리에서 이미지를 받아 올 대 위조된 가짜 이미지를 받아 올 가능성도 있음.
이제 로컬 레지시트리에 이미지 푸시가 가능하게 됨.
docker image push registry.local:5000/gallery/ui:v1
위 명령어에 대해 설명하면,
- docker image push : Docker 이미지를 푸시하는 작업
- registry.local:5000 : 이미지를 푸시할 대상 레지스트리 서버와 포트 번호.
- registry.local 이라는 로컬 서버의 5000번 포트를 사용
- gallery/ui : 이미지를 저장할 레포지토리와 경로 지정
- gallery라는 레포지토리 안의 'ui'라는 이미지
- v1 : 푸시할 이미지의 태그 지정.
즉 , 로컬에 있는 `gallery/ui:v1` 이미지를 `registry.local:5000` 에 위치한 Docker 레지스트리에 업로드함.
로컬 네트워크상의 다른 사람에게 이미지를 공유할 수 있게 되었음!
이미지 태그를 효율적으로 사용하기
같은 이미지에 여러 개의 태그를 부여할 수 있다.
그러므로 태그를 통해 버전을 구분하는 것이 효율적!
대부분 소프트웨어가 소수점으로 구분된 숫자로 버전을 나타냄.
이미지 태그에도 위와 같은 방식을 사용할 수 있음.
기본적인 방법은 [major].[minor].[patch] 형태를 따름
- patch 자리만 바뀐 버전은 변경 내용이 버그 수정 뿐이며 기능은 지난 버전과 같다는 뜻
- minor 자리가 바뀐 버전은 추가된 기능은 있지만 기존 기능은 모두 유지하는 것
- major 자리가 바뀐 버전은 완전히 다른 기능을 가진다
예를 들어 다음과 같은 방식으로 태그 구분 가능
docker image tag image-gallery registry.local:5000/gallery/ui:latest
docker image tag image-gallery registry.local:5000/gallery/ui:2 # major 수정
docker image tag image-gallery registry.local:5000/gallery/ui:2.1 # minor 수정
docker image tag image-gallery registry.local:5000/gallery/ui:2.1.106 # patch 수정
만약 위 애플리케이션이 한 달에 한 번씩 새 버전이 릴리즈될 때마다 버전 넘버가 증가한다 생각해보자
위 과정이 도커 이미 버전 표현법을 운영하는 전형적인 방식.
이런 방식을 왜 사용할까?
- 사용자들에게 최신 버전을 얼마나 빠르게 따라갈지 선택권을 줄 수 있기 때문!
- pull 명령이나 FROM 인스트럭션에서 특정한 패치 버전을 콕 집어 사용하면 항상 같은 버전을 보장받을 수 있음!
- 예를 들어 2.1.106 태그는 10월이 지나도 계속 같은 버전을 가리킨다.
공식 이미지에서 골든 이미지로 전환하기
레지스트리에서 제공되는 이미지를 우리가 얼마나 신뢰할 수 있을까?
도커 허브엔 누구나 이미지를 푸시할 수 있고 그 이미지를 누구나 내려받을 수 있음
도커 허브는 검증된 퍼블리셔(verified publisher)와 공식 이미지(official Image) 제도를 통해 안전성을 보장함!
MS, Oracle, IBM 같은 기업들이 검증된 퍼블리셔로 지정됨.
컨테이너에서 새로 나온 최신 버전의 소프트웨어를 실행하고 싶다면 검증된 퍼블리셔가 배포하는 인증된 이미지를 사용하는 것이 최선!
골든 이미지란 공식 이미지를 기반 이미지로 삼아 인증서나 환경 설정 값 등 자신이 필요한 설정을 추가한 것.
- 도커 허브의 기업 레포지터리나 자체 레포지터리에서 관리함.f
- 해당 기업의 모든 애플리케이션 이미지는 이 골든 이미지를 기반으로 함.
- 프로젝트 개발 팀과 도커가 함께 최적화한 공식 이미지의 이점을 그대로 누리며 필요한 설정 추가 가능.