앞서 구성한 docker compose에 Nexus를 추가 하겠습니다.
├─ nginx
│ ├─ config
│ └─ nginx.conf
└─ docker-compose.yml # this!
nexus3의 docker image는 아래 링크에서 확인할 수 있습니다.
docker compose에 nexus3가 사용할 volume을 추가합니다.
# ./docker-compoose.yml
volumes:
nexus-data:
name: nexus-data
docker compose에 nexus3 구성을 추가 합니다.
# ./docker-compose.yml
services:
(...중략...)
nexus:
image: sonatype/nexus3:3.42.0
container_name: nexus
hostname: nexus
restart: always
volumes:
- type: volume
source: nexus-data
target: /nexus-data
networks:
docker-host:
ipv4_address: 172.20.0.20
docker-compose.yml이 존재하는 위치에서 아래 명령을 실행합니다.
$ docker-compsoe up -d nexus
실행이 완료되면 아래와 같이 continer log를 확인 할 수 있습니다.
$ docker logs -f nexus
2022-11-30 05:11:39,824+0000 INFO (생략)
-------------------------------------------------
Started Sonatype Nexus OSS 3.42.0-01
-------------------------------------------------
2022-11-30 05:12:38,294+0000 INFO (생략)
생성된 nexus에 접속할 수 있도록 nginx의 reverse proxy 설정 파일을 추가합니다.
├─ nginx
│ ├─ config
│ │ └─ nexus.conf # this!
│ └─ nginx.conf
└─ docker-compose.yml
# ./nginx/config/nexus.conf
upstream nexus.domain.com { # WebUI, Maven repo
server nexus:8081;
}
server {
server_name nexus.domain.com;
listen 80 ;
location / {
proxy_pass http://nexus.domain.com;
}
}
upstream resistry.nexus.domain.com { # Docker container registry
server nexus:5000;
}
server {
server_name resistry.nexus.domain.com;
listen 80 ;
location / {
proxy_pass http://resistry.nexus.domain.com;
}
}
nginx 컨테이너에서 nginx를 reload 하거나 nginx container 를 재시작 해줍니다.
$ docker restart nginx-proxy
웹 브라우저를 통해 http://nexus.domain.com 으로 접속 하면 아래와 같은 페이지가 연결됩니다.
nexus의 관리자 계정은 admin이고 초기 비밀번호는 컨테이너 안의 파일에 생성되어 있습니다. 아래 명령을 실행하면 UUID 타입의 초기 비밀번호가 터미널에 출력됩니다. 이 후 관리자 계정으로 로그인 하면 비밀번호를 변경할 수 있습니다.
$ docker -exec -itu 0 nexus cat /nexus-data/admin.password
그리고 익명 연결을 허용해 줍니다.
Nexus를 설치하면 maven과 nuget은 기본 설정 되어 있습니다.
administration > repository > blob stores 메뉴로 이동합니다.
create blob store를 클릭하여 아래와 같이 두 개의 store를 생성합니다.
Type: file
Name: docker-hosted, docker-hub
administration > repository > repositories 메뉴로 이동합니다.
create repository를 클릭하여 아래와 같이 두 개의 repository를 생성합니다.
administration > security > realms
Docker bearer token realm을 Active로 이동 시키고 저장합니다.
administration > security > Roles > Create
administration > security > Users > Create local user
Https가 적용되지 않은 maven repository를 사용하려면 maven mirror 설정이 필요합니다.
Mirror 설정의 maven-default-http-blocker을 주석 처리(maven-3.8.1 이상)하고 생성한 Maven repository mirror를 추가 합니다.
<!--MAVEN_HOME/conf/settings.xml-->
<settings>
<servers>
<!-- private nexus maven repository -->
<server>
<id>private-nexus3-maven</id>
<username>gitlab-ci</username>
<password>change_me</password>
</server>
<!-- private nexus maven releases repository -->
<server>
<id>private-nexus3-maven-releases</id>
<username>gitlab-ci</username>
<password>change_me</password>
</server>
<!-- private nexus maven snapshots repository -->
<server>
<id>private-nexus3-maven-snapshots</id>
<username>gitlab-ci</username>
<password>change_me</password>
</server>
</servers>
<mirrors>
<!--
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>true</blocked>
</mirror>
-->
<!-- private nexus repository -->
<mirror>
<id>private-nexus</id>
<mirrorOf>central</mirrorOf>
<name>private-nexus3-maven</name>
<url>http://nexus.domain.com/repository/maven-public/</url>
<blocked>false</blocked>
</mirror>
<!-- private nexus maven releases repository -->
<mirror>
<id>private-nexus3-maven-releases</id>
<mirrorOf>releases</mirrorOf>
<name>private-nexus</name>
<url>http://nexus.domain.com/repository/maven-releases/</url>
<blocked>false</blocked>
</mirror>
<!-- private nexus maven snapshots repository -->
<mirror>
<id>private-nexus3-maven-snapshots</id>
<mirrorOf>snapshots</mirrorOf>
<name>private-nexus</name>
<url>http://nexus.domain.com/repository/maven-snapshots/</url>
<blocked>false</blocked>
</mirror>
</mirrors>
</settings>
Https가 적용되지 않은 registry docker engine에서 사용하려면 insecure-registry 설정이 필요합니다.
# /etc/docker/daemon.json (존재하지 않으면 생성)
{
"insecure-registries" : [
"registry.nexus.domain.com"
]
}
설정 완료 후 Docker engine을 재시작 하면 적용 됩니다. docker login을 통해 확인할 수 있습니다.
$ docker login registry.nexus.domain.com
Username: gitlab-ci
Password: change_me
Login Succeeded
작성된 코드는 아래 Repository에 올려두었습니다.
다음은 MinIO를 구성하겠습니다.
- Self managed repository and CI #1 - Overview
- Self managed repository and CI #2 - Docker network, Nginx reverse proxy
- Self managed repository and CI #3 - Nexus3ㆍ현재 글
- Self managed repository and CI #4 - Minio
- Self managed repository and CI #5 - Gitlab
- Self managed repository and CI #6 - Gitlab-runner
- Self managed repository and CI #7 - Gitlab-CI