Docker Registry를 이용해 사설 private image서버 설정
개발 서버에 Docker를 설치하고, Jenkins에서 Docker를 제어하기 위해 Registry 설정이 필요하다는 지시를 받았습니다.
이를 통해 CI/CD 파이프라인을 구축하며, 구성시 예상 시나리오는 다음과 같습니다.
- 회사 GitHub에 프로젝트 파일과 Dockerfile 업로드
- Jenkins가 이를 가져와 Dockerfile을 이용해 이미지를 생성
- 생성된 이미지를 Registry에 등록
- Jenkins에서 원격으로 컨테이너를 제어
1) stop 기존 container (존재 시)
2) rm 기존 container (존재 시)
3) private registry 서버에서 pull image
4) 받은 image run container
오늘은 이 과정 중에서 Docker Registry가 무엇인지 간략하게 알아보고, 제가 한 설정을 정리하겠습니다.
+원격으로 서버 docker에 명령을 내리는 법까지 같이 정리!
Docker Registry란 무엇인가?
Docker Registry는 Docker 이미지를 저장하고 관리하는 중앙 저장소 역할을 합니다. 이를 통해 여러 개발 환경(개발, 스테이징, 프로덕션)에서 동일한 이미지를 공유할 수 있습니다. Registry는 크게 두 가지 형태로 나뉩니다:
- Public Registry: Docker Hub와 같은 공용 저장소로, 전 세계 개발자들이 이미지를 공유하고 사용할 수 있습니다.
- Private Registry: 조직 내부에서만 사용 가능한 비공개 저장소로, 보안과 데이터 관리를 강화할 수 있습니다.
Registry는 다음과 같은 이점을 제공합니다:
- 이미지 버전 관리
- 빠르고 효율적인 배포
- 중앙 집중식 관리
- Jenkins와 같은 CI/CD 도구와의 연동
registry를 이용하면 회사 내에서만 가용하는 image를 생성하고,
이 image를 올리고 내리고, 실행시키게끔 jenkins와 연동하면 배포를 좀 더 편리하게 구성할 수 있게 되겠죠?
서버 설정
1. Docker 설치
먼저 개발 서버에 Docker를 설치합니다. 설치 과정은 아래 링크를 참고했습니다:
# yum update
sudo yum update
sudo yum install -y yum-utils
# docker repo 추가
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 최신버전 docker 설치
sudo yum install docker-ce docker-ce-cli containerd.io -y
# 버전확인
docker -v
# 서비스 시작.
sudo systemctl start docker
2. Docker Registry 구성
Docker 이미지를 관리하기 위해 Private Registry를 설정합니다. 아래는 설정 과정입니다:
2.1. Registry Container 구성
# registry image 가져오기
sudo docker pull registry
# registry container run
sudo docker run -d --name dev_docker_registry -p 5000:5000 --restart=always \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
-e REGISTRY_HTTP_TLS_CERTIFICATE= \
-e REGISTRY_HTTP_TLS_KEY= \
registry:latest
2.2. Insecure Registry 옵션 설정
Private Registry는 기본적으로 보안 연결(HTTPS)을 요구합니다. 그러나 내부 테스트 환경에서는 Insecure Registry 설정을 통해 HTTP 연결을 허용할 수 있습니다. 이를 설정하는 방법은 다음과 같습니다.
# daemon.json 수정
sudo vi /etc/docker/daemon.json
# 아래내용을 추가
{
"insecure-registries": ["{private-registry}:5000"]
}
# 설정 확인
sudo docker info
참고로 Registry 호스트와 이미지를 전송하려는 클라이언트 서버 모두에 설정해야 합니다.
3. Registry 및 원격 테스트
설정을 완료한 후, Push와 Pull이 정상적으로 동작하는지 확인합니다:
3.1. 클라이언트에서 테스트
# 테스트 이미지를 Pull
docker pull hello-world
# 이미지를 태그하여 Registry에 Push
docker --tag {registry_host}:5000/hello-world:1.0 .
docker push {registry_host}:5000/hello-world:1.0
3.2. 원격 서버에서 테스트
# Registry에 pull 가능한 이미지 목록 확인
curl http://{registry_host}:5000/v2/_catalog
# Registry에서 이미지 Pull
docker pull {registry_host}:5000/hello-world:1.0
4. Docker-Client 설정 (원격 제어)
원격 서버에서 Docker를 제어하기 위해 Docker-Client 설정이 필요합니다.
아래는 참고 자료입니다:
docker.service 파일에 다음 내용을 추가합니다
# docker.service 파일 수정
sudo vi /usr/lib/systemd/system/docker.service
# 아래 내용으로 ExecStart 수정
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H 0.0.0.0:2375
4.1. 원격 서버에서 run
# 원격 서버에서 docker server로 명령
docker -H {registry_host}:2375 run {registry_host}:5000/hello-world:1.0
이번엔 Docker와 Registry 설정을 구성하고, 원격으로 명령어를 날리는 것을 정리했습니다.