-
nexus3 docker image 로 private docker repository 만들기docker 2022. 2. 14. 21:57반응형
docker 를 많이 사용하다보니 자연스럽게 개인용 private docker repository 의 필요가 생긴다. nexus3 를 이용하면 docker 환경 내에서 docker repository 를 정말 쉽게 만들 수 있다. 그 과정을 기록해 보려고 한다.
환경
- nexus3 는 docker 로 띄울 것이고, ssl 인증이 필요하기 때문에 nginx 가 이 역할을 맡도록 한다.
- nexus 와 nginx 는 모두 docker 컨테이너로 띄울 것이다.
- nexus 컨테이너의 이름은 nexus, nginx 컨테이너의 이름은 nginx 로 할 것이다.
- 도메인명: 이 글에서는 nexus 인터페이스는 my-test-nexus.com, 그리고 새로 만들 private repository 는 my-test-docker.com 라는 도메인명으로 접근한다고 가정하고 작업한다. (hosts 파일을 고쳐서 테스트한다.)
- 서버 정보
- OS: CentOS 7.9
- IP: 192.168.101.101
- Docker 20.10.12
- nginx 1.20.2 (https://hub.docker.com/_/nginx)
- 용도에 따라 라우팅을 한다. nexus 인터페이스를 위해서 my-test-nexus.com 으로 접근하면 nexus의 8081 로 연결하고, docker repository 를 위해 my-test-docker.com 으로 접근하면 nexus 의 8082 로 전달한다.
- nexus3 3.37.3 (https://hub.docker.com/r/sonatype/nexus3/)
- 8081 포트로 인터페이스를 담당하고, 8082 로 docker repository 를 열 것이다.
- ssl: repository 에 대해서는 nginx 에서 ssl 인증 처리를 해 줄 것이다.
- 이름은 test-chained.crt, test.key (repository 를 위한 것이기 때문에 my-docker.com 으로 도메인 이름이 들어가 있어햐 한다.)
- 발급 방법은 아래 포스트를 참고한다.
- openssl 로 self-signed certificate 만들기(추가적인 작업 필요): https://bitgadak.tistory.com/5
- certbot 으로 let's encrypt 인증서 발급받기: https://bitgadak.tistory.com/6
아래와 같은 구조가 될 것이다.
1. nexus 실행
1.1 nexus 컨테이너 실행
도커 이미지가 유지되어야 하기 때문에 도커 볼륨이 필요하다. nexus 라는 이름으로 만든다.
$ docker volume create nexus
nexus3 3.37.3 이미지로 컨테이너를 만든다.
$ docker run -d --name nexus -v nexus:/nexus-data -p 8081-8082:8081-8082 sonatype/nexus3:3.37.3
- 컨테이너 이름은 nexus
- 위에서 만든 볼륨을 연결한다.
- nexus 의 기본 포트는 8081 이다. 추가로 8082 포트를 private docker 의 포트로 사용하도록 한다.
- 만약 nexus 포트를 외부에 노출하고 싶지 않다면 -p 옵션은 없어도 된다.
1.2 nexus 설정
nexus 컨테이너가 떴는지 8081 로 접근하여 확인해 보자. 조금 시간이 걸린다.
이하 hosts 를 수정하고 my-test-nexus.com 로 진행한다. 로그인을 해 본다.
최초의 임시 비밀번호는 /nexus-data/admin.password 에 적혀있다.
이걸로 로그인을 할 수 있다. 로그인을 하고 next 를 눌러 진행하다보면 새로운 패스워드를 요구한다.
새로운 패스워드를 넣고 진행하자. Anonymous Access 에 대해서는 기본값(enable)으로 둔다.
완료되었다.
2. Docker repository 설정
nexus 에서 docker repository 관련하여 직접 repository 를 만들 수도 있고, proxy 를 만들수도 있다. 그런데, 굳이 proxy 가 필요할 것 같진 않아서 직접 repository 를 만드는 것으로 진행한다.
(repository 와 proxy 를 모두 만들고 group 으로 묶는 방법도 있긴 한데, 무료 라이센스에서는 지원하지 않는다.)
2.1 Blob Stores
먼저 image 를 저장할 blob stores 를 만든다.
Type 은 File (s3 는 클라우드 저장소) 으로 정하고 이름은 docker-hosted 로 정한다.
enable soft quota 옵션이 있는데, 체크하면 blob 를 모니터링 하다가 용량 초과시 알림을 주는 것 같다. 필요없는 것 같아서 체크하지 않는다.
설정에 대한 자세한 설명은 여기서 참고한다: Configuring Blob Stores
2.2 Repository
repository 를 만든다.
docker (hosted) 를 선택한다.
필요한 정보를 입력하고 저장소를 만든다.
정보는 다음과 같다.
- Name: docker-hosted
- HTTP: 8082 포트. ssl 은 nginx 에서 처리할 것이기 때문에 여기서는 HTTP 로 열어준다.
- Blob store: docker-hosted (위에서 만든 blob store 이다.)
- 나머지는 기본값으로 설정한다.
repository 를 만들었다. 그러나 아직은 ssl 설정이 안되어서 docker api 로 접근은 안된다.
3. nginx 설정
ssl 인증을 해 주고, 도메인 별 라우팅을 해 주기 위해 nginx 설정을 한다. 여기서는 docker 로 띄우지만, 호스트에 설치하는 것도 상관없다.
nginx docker image 사용에 대해서는 docker hub 를 참고하였다: https://hub.docker.com/_/nginx
여기서 nginx 설정을 하는 방법을 여러 가지 소개하고 있는데, 그 중에 하나는 컨테이너 내부의 설정파일을 직접 수정 추가 하는 것이다.
1.20.2 기준으로 Docker run 을 통해 컨테이너를 시작하면 nginx 가 시작하면서, /etc/nginx/nginx.conf 를 불러온다.
여기서 /etc/nginx/nginx.conf 를 직접 수정해도 되지만, 기본 nginx.conf 파일에서는 include /etc/nginx/conf.d/*.conf; 라는 항목이 있어서 /etc/nginx/conf.d 디렉토리의 *.conf 의 설정 정보들을 불러온다.
그래서 해당 디렉토리에 필요한 설정파일을 *.conf 라는 이름으로 추가하는 방식을 통해 설정할 수 있다.
컨테이너 실행시 명령어로 -v 옵션을 주어 추가하는 방법도 있겠지만, Dockerfile 을 통해 필요한 파일이 들어가 있는 새로운 이미지를 만드는 것이 깔끔할 것 같아서 그렇게 실행하려고 한다.
3.1 nexus.conf
nexus 컨테이너는 두 개의 포트가 열려있다. 8081 은 nexus 인터페이스용 포트이고, 8082 는 docker repository 로 사용하려고 연 포트이다.
my-test-nexus.com 으로 들어오면 8081 로, my-test-docker.com 로 들어오면 8082 로 전달하도록 한다.
세부적인 설정 제외하고 간단하게 만들면 다음과 같다.
upstream nexus { server nexus:8081; # docker 로 띄운 nexus 컨테이너 이름 keepalive 8; } upstream nexus-docker-hosted { server nexus:8082; # docker 로 띄운 nexus 컨테이너 이름 keepalive 8; } server { listen 80; server_name my-test-nexus.com; location / { proxy_pass http://nexus; } } server { listen 443 ssl; server_name my-test-docker.com; ssl_certificate /etc/nginx/test-chained.crt; ssl_certificate_key /etc/nginx/test.key; location / { proxy_pass http://nexus-docker-hosted; client_max_body_size 2048m; # docker image 업로드시 필요한 업로드 용량 제한 늘리기 } }
기타 nginx 설정이 필요하면 추가하도록 하자.
3.2 Dockerfile 및 이미지 생성
ssl 에 대한 파일과 위에서 만든 nexus.conf 설정파일을 넣어 새로운 이미지를 만든다.
디렉토리 구조는 아래와 같다.
/jenkins +- Dockerfile +- test-chained.crt +- test.key +- conf.d/ +- nexus.conf
Dockerfile 은 다음과 같다.
FROM nginx:1.20.2 COPY *.crt /etc/nginx/ COPY *.key /etc/nginx/ COPY conf.d/ /etc/nginx/conf.d/
이미지를 만든다.
docker build -t my-nginx:0.1
3.3 nginx 컨테이너 실행
새로 만든 이미지로 컨테이너를 실행한다. 이 때, nginx 컨테이너 내부에서 nexus 컨테이너를 호출할 수 있어야 하기 때문에 link 옵션을 추가한다.
docker run -d --name nginx -p 80:80 -p 443:443 --link nuxus:nuxus my-nginx:0.1
4. 확인
hosts 를 설정하고, 테스트 해 보자. https://my-test-docker.com (https!)로 브라우저로 접근하면 아래와 같이 접근이 가능하다.
그런데, 이 때, self-signed certificate 로 만든 인증서를 사용했다면, docker login 을 해 보면 다음과 같이 나오며 접근이 불가하다.
$ docker login my-test-docker.com Username: admin Password: Error response from daemon: Get "https://my-test-docker.com/v2/": x509: certificate signed by unknown authority
신뢰할 수 있는 인증서 로 등록되지 않았기 때문인데, CentOS 에서는 /etc/pki/ca-trust/source/anchors/ 에 추가하고 docker 를 재시작하면 되기는 한데, (https://bitgadak.tistory.com/5 의 4.2 참고) 이 경우 docker 를 재시작해야 하는 문제가 있다.
다른 방법으로는 /etc/docker/certs.d/ 에 도메인명 디렉토리 이름을 정하고 그 안에 *.crt 로 crt 파일을 넣는 방법이 있다. 예를 들어 이 경우 도메인이 my-test-docker.com 이기 때문에 만들어둔 crt 를 /etc/docker/certs.d/my-test-docker.com/ 에 넣어주면 된다.
(참고: https://docs.docker.com/engine/security/certificates/)
잘 된다.
직접 push 를 해 보자. 위에서 만든 my-nginx:0.1 을 push 해 본다.
먼저 tag 명령어로 이미지 이름을 my-test-docker.com/ 으로 시작하도록 변경한다.
$ docker tag my-nginx:0.1 my-test-docker.com/my-nginx:0.1
push 한다.
$ docker push my-test-docker.com/my-nginx:0.1 The push refers to repository [my-test-docker.com/my-nginx] 27b7bb9a8f7f: Pushed 27b1fc072fad: Pushed 2318312b5335: Pushed c75c795b7d44: Pushed 4e498ce5ae6a: Pushed 35437a3771fc: Pushed 108a6d6c3e60: Pushed 9ccbab2746b8: Pushed 2edcec3590a4: Pushed 0.1: digest: sha256:fab48ce9f740e614056c1d308f54297a865ed91d25fbea5eab79e7389af1bee6 size: 2193
잘 들어가 있음을 확인할 수 있다.
반응형'docker' 카테고리의 다른 글
docker 환경에서 nginx 로 jenkins ssl 적용 (0) 2022.02.09 DooD (docker-outside-of-docker) 를 통해 Jenkins 컨테이너에서 docker 사용하기 (1) 2021.09.06 - nexus3 는 docker 로 띄울 것이고, ssl 인증이 필요하기 때문에 nginx 가 이 역할을 맡도록 한다.