본문 바로가기

IT 엔지니어/CLOUD

Docker Registry

DOCKER LOCAL REGISTRY

  • REGISTRY (= 저장소)
    • Docker Image를 저장하고 배포하는 서버 / 저장소
    • 만든 Image를 올려두고, 필요할 때 다른 서버나 개발 환경에서 끌어다(pull) 수 있게 해주는 저장소,
    • local Regisrty(저장소)에 등록시  pull 사용
    • PUSH
      • Image를 만들고 Registry에 업로드
    • PULL
      • Registry에서 Image 다운로드

  • LOCAL REGISTRY 이용도
    • Loacl 환경에서 직접 Registry Container를 띄우면 개인용 Docker Hub처럼 사용 가능
    • 인터넷 없이 Imahe 저장 / 배포 가능
    • 회사 내부망에서만 도는 앱 배포 용이
    • 보안상 외부 Regisrty 사용이 불가능할 때
    • 빠른 Test 및 캐시 목적

DOCKER LOCAL REGISRTY 실습

  • Docker Image를 내가 만든 Local Server에 올리고, 다시 그 Image를 다운로드해서 Container 실행까지 해보는 것
  • Docker를 혼자 사용하는 게 아니라, 공유하고 배포

[ IMAGE 검색 / 확인 ]

Docker Hub에서 registry 관련 Image를 검색

# docker search registry

[ IMAGE 다운로드 ]

공식 Docker Registry Image를 다운로드, 이 Image를 기반으로 나만의 Imahe 저장소 생성 가능

# docker image pull registry

[ 포트 확인 ]

Registry Image가 어떤 포트를 사용하는지 확인 (보통 5000/tcp 포트를 사용)

# docker image inspect --format='{{.Config.ExposedPorts}}' registry:latest

[ 레지스트리 CONTAINER 실행 ]

내 PC에서 Registry Container 실행, -p 5000:5000 옵션을 통해 외부에서도 5000번 포트로 접속할 수 있게 오픈

# docker container run -d --name local-registry -p 5000:5000 registry:latest

[ 업로드할 Image 다운로드 ]

Docker Hub에서 'hello-world' Image 다운로드

# docker image pull hello-world

[ 다운로드 받은 Image 태깅 ]

Docker Regisrty는 <Domain:포트/Image명> 형식만 인식하기 때문에 hello-world에 'localhost:5000/hello-wolrd' 이름 붙임

# docker image tag hello-world localhost:5000/hello-world

[ 'localhost:5000/hello-world' Image 업로드 ]

앞에서 태깅 한 Image를 내 Local Regisrty(localhost:5000)로 업로드 (내 컴퓨터에서 만든 Image 저장소에 넣음)

# docker image push localhost:5000/hello-world:latest

 

 직접 만든 이미지를 local registery에 등록할 때 동일하게 등록되지 않은 경우

도커 허브 io만 허용하기에 발생한 오류

 

 

vi /etc/init.d/docker 추가 입력
vi /etc/docker/daemon.json 입력

 

 

 

 

 

curl -X GET http://localhost:5000/v2/_catalog/

 

 

 

curl -X GET http://localhost:5000/v2/_catalog/myweb/tags/list

 

 

 

 

5,. 등록 확인

로컬 레지스트리 등록한 이미지 pull 후 실행
docker pull localhost:5000/hello-world
docker run -d --name test localgist:5000/hellow-orld

curl <http://localhost:5000/v2/_catalog>

docker run -d --name -p 5000:5000 registry

docker exec -it --name registry /bin/sh

 

 

6. 삭제 절차

# 1. 레지스트리 삭제 가능 옵션 입력 후 실행
docker stop registry && docker rm registry

docker run -d -p 5000:5000 --name registry -e REGISTRY_STORAGE_DELETE_ENABLED=true registry:2

# 2. 해당 이미지 digest 확인
curl -s -X GET <http://localhost:5000/v2/hello-world/manifests/latest> \\
  -H "Accept: application/vnd.docker.distribution.manifest.v2+json"

결과에서 Docker-Content-Digest 또는 "config": { "digest": ... } 값 확인 

digest : sha256:abc123...

# 3. 삭제 요청
curl -X DELETE <http://localhost:5000/v2/hello-world/manifests/sha256:abc123>...

# 4. 가비지 수집
docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml

 

 

 

[ 업로드 후 LOCAL IMAGE 삭제 ]

 

# docker image rm localhost:5000/hello-world:latest

[ 기존 Image 삭제 후 다시 다운로드 ]

만들어둔 Local Regisrty에서 'hello-world' Image를 다시 가져와서 Container를 실행

 

# docker container run --name myregistry localhost:5000/hello-world:latest

Regisrty에서 다운로드 실패

삭제 후 재 다운로드(실행) 성공

[ REGISTRY CONTAINER 진입 ]

  • /var/lib/regisrty = Docker Regisrty Container가 Image들을 저장하는 곳
  • Regisrty Container 안으로 진입해서 실제로 Image가 저장된 디렉터리 구조 탐색, hello-world 출력이 된다면 Image가 정상적으로 Regisrty에 업로드되어 저장되었고 그 구조를 Docker가 이해할 수 있게 구성되었다는 것을 의미함

# docker container exec -it local-registry /bin/sh


DOCKER COMPOSE

[ DOCKER COMPOSE ]

  • 여러 개의 Container를 관리하는 도구
    • 한 번에 정의하고, 실행, 중지, 관리
  • 하나하나 명령어로 실행하지 않고 docker-compose.yml 설정 파일 하나로 여러 서비스를 자동으로 띄워주는 도구

[ DOCKER COMPOSE 명령어 ]

