공부/docker

도커 교과서 ch05 (도커 레지스트리)

KidAnt 2023. 12. 19. 14:31

실습환경 초기화 명령
docker container rm -f $(docker container ls -aq)

이미지 차지 디스크 용량 회수 명령
docker image rm -f $(docker image ls -f reference='diamol/*' -q)

  • 도커 플랫폼은 SW 배포기능을 내장하고 있다. 
    • 로컬에 없더라도 도커 레지스트리에서 자동으로 내려받아 준다. -> 대부분 도커 허브라는 레지스트리에서  받아진다. (디폴트)
  • 도커 이미지 구조
    • (도메인)/(계정)/(image name):(tag)
docker.io/diamol/golang:latest
  • 구조 설명
    • docker.io : 이미지가 저장된 레지스트리 도메인(default는 도커 허브)
    • diamol : 작성자의 계정 이름(개인 혹은 단체)
    • golang : 이미지 리포지터리 이름(보통 어플리케이션 이름, 하나의 리포지터리는 여러 버전의 이미지를 담을 수 있다)
    • latest : 이미지 태그(어플리케이션의 버전 혹은 변종, default는 latest) -> 따로 지정하지 않아도 도커가 정해진 기본값을 사용한다.
  • 도커 레지스토리는 큰 기업의 경우 사내 내트워크나 전용 클라우드 환경에서 별도로 꾸미는 경우가 많다.

도커 허브에 빌드 이미지 푸시하기

#도커 아이디 환경변수 선언
export dockerId="도커 허브 계정"

#도커 로그인
user@DESKTOP-KU8L7UV:~$ sudo docker login --username $dockerId
[sudo] password for user:
Password:
Login Succeeded

#이미지 참조 구성
 sudo docker image tag image-gllery $dockerId/image-gallery:v1

#참조 목록 확인(타겟 지정)
user@DESKTOP-KU8L7UV:~/080258/ch04/exercises/image-gallery$ sudo docker image ls --filter reference=image-gllery
 --filter reference='*/image-gallery'
REPOSITORY             TAG       IMAGE ID       CREATED         SIZE
(dockerId)/image-gallery   v1        28777ea04ecd   3 minutes ago   27.1MB
image-gllery           latest    28777ea04ecd   3 minutes ago   27.1MB


#푸쉬하기
user@DESKTOP-KU8L7UV:~/080258/ch04/exercises/image-gallery$ sudo docker image push $dockerId/image-gallery:v1
The push refers to repository [docker.io/kidant/image-gallery]
46e7cbabc8ac: Pushed
9020e48cee8c: Pushed
3e13bec545cd: Pushed
2c797558a2a6: Pushed
f87269b94a71: Mounted from diamol/base
89ae5c4ee501: Mounted from diamol/base
v1: digest: sha256:d5e9f50449ff1624828d48c7d25d692d628ea8bc82c1467015a8b499c0fca4f6 size: 1573

개인 도커 레지스트리 운영하기

#도커 레지스트리 시행

user@DESKTOP-KU8L7UV:~/080258/ch04/exercises/image-gallery$ sudo docker container run -d -p 5000:5000 --restart
always diamol/registry
Unable to find image 'diamol/registry:latest' locally
latest: Pulling from diamol/registry
(중략)
Status: Downloaded newer image for diamol/registry:latest
8430757afa3968a52efedf95cfe92f13df9084fe28a6ec6009a22ab6a570bb55

#--restart 플래그를 부여하면 도커를 재시작했을때 -> 해당 컨테이너도 자동으로 재시작

echo $'\n127.0.0.1 registry.local' | sudo tee -a /etc/hosts
c/hosts

127.0.0.1 registry.local
#hosts

