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만 허용하기에 발생한 오류




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 자동완성 기능 설치 ]
# curl -SL https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/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)으로 연결
- -v: 볼륨 마운트
# 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 |