ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 으로 도메인 이름이 들어가 있어햐 한다.)
      • 발급 방법은 아래 포스트를 참고한다.

    아래와 같은 구조가 될 것이다.


    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 - Official Image | Docker Hub

    Quick reference Supported tags and respective Dockerfile links 1.21.6, mainline, 1, 1.21, latest 1.21.6-perl, mainline-perl, 1-perl, 1.21-perl, perl 1.21.6-alpine, mainline-alpine, 1-alpine, 1.21-alpine, alpine 1.21.6-alpine-perl, mainline-alpine-perl, 1-a

    hub.docker.com

    여기서 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

    잘 들어가 있음을 확인할 수 있다.

     

    반응형

    댓글

Designed by Tistory.