Raspberry pi

도커 레지스트리 (nexus3 oss) 만들기 : 커스텀빌드 이미지 올리기

[혜안] 2022. 8. 10. 16:54
728x90

라즈베리파이용 mariadb 이미지가 도커허브에 없어서 직접 이미지를 빌드했습니다.

2022.08.08 - [Raspberry pi] - 라즈베리파이4 도커허브에 없는 오픈소스 직접 빌드하기 : mariadb

 

라즈베리파이4 도커허브에 없는 오픈소스 직접 빌드하기 : mariadb

라즈베리파이4 라즈비안 환경에 쿠버네티스 클러스터를 구성 중입니다. 2022.08.03 - [Raspberry pi] - 라즈베리파이4 쿠버네티스 설치 라즈베리파이4 쿠버네티스 설치 결국 라즈비안 64bit를 포기하고 32

viewise.tistory.com

 

그리고나서 쿠버네티스에서 불러오려니, 먼저 도커 레지스트리부터 만들어야 할 것 같습니다.

도커 허브에 올리지 않고 별도로 레지스트리를 만들려는 이유는,

코인 투자봇이나, 홈IoT를 위한 홈서버 등의 이미지에는 개인적 내용과 민감한 알고리즘이 있어서,

퍼블릭 도커허브에 올리기는 좀 꺼림칙 하기 때문입니다.

같은 이유로 git 서버도 사설로 하나 만들어 운용 중입니다.

 

사설 레지스트리는 nexus를 사용할 예정입니다.

그리고 작업중일 때에만 필요할 것이므로 쿠버네티스 클러스터에 넣지 않고,

윈도우즈 작업PC에  설치했습니다.

 

패키지는 아래 경로에서 다운로드 받을 수 있습니다.

https://help.sonatype.com/repomanager3/product-information/download

 

Download

Nexus Repository OSS is distributed with Sencha Ext JS pursuant to a FLOSS Exception agreed upon between Sonatype, Inc. and Sencha Inc. Sencha Ext JS is licensed under GPL v3 and cannot be redistributed as part of a closed source work.

help.sonatype.com

 

Windows archive를 다운받으시면 됩니다.

 

설치방법은 아래 문서에 잘 나와 있습니다.

 

사실 설치과정이랄게 없는게, 다운로드 받은 이미지를 설치할 폴더 지정해서 압축 풀고 실행하면 됩니다.

저는 D:\nexus 폴더를 만들고 아래에 압축을 해제했습니다.

 

윈도우즈 시작 시 같이 시작되도록 서비스 등록을 위해 cmd창을 엽니다.

시스템에 서비스로 등록하는 절차가 있어서 cmd창을 관리자모드로 실행해야 합니다.

cmd창을 실행했으면, 설치한 폴더아래 bin 디렉토리로 이동합니다.

dir을 치면 nexus.exe 파일이 보입니다.

D:\nexus\nexus-3.41.0-01\bin>dir

2022-08-09  오후 10:16    <DIR>          .
2022-08-09  오후 10:16    <DIR>          ..
2022-08-09  오후 10:16    <DIR>          contrib
2022-07-26  오후 01:04           337,816 nexus.exe
2022-07-26  오후 01:04             1,676 nexus.vmoptions

 

서비스로 등록합니다.

D:\nexus\nexus-3.41.0-01\bin>nexus.exe /install nexus3

뒤에 nexus3는 임의로 지정한 서비스 이름입니다.

다른이름으로 해도 되고, 안넣어도 됩니다. 안넣으면 기본값인 nexus로 지정됩니다.

 

그리고 실행

D:\nexus\nexus-3.41.0-01\bin>nexus.exe /start nexus3

 

브라우저를 열고 접속해봅니다.

최초 시작하고 올라오는데까지 시간이 좀 걸립니다.

localhost:8081

 

우측상단 Sign in 을 누르면,

기본 계정은 admin이고, 패스워드가 저장된 경로를 알려줍니다.

제 경우는 D:\nexus\sonatype-work\nexus3\ 밑에 있었습니다.

파일을 찾아 notepad로 열어보면 패스워드가 있습니다.

해당 패스워드로 로그인하면, 신규 패스워드 설정 창이 나오고, 거기에서 새로운 패스워드를 설정하면 됩니다.

 

이제 nexus 설치는 끝났고, 도커 레지스트리를 생성해야 합니다.

설정으로 들어가서,

 

Repository 에 Create repository를 클릭합니다.

 

목록 중 docker (hosted)를 선택합니다.

 

각 입력창이 있는데, 크게 3군데만 설정하면 됩니다.

Name은 임의로 설정하면 됩니다.

HTTP 항목을 선택하고, 레포지토리용 접근 포트를 설정합니다.

Enable Docker V1 API는 HTTP 사용을 위해 체크해야 합니다. 보안이 좀 취약해도 개인적으로 내부망에서만 사용할 계획이라 HTTP로 설정했습니다.

맨 아래로 내려 Create repository를 클릭하면, 레포지토리가 생성됩니다.

 

레포지토리는 생성이 되었고,

이제 접근할 노드에서 설정변경이 필요합니다.

우선 사설 레포지토리는 IP보다는 사설 도메인으로 넣어놓는게 좋을 것 같습니다.

혹시 PC IP가 바뀌기라도 하면 번거로워질 테니까요.

호스트파일에 임의로 등록을 해줍니다.