#연결확인
user@DESKTOP-KU8L7UV:~/080258/ch04/exercises/image-gallery$ ping registry.local
PING registry.local (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.027 ms

#새로만든 iregistry.loacl:5000 레지스토리 도메인 네임 추가해 image-gallery 이미지 참조 부여

user@DESKTOP-KU8L7UV:~/080258/ch04/exercises/image-gallery$ sudo docker image tag image-gllery registry.local:50
00/gallery/ui:v1

#같은 방법으로 api랑 log도 image-gllery 아래에 두기
user@DESKTOP-KU8L7UV:~/080258/ch04/exercises/image-gallery$ sudo docker image tag image-gllery registry.local:5000/gallery/api:v1
user@DESKTOP-KU8L7UV:~/080258/ch04/exercises/image-gallery$ sudo docker image tag image-gllery registry.local:5000/gallery/logs:v1

#푸쉬하기

docker image push registry.local:5000/gallery/ui:vi

  • 태그를 효율적으로 이용하기 위해선 기본적으로 [major].[minor].[patch]형태의 소수점을 따르는게 좋다.

    • patch: 버그수정 뿐이고 기능은 지난버전과 같을 때 변동

    • minor: 추가된 기능은 있으되 기존 기능은 모두 유지 시 변동

    • major: 완전히 다른 기능을 가졌을때 변동

  • 도커 허브는 검증된 퍼블리셔(verified publisher)와 공식 이미지(official image)제도를 통해 레지스트리로 인한 피해를 방지한다.
    • 검증된 퍼블리셔 예) MS, Oracle, IBM ...
    • 공식이미지 예) 오픈소스 스프트웨어
  • 골든 이미지(golden image): 공식 이미지를 기반 이미지로 삼아 인증서나 환경 설정 값 등 자신이 필요한 설정을 추가한 것
    (도커 허브의 기업 리포지터리나 자체 리포지터리에서 관리된다.)

이미지 빌드

user@DESKTOP-KU8L7UV:~$ cd 080258/ch05/exercises/dotnet-sdk/

user@DESKTOP-KU8L7UV:~/080258/ch05/exercises/dotnet-sdk$ sudo docker image build -t golden/dotnetcore-sdk:3.0 .
[sudo] password for user:
[+] Building 50.7s (8/8) FINISHED                                                                docker:default
 => [internal] load build definition from Dockerfile                                                       0.0s
 ...(중략)
 => [2/3] WORKDIR src                                                                                      0.4s
 => [3/3] COPY global.json .                                                                               0.0s
 => exporting to image                                                                                     0.0s
 => => exporting layers                                                                                    0.0s
 => => naming to docker.io/golden/dotnetcore-sdk:3.0

user@DESKTOP-KU8L7UV:~$ cd 080258/ch05/exercises/aspnet-runtime/

user@DESKTOP-KU8L7UV:~/080258/ch05/exercises/aspnet-runtime$ sudo docker image build -t golden/aspnet-core:3.0 .
[sudo] password for user:
[+] Building 19.3s (5/5) FINISHED                                                                docker:default
 => [internal] load build definition from Dockerfile                                                       0.0s
...(중략)
 => => naming to docker.io/golden/aspnet-core:3.0

#골든이미지를 사용한 닷넷 코어 어플리케이션 멀티 스테이지 빌드 스크립트

cd 080258/ch05/exercises/dotnet-sdk/

vi Dockerfile
FROM mcr.microsoft.com/dotnet/core/sdk:3.0.100

LABEL framework="dotnet"
LABEL version="3.0"
LABEL description=".NET Core 3.0 SDK"
LABEL owner="golden-images@sixeyed.com"

WORKDIR src
COPY global.json .
  • 일반적으로 여느 멀티 스테이지 빌드 스크립트와 같은 구조체
  • 기반 이미지를 우리가 만들었다는 차이점이 있으며 이로 인해 업데이트 주기를 우리가 마음대로 선택가능하다.
    • 지속적 통합 파이프리인으로 스크립트를 확인하는 방법으로 골든 이미지 사용하는 것도 좋은 방책