~p.120
5-2. 도커 허브에 직접 빌드한 이미지 푸시하기
- 도커 command에 레지스트리 로그인, 푸시권한을 가진 계정명을 포함하는 이미지 참조를 붙이면 푸시가 가능하다.
$dockerId="계정이름" # 환경변수설정
export dockerId="계정이름" # 리눅스버전
echo $dockerId
docker login --username $dockerId
PASSWORD:
Login Succeded
- 이미지는 여러 개의 참조를 가질 수 있기에 이전에 빌드한 이미지를 다시 빌드하지 않고 이미지 참조를 새롭게 부여하자. 이미지는 유일 식별자(IMAGE ID)를 갖기에 여러 개의 이미지 참조가 같은 이미지를 가리킨다는 것을 확인할 수 있다.
docker image tag image-gallery $dockerId/image-gallery:v1 #계정이름/이미지이름:버전으로 태그를 생성
docker imsge ls --filter reference=image-gallery --filter reference='*/image-gallery' # 확인
- 내 계정이름으로 된 이미지 참조를 생성했기에 푸시할 수 있다. 이미지 레이어가 실제로 업로드된다. 이 때 레지스크리 캐시 상에 레이어 해시와 일치하는 레이어가 없을 경우에만 실제로 업로드가 이루어지는 도커 엔진의 레이어 캐시와 완전히 같은 방식이기에, 레지스트리 최적화를 레이어의 90%를 기존 캐시를 사용하게 하면 빌드시간, 디스크 용량, 네트워크 대역폭까지 최적화 할 수 있다.
docker image push $dockerId/image-gallery:v1
- 도커 허브를 열람해 푸시된 이미지를 확인해보자.
echo 'https://hub.docker.com/r/$dockerId/image-gallery/tags'
- 도커 레지스트리 중 도커 허브는 거의 0원의 비용으로 다양한 기능을 제공하며, 데이터 센터에서 직접, 혹은 단순 컨테이너 형태의 레지스트리를 운영할 수도 있다.
나만의 도커 레지스트리 운영하기
- 주로 공개하는 레지스트리가 다운됐을 경우 빠른 전환을 위해 자신만의 도커 레지스트리가 필요하다. 도커 코어 레지스트리 서버는 이미지를 내려받고 푸시하는 기본적인 기능만을 제공하여 매우 가볍게 동작하는 서버로, 컨테이너 형태로 직접 실행할 수 있다. localhost:5000을 사용해 이미지에 태그를 부여하면 푸시할 수 있다.
# 로컬 컴퓨터에 기본포트 5000의 전용 레지스트리 생성.
docker container run -d -p 5000:5000 --restart always diamol/registry
- 위의 경우 로컬컴퓨터에서만 접근이 가능하기에 도메인 네임을 붙이기 위해 도메인과 IP주소를 기록한 hosts파일에 도메인-주소 쌍을 추가한다.
# 로컬서버 주소 127.0.0.1
# window
Add-Content -Value '127.0.0.1 registry.local" -Path /windows/system32/drivers/etc/hosts
# linux
echo $'\n127.0.0.1 registry.local' | sudo tee -a /etc/hosts
# 확인
ping registry.local
# 이미지 참조 부여
docker image tag image-gallery registry.local:5000/gallery/ui:v1
# 푸시(아래의 HTTP 따로 처리 이후에)
docker image push registry.local:5000/gallery/ui:v1
- 도커의 기본 설정은 HTTP를 사용할 수 없게 되어있기에, HTTPS를 사용하려면 로컬 컴퓨터의 레지스트리를 비보안 레지스트리 허용 목록에 추가해야만 이미지를 푸시하고 내려받을 수 있다. 도커의 모든 설정은 daemon.json이라는 설정파일에 들어가있는데 아래와 같이 추가되면 된다.
{
"insecure-registries": ["registry.local:5000"]
}
- 재시작 후 docker info로 레지스트리 관련 설정을 볼 수 있는데, 비보안 레지스트리 목록에 로컬 컴퓨터의 레지스트리가 포함됐는지 확인하면 완료다.
- 다만, 이러한 비보안 레지스트리는 제 3자가 엿볼 수 있으며, 푸시 과정에서 레이어가 유출될 수 있고 이미지를 받아올 때 위조된 가짜 이미지를 받아올 수도 있다.
- 실제 도메인 네임이나 IP주소를 알려주면 로컬 네트워크 상의 다른 사람에게 이미지를 공유할 수 있다.
이미지 태그를 효율적으로 사용하기
- [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
docker image tag image-gallery registry.local:5000/gallery/ui:2.1
docker image tag image-gallery registry.local:5000/gallery/ui:2.1.106
공식 이미지에서 골든 이미지로 전환하기
- 도커 허브 등의 레지스트리에 제공되는 이미지로 멀웨어를 배포할 수 있기에 검증된 퍼블리셔와 공식 이미지 제도를 이용해 이를 방지한다. 퍼블리셔는 MS, Oracle, IBM같은 신뢰가능한 기업을 의미하며, 공식 이미지는 오픈 코드를 github에서 dockerfile스크립트를 직접 볼 수 있다. 대부분 이러한 공식 이미지를 기반으로 이미지를 빌드하는데 linux를 사용하는 것 처럼 자신이 이미지에 대해 더 많은 통제권한을 얻기 위해 기반이미지(FROM, COPY, RUN 등이 정의된)를 다른 이미지로 전환할 수 있다. 이를 골든 이미지라고 한다.
docker image build -t golden/dotnetcore-sdk:3.0
docker image build -t golden/aspnet-core:3.0
FROM gtolden/dotnetcore-sdk:3.0 AS builder
COPY . .
RUN dotnet publish -o /out/app app.csproj
FROM golden/aspnet-core:3.0
COPY --from=builder /out /app
CMD ["dotnet", "/app/app.dll"]
- 똑같이 멀티 스테이지 빌드 구조이지만, 기반 이미지가 직접 만든 이미지하는 차이가 있고 골든이미지의 업데이트 주기를 마음대로 정할 수 있다.