Docker 환경을 사용하다 보면, image 를 저장하고, 배포해야하는 일을 경험하게 됩니다. 외부에 공개된 public service 는 public repository 를 이용하면 되지만, 경우에 따라 회사 및 조직의 정책에 따라서 외부 리소스에 접근을 제한하기도 합니다. 이러할때 필요한 서비스가 proxy | caching service 가 필요합니다.
이번에는 nexus 를 이용해 proxy 구성하는 방법을 기록해 둡니다.

내부 망에서 모든 서버에 인터넷을 허용할수 있는 환경이라면 해당 설정은 불필요할지도 모른다. 하지만, caching 에 대한 의미는 있는데, registry 서버의 장애가 발생했을 때도, nexus 에 caching 되어 있는 이미지라면, 사용이 가능하다. 하지만, 그럴 일은 매우 희박하기 때문에, 굳이 인터넷을 사용할수 있는 환경에서는 이 설정은 불필요한것으로 판된 됩니다.
Nexus 에 proxy 구성 추가
Administration > Repositories 에서 Create repository 로 저장소를 추가 합니다.

Recipe 에서 docker (proxy) 를 선택합니다.

Name 과 Proxy > Remote storage URL 을 입력합니다.
Use the Nexus truststore 를 check 하고, Docker Index 는 Use Docker Hub 를 선택해 줍니다.
추가 설정이 필요하다면 추가 설정후 Create repository를 합니다.

이번에는 Docker Group repository 생성이 필요합니다. 이전과 같이 Create repository 에서 docker (group) 선택합니다.

Name 을 입력하고, Repository Connectors 에서 원한는 방식에 port 를 할당 합니다. Docker registry 는 registry 에서 사용되는 API 가 존재하기 때문에, 기존의 nexus port 와는 독립적으로 구성 되어야 합니다.
그리고, 로그인 없이 pull 을 허용하기위해 Allow anonymous docker pull 을 check 해 줍니다.
이전 단계에서 생성한 repository 를 Group member 로 추가한후 Create repository 로 group repository 생성을 완료 합니다.

Login 없이 pull 을 허용하기 위해서, Security > Realms 설정이 필요합니다. 해당 메뉴에서 Docker Bearer Token Realm 항목을 active 후 저장해 줍니다.

이렇게 하면 nexus 에서의 설정은 완료 되었습니다. http 를 이용한 방식이기 때문에, 이를 이용하기 위해서는 docker pull 할 서버에서 /etc/docker/daemon.json 에 해당 서버의 정보를 추가해 줘야 합니다. 해당 파일이 존재하지 않는다면 새로 생성해서 추가하면 됩니다. json 포멧으로 작성되어야 합니다.
{
"insecure-registries": ["{NEXUS SERVER IP ADDRESS}:{PORT}"]
}
이와 같이 수정후 docker daemon 을 재시작해 줍니다. Test machine 은 centos 로 아래 명령어를 통해 재시작 되었습니다.
sudo systemctl restart docker.service
이제 서버에서 nexus 를 통해 docker image 를 pull 해보면 됩니다. 아래와 같이 성공적으로 이미지는 pull 되었고, 해당 이미지는 nexus 에 caching 된것 또한 확인이 가능 합니다.


docker image 는 정상적으로 pull 되었지만, repository 가 nexus 의 주소로 tag 되어 있는것을 확인할 수 있습니다. 이는 docker repository 의 구조 때문인데, 필요시 re-tagging 을 통해서 필요한 repository 로 변경하여 사용하면 됩니다.
대부분의 경우에는 필요하지 않을 수 있지만, 보안을 중요시 하는 환경에서는 필요한 구성이 될수 있습니다.