$ sudo vi /etc/hosts
192.168.0.28    private.repo

 

그리고 아래경로에 사설 도메인으로 정보를 추가해줍니다.

$ vi /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
   "insecure-registries" : ["private.repo:8888"]
}

 

그리고 도커 재시작

$ sudo systemctl restart docker

 

노드에서 로그인을 해봅니다.

$ docker login private.repo:8888
Username: admin
Password:
Error response from daemon: Get "http://private.repo:8888/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

한참 걸리는게 뭔가 기분이 쎄하다 했더니, 접근이 안되네요.

생각해보니 개인용 윈도우10이라, 방화벽이 막혀있을 것 같습니다.

 

윈도우 방화벽 설정에서 고급 설정으로 들어갑니다.

 

인바운드 규칙에서, 새 규칙을 클릭합니다.

 

아래와 같은 순서로 새 인바운드 규칙을 만듭니다.

새 규칙이 생성되었으면, 다시 로그인을 해봅니다.

$ docker login private.repo:8888
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /home/cmlee/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

성공했네요.

 

그럼 이제 지난 번 포스팅에서 만들었던 라즈베리파이용 mariadb-arm7 이미지를 올려보겠습니다.

우선 기존 이미지 레포지토리 정보를 변경합니다.

$ docker images
REPOSITORY                   TAG          IMAGE ID       CREATED         SIZE
becans/mariadb-arm7          0.3          cf07319ec3d8   3 days ago      542MB

$ docker tag cf07319ec3d8 private.repo:8888/mariadb-arm7:0.3

$ docker images
REPOSITORY                       TAG          IMAGE ID       CREATED         SIZE
becans/mariadb-arm7              0.3          cf07319ec3d8   3 days ago      542MB
private.repo:8888/mariadb-arm7   0.3          cf07319ec3d8   3 days ago      542MB

 

그리고 push

$ docker push 192.168.0.28:8888/mariadb-arm7:0.3
The push refers to repository [192.168.0.28:8888/mariadb-arm7]
4e2e9d9dc81f: Pushed
16635c3f133a: Pushed
e1b869d58b94: Pushed
a5922e318758: Pushed
fd98ae6df84c: Pushed
f1d9e58a8247: Pushed
0.3: digest: sha256:845eb2faf3a1e3d076827a0c4bb131ba7ed688e685999a919281cb77848dd95e size: 1573

 

잘 올라왔는지 확인합니다.

잘 올라왔네요.

 

이제 쿠버네티스에서 pod에 넣는 작업을 해야 하는데요.

이번에 설치한 쿠버네티스는 컨테이너로 도커를 쓰지 않고 containerd를 사용하기 때문에, 도커에 넣어준 사설 레지스트리 정보가 쿠버네티스에 반영되지 않습니다.

containerd에도 동일하게 사설 레지스트리 정보를 넣어줍니다.

$ vi /etc/containerd/config.toml
version = 2

[plugins]
  [plugins."io.containerd.grpc.v1.cri"]
    [plugins."io.containerd.grpc.v1.cri".cni]
      bin_dir = "/opt/cni/bin"
      conf_dir = "/etc/cni/net.d"
    [plugins."io.containerd.grpc.v1.cri".registry]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."private.repo:8888"]
          endpoint = ["http://private.repo:8888"]
          [plugins."io.containerd.grpc.v1.cri".registry.mirrors."private.repo:8888".tls]
            insecure_skip_verify = true
        [plugins."io.containerd.grpc.v1.cri".registry.auths."private.repo:8888"]
          username = "admin"
          password = "xxxxxxxxx"
  [plugins."io.containerd.internal.v1.opt"]
    path = "/var/lib/containerd/opt"

 

yaml파일을 수정하고,

apiVersion: v1
kind: Service
metadata:
  name: mariadb-custom-svc
spec:
  ports:
  - port: 3306
  selector:
    app: mariadb-custom
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: mariadb-custom
  name: mariadb-custom
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mariadb-custom
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mariadb-custom
    spec:
      containers:
      - image: private.repo:8888/mariadb-arm7:0.3        
        name: mariadb-arm7
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: sqldb
          mountPath: /var/lib/mysql
      volumes:
      - name: sqldb
        persistentVolumeClaim:
          claimName: pvc-sqldb

 

컨테이너를 재기동하고,

sudo systemctl restart containerd
sudo systemctl daemon-reload

 

실행합니다.

$ k apply -f mariadb_custom.yaml

$ k get pod -w
NAME                              READY   STATUS              RESTARTS   AGE
fan-controller-spgm8              1/1     Running             0          98m
mariadb-custom-79b4fdbb46-9tt9p   0/1     ContainerCreating   0          3s
mariadb-custom-79b4fdbb46-9tt9p   1/1     Running             0          6s

 

잘 올라왔네요.

 

ps. 사실 쿠버네티스가 containerd를 사용하고 있다는 사실을 간과하고 도커에서는 되는데 쿠버네티스에서 안되는 원인을 한참 찾았습니다. 쿠버네티스에서 도커 지원을 중단한다고 하니, 다른 컨테이너에 적응이 필요할지도 모르겠습니다.

다만, 쿠버네티스가 도커 지원을 중단한다고 해서, 도커에서 만든 이미지가 쿠버네티스에 호환되지 않는다는 의미는 아니므로, 지금당장 걱정하지는 않아도 될 것 같습니다.

728x90