docker-compose up
Container 생성 및 시작
docker-compose.yml 기반으로 Container를 실행 (-d 옵션으로 백그라운드 실행 가능)
docker-compose down
Container 및 Network 삭제
실행 중인 Container들을 중지하고 관련 리소스를 정리
docker-compose start
중지된 Container 시작
이미 생성된 Container를 재시작할 때 사용
docker-compose stop
Container 중지
실행 중인 Container를 정지시키지만 삭제하지는 않음
docker-compose restart
Container 재시작
stop → start 과정을 한 번에 처리
docker-compose ps
Container 목록 출력
현재 실행 중인 Container 상태를 확인
docker-compose logs
로그 출력
서비스의 stdout 로그를 확인 (-f 옵션으로 실시간 로그도 가능)
docker-compose rm
Container 삭제
Container를 완전히 제거할 때 사용 (중지된 컨테이너만 삭제 가능)
docker-compose pause
일시 정지
Container의 프로세스를 일시적으로 멈춤
docker-compose unpause
일시 정지 해제
pause 상태였던 Container를 다시 실행
docker-compose kill
강제 종료
SIGKILL 신호를 보내 Container를 즉시 종료
docker-compose port
포트 Mapping 정보 출력
Container가 어떤 호스트 포트에 매핑되어 있는지 확인
docker-compose config
구성 내용 확인
.yml 파일의 유효성을 검사하고 전체 구성 정보를 출력

[ Version 확인 ]

  • Docker Version
# docker system info
  • COMPOSE VERSION
# docker compose version

[ DOCKER COMPOSE 설치 ]

Docker Compose 실행 파일을 /usr/local/bin에 설치

# curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

[ 실행 권한 부여 ]

Linux에서는 다운로드한 바이너리 파일을 실행하려면 권한 부여가 필요, 권한 부여 후 버전 확인

# chmod u+x /usr/local/bin/docker-compose

[ DOCKER-COMPOSE 자동완성 기능 설치 ]

[ DOCKER-COMPOSE.YML 파일 생성 ]

  • YAML 들여쓰기 주의
    • YAML은 들여 쓰기로 계층 구조를 표현하는 문법이기 때문에, 하나만 잘못돼도 전혀 다른 의미로 해석되거나 문법 오류가 뜬다 틀 아래 복붙해서 그대로 사용하기
    • YAML = 공백 2칸 들여 쓰기가 표준 (Tab키 X)

# vi docker-compose.yml

version: '3.3'

services:

webserver:

build:

context: .

ports:

- "80:80"

depends_on:

- redis

 

redis:

image: redis:4.0

[ DOCKERFILE 생성 ]

Python 기반 웹 애플리케이션 Container 생성하기 위한 설정, 파일 생성 (Python 패키지 이름 입력해야 함, 빈 파일이면 실행 X)

# vi Dockerfile

# echo "redis" > requirements.txt

[ DOCKER COMPOSE 실행 ]

  • 여러 Container를 정의한 docker-compose.yml 파일 실행

여러 번 Error 떠서 계속 수정했다. YAML은 들여 쓰기로 계층 구조를 표현하는 문법이기 때문에, 하나만 잘못돼도 전혀 다른 의미로 해석되거나 문법 오류가 뜬다. Tab키로 입력했더니 계속 오류 뜬 것

# docker-compose up -d

[ DOCKER COMPOSE 삭제 ]

# docker-compose down

[ DOCKER-COMPOSE.YML 구성 요소 ]

version
Compose 파일 버전
services
실행할 Container 목록
networks
서비스 간 통신용 네트워크 정의
volumes
Container ↔ Host 파일 공유
configs, secrets
보안 설정
name
프로젝트 이름 정의

[ 자동으로 인식되는 파일명 ]

  • docker-compose.yml <多>
  • docker-compose.yaml
  • compose.yml
  • compose.yaml

[ IMAGE 사용 & BUILD ]

  • Image 직접 지정

Docker Hub에서 ubuntu Image를 가져와서 Container 실행

  • Image 직접 Build

현재 디렉터리의 Dockerfile을 이용해 Image를 Build 해서 실행


[ DOCKER 명령어를 이용한 CONTAINER 구동 ]

# docker run --name some-nginx -v /some/content :/usr/share/nginx/html:ro -d nginx

[ # docker-compose.yml 파일로 생성 ]

version: '3.3'

services:

webserver:

image: nginx

volumes:

- "/some/content:/usr/share/nginx/html:ro"

[ # docker-compose.yml 파일로 생성 2 ]

version: '3.3'

services:

webserver:

container_name: some-nginx

image: nginx

volumes:

- "/some/content:/usr/share/nginx/html:ro"

[ PORT : DOCKER RUN ]

# docker run --name some-nginx -d -p 8080:80 some-content-nginx

[ PORT : DOCKER-COMPOSE.YML 1 ]

version: '3.3'

services:

webserver:

container_name: seome-nginx

image: some-content-nginx

ports:

- "8080:80"

[ PORT : DOCKER-COMPOSE.YML 2 ]

version: '3.3'

services:

webserver:

container_name: seome-nginx

image: some-content-nginx

ports:

- ["8080:80"]

  • HTML 정적 콘텐츠를 nginx에서 서빙 하고 싶을 때 사용
    • -v: 볼륨 마운트
      • 호스트 디렉토리 /var/www/html → 컨테이너 /usr/share/nginx/html에 읽기 전용(:ro)으로 연결

# docker run --name mynginx -v /var/www/html:/usr/share/nginx/html:ro -d nginx

 



'IT 엔지니어 > CLOUD' 카테고리의 다른 글

K8S -kubespray  (0) 2025.05.19
Docker yml  (1) 2025.05.18
Docker image build  (0) 2025.05.16
Docker  (1) 2025.05.15
Docker image  (0) 2025.05.14