Programming-[Infra]/Docker

도커 교과서(엘튼 스톤맨, 심효섭) - 4. 레지스트리, 공식 이미지와 골든 이미지

컴퓨터 탐험가 찰리 2023. 3. 13. 21:08
728x90
반응형

1. 레지스트리 개념 및 구성

 

레지스트리는 도커 이미지를 공유하는 서버이다. 도커의 기본 레지스트리는 도커 허브이며, 가장 유명한 곳이다. 도커 이미지의 구성은 아래와 같은데, 이 정보를 통해 레지스트리에서 이미지들을 다운로드 받을 수 있다.

 

docker.io/image-company/practice:latest

 

  • docker.io : 레지스트리의 도메인. 기본값은 도커 허브의 주소인 docker.io
  • image-company: 이미지 작성자의 계정 이름. 개인 또는 단체 이름이다.
  • practice: 이미지 레포지토리 이름. 일반적으로 애플리케이션의 이름에 해당하며 여러 버전을 가질 수 있다.
  • latest: 이미지의 태그로 버전을 나타낸다. 기본값이 latest이다.

 

2. 도커 허브에 이미지 푸시해보기

 

로그인

이미지 푸시를 위해서는 로그인이 필요하다. 도커 허브 계정 이름을 터미널의 환경 변수로 지정한다.

#윈도우 Powershell
$dockerId="{계정이름}"

# 리눅스 or mac의 bashShell
export dockerId="{계정이름}"

 

나의 경우 이메일로 된 주소의 뒷부분까지 입력하니 로그인이 에러가 발생했다. @gmail.com 앞의 id값만 지정해줘야한다. 그리고 확인을 위해 mac의 터미널에서 'echo $dockerId'를 쳤더니환경 변수 값이 제대로 저장된 것을 확인할 수 있었다.

 

로그인을 위해서는 아래 명령어를 입력 후 비밀번호를 입력해주면 된다.

docker login --username $dockerId

 

 

이미지 푸시

이미지 푸시를 위해서 앞선 장에서 만들어둔 image-gallery 이미지에 계정 정보 및 태그 정보를 부여한다.

 

docker image tag image-gallery $dockerId/image-gallery:v1

 

확인 명령어는 다음과 같다.

docker image ls --filter reference=image-gallery --filter reference='*/image-gallery'

 

기본 image-gallery 이미지와 계정이름/image-gallery라는 이름의 이미지가 2개 출력된다. 논리적으로는 둘 다 26.2MB이나, 물리적으로는 같은 이미지 레이어를 공유한다.

 

다음은 이미지 푸시를 위한 명령어이다.

 

docker image push $dockerId/image-gallery:v1

 

확인은 다음과 같이 echo 명령어를 통해 url을 터미널상에서 출력하고 url에 접속해서 할 수 있다. cmd | Ctrl + click 으로 바로 접속이 가능하다.

echo "https://hub.docker.com/r/$dockerId/image-gallery/tags"

 

 

 

3.  로컬로 레지스트리 운영하기

 

로컬 네트워크에 레지스트리를 만들고 소규모(로컬) 네트워크 자체에서 레지스트리를 운영할 수도 있다. 이럴 경우 내부망을 사용하기 때문에 인터넷 회선을 거치지 않을 수 있고, 도커 허브 같은 레지스트리가 다운되었을 때도 사용할 수 있는 등의 장점이 있다.

 

도커 레지스트리 서버 만들기

docker container run -d -p 5000:5000 --restart always diamol/registry
  • 저자가 제공하는 레지스트리용 이미지가 diamol/registry 이다.
  • --restart 플래그는 도커 재시작 시 해당 컨테이너도 자동으로 재시작 되게 해준다.

 

해당 레지스트리에 registry.local 이라는 이름을 부여한다.

# 윈도우
Add-Content -Value "127.0.0.1 registry.local" -Path /windows/system32/drivers/etc/hosts

# 리눅스 or macOS
echo $'\n127.0.0.1 registry.local' | sudo tee -a /etc/hosts

 

ping으로 정상적으로 생성됐는지 확인할 수 있다.

 

ping registry.local

 

이제 앞서 생성했던 3개의 이미지에 레지스트리 이름(도메인 네임)과 함께 이미지 참조를 부여할 수 있다.

 

docker image ls로 확인

  • image-of-the-day : Java API
  • access-log: Node.js API
  • image-gallery: Go 애플리케이션

 

docker image tag image-of-the-day registry.local:5000/gallery/ui:v1

docker image tag access-log registry.local:5000/gallery/api:v1

docker image tag image-gallery registry.local:5000/gallery/logs:v1

 

비보안 레지스트리 사용 설정

저자가 제공한 이 레지스트리 컨테이너는 이미지 푸시/풀을 위해 HTTP를 사용한다. 도커 기본 설정이 보안 프로토콜만 허용하므로 로컬 컴퓨터의 레지스트리를 비보안 레지스트리 허용 목록에 추가해줘야 한다.

 

도커 엔진의 모든 설정은 daemon.json 이라는 이름의 설정 파일에 들어있다. 이 파일은 윈도는 C:\Program Data\docker\config, 리눅스에서는 /etc/docker에 위치한다.

 

docker desktop -> 설정 -> Docker Engine에서 기존 내용을 놔둔채 아래 내용을 추가한다. 이후 apply & restart 한다.

"insecure-registries" : ["registry.local:5000"]

 

다음 명령어로 설정이 잘 적용되었는지 확인한다.

docker info

Registry: 도커의 기본 레지스트리. 도커 허브의 주소이다. 변경할 수 없다.

Insecure Registries에 registry.local:5000이 잘 등록된 것을 볼 수 있다.

 

 

 

이제 로컬 레지스트리에 이미지를 푸시할 수 있다.

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

 

 

4. 공식 이미지와 골든 이미지

 

도커 허브에는 누구나 이미지를 푸시할 수 있고 누구나 다운받을 수 있다. 이에 따른 위험을 방지하기 위해서 검증된 퍼블리셔(verified publisher)공식 이미지(official image) 방식을 사용한다.

 

마이크로소프트, 오라클 같은 신뢰할 수 있는 큰 기업을 검증된 퍼블리셔라고 지정한다. 이와 다르게 오픈 소스 소프트웨어 팀과 도커가 함께 이미지를 관리하는 방식을 공식 이미지라고 한다. 다만 공식 이미지를 갖고 다른 애플리케이션을 개발하는 사람은 인증서나 환경 설정값 등의 추가 설정이 필요할 수 있다. 공식 이미지를 기반 이미지로 삼아서 개발에 필요한 다른 설정을 추가한 이미지를 골든 이미지(golden image)라고 한다.

 

예를 들어 자바 개발 도구인 openJDK의 공식 이미지가 있다면, 이를 기반으로해서 일부 설정을 바꾼 것이 골든 이미지가 될 것이다. 그리고 특정 조직에서는 이 골든 이미지를 기반으로 해서 다양한 애플리케이션들을 개발할 수 있게 된다.

 

 

 

도커 레지스트리 API

 

도커에서 제공하는 도커 레지스트리 API가 있다. 이를 이용하면 여러 태그를 갖는 이미지를 한 번에 레지스트리에 푸시하는 등 다양한 기능들을 구현할 수 있다.

https://docs.docker.com/registry/spec/api/

728x90
반응형