Docker Private(local) Registry 구축하기(ubuntu 20.04)

2022. 6. 9. 13:48프로그래밍 개발(Development)/Docker

반응형

Docker Registry를 쉽게 구축하는 방법에 대해서 알아보겠습니다.

가장 많이 사용하는 Private Registry로 docker.io/registry가 있습니다.

 

인터넷이 되는 환경에서 Docker가 설치 되어 있다는 전제 조건으로 Private Registry를 쉽게 구축하는 방법을 알아보겠습니다.

 

Spec

- ubuntu 20.04

- docker

 

※ Private Registry는 registry 컨테이너가 삭제되면 모든 데이터가 삭제되므로 매우 주의 하셔야 합니다.


Docker Registry 설치하기

1. Docker registry Image 가져오기(Pull registry image)

$ docker pull registry:latest
Trying to pull repository docker.io/library/registry ... 
latest: Pulling from docker.io/library/registry
...
...
...
...
Status: Downloaded newer image for docker.io/registry:latest

2. Registry Image 유무 확인

$ docker images registry
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
registry     <none>    2e200967d166   2 months ago   24.2MB

3. Registry 컨테이너 실행

docker 명령어로 컨테이너를 실행 하며 옵션은 아래와 같다.

  • docker run : 컨테이너 실행
  • --name : 컨테이너 이름
  • -d  : daemon(백그라운드)으로 실행
  • -p 5000:5000 : (local 5000번 포트 -> 컨테이너 5000번 포트로 바인딩)
  • registry : Docker Image 이름
  • --restart always : 컨테이너가 종료시 자동 재시작
# 기본 실행
$ docker run --name private-repo -d -p 5000:5000 registry

or 

# 컨테이너 종료시 자동 재실행
$ docker run --restart always --name private-repo -d -p 5000:5000 registry

4. 컨테이너 정상 작동 되고 있는지 확인

$ docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                                       NAMES
...
...
723aa81508ea   2e200967d166           "/entrypoint.sh /etc…"   2 weeks ago      Up 9 minutes    0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   private-repo

5. Listen Port 확인

바인딩한 5000 포트가 정상적으로 Listen 상태인지 확인

$ netstat -anp | grep 5000 | grep LIST
tcp        0      0 0.0.0.0:5000            0.0.0.0:*               LISTEN      22685/docker-proxy
tcp6       0      0 :::5000                 :::*                    LISTEN      22690/docker-proxy

6. insecure-registries 설정

Pull (다운로드) 하려는 서버에 설정한다.

/etc/docker/daemon.json 파일을 열어 아래에 insecure-registries 추가하고, registry 주소를 입력한다.

registry 실행시 포트포워드 Port가 5000번이기 때문에 5000번 포트로 입력

insecure-registries 외 옵션 정보 추가 가능

ex) "insecure-registries": ["{registry server ip}:{port}"] 

{
    "insecure-registries": ["10.0.1.232:5000"]
}

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

여기까지 진행을 했다면, Private Registry 구축이 완료 되었습니다.


 

Registry 구축이 완료 되었으니, Dockerfile을 생성해서 Push, Pull 테스트를 진행해보겠습니다.

 

1. Dockerfile 생성

간단한 "Hello World" 문자가 출력 되도록 Dockerfile 을 생성합니다.

$ vi Dockerfile

FROM ubuntu:20.04
CMD echo 'Hello World!'

2. Dockerfile build

Dockerfile을 빌드하여 Image를 생성한다.

$ docker build -t helloworld .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM ubuntu:20.04
20.04: Pulling from library/ubuntu
d7bfe07ed847: Pull complete
Digest: sha256:fd92c36d3cb9b1d027c4d2a72c6bf0125da82425fc2ca37c414d4f010180dc19
Status: Downloaded newer image for ubuntu:20.04
 ---> 20fffa419e3a
Step 2/2 : CMD echo 'Hello World!'
 ---> Running in dc72193ad9f4
Removing intermediate container dc72193ad9f4
 ---> a9f5ef83b641
Successfully built a9f5ef83b641
Successfully tagged helloworld:latest

3. Image가 생성 확인 및 컨테이너 동작 확인

helloworld repository가 생성 되었고, 실행 또한 정상적으로 "Hellow World" 문자가 출력이 되는것을 확인

$ docker images helloworld
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
helloworld   latest    a9f5ef83b641   4 minutes ago   72.8MB

$ docker run helloworld
Hello World!

4. Image Tag 생성

위의 /etc/docker/daemon.json 파일에 정의된 registry 주소와 포트를 입력 하면 된다.

docker tag 형식

 - docker tag {image_repogitory} {docker_registry_ip}:{docker_registry_port}/{repogitory}/{image_name}:{tag}

ex) docker tag helloworld localhost:5000/helloworld:1.0

ex) docker tag helloworld localhost:5000/test_repo/helloworld:1.0

 

$ docker tag helloworld localhost:5000/helloworld:1.0

$ docker images localhost:5000/helloworld
REPOSITORY                  TAG       IMAGE ID       CREATED         SIZE
localhost:5000/helloworld   1.0       a9f5ef83b641   9 minutes ago   72.8MB

5. Registry에 Push 명령어로 업로드

Docker Push 명령어를 이용해서 Private Registry에 Image 업로드

ex) docker push localhost:5000/helloworld:1.0

$ docker push localhost:5000/helloworld:1.0
The push refers to repository [localhost:5000/helloworld]
af7ed92504ae: Pushed
1.0: digest: sha256:98127203f963780dffb600b9ecccd84307c2380bee7785cf58f27e2767aabceb size: 529

6. Registry로 부터 Pull 명령어로 다운로드

기존 Docker Image를 삭제하고 Pull을 이용해서 다운로드 받아보자

# IMAGE ID로 Docker Image 삭제

$ docker rmi -f a9f5ef83b641
Untagged: localhost:5000/helloworld:1.0
Untagged: localhost:5000/helloworld@sha256:98127203f963780dffb600b9ecccd84307c2380bee7785cf58f27e2767aabceb
Deleted: sha256:a9f5ef83b6416e2a3e2a61bd5022f94dc0dda9e5a29dabfaa9a00a7067ebfb12
Deleted: sha256:20fffa419e3aaca519dad480b21e86d9bcfbc7795abf9419adc5adce1198c95e

$ docker images localhost:5000/helloworld
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

조회하여 정상적으로 삭제된걸 확인한다.

이제 Pull 명령어를 통해서 다운로드 받아보자.

ex) docker pull localhost:5000/helloworld:1.0

$ docker pull localhost:5000/helloworld:1.0
1.0: Pulling from helloworld
d7bfe07ed847: Already exists
Digest: sha256:98127203f963780dffb600b9ecccd84307c2380bee7785cf58f27e2767aabceb
Status: Downloaded newer image for localhost:5000/helloworld:1.0
localhost:5000/helloworld:1.0

$ docker images localhost:5000/helloworld
REPOSITORY                  TAG       IMAGE ID       CREATED          SIZE
localhost:5000/helloworld   1.0       a9f5ef83b641   26 minutes ago   72.8MB

$ docker run localhost:5000/helloworld:1.0
Hello World!

이미지 조회를 통하여 정상적으로 다운로드 된걸 확인하고 컨테이너 실행을 통해 정상 작동 여부도 확인을 하였다.

 

일반적으로 Docker hub를 이용해서 배포를 하지만 상황에 따라 내부 Registry를 Local에 구축해야 하는 상황이 생길때 유용하게 사용하면 될것 같다.

 

Domain을 사용하려면 hosts 파일에 Domain 등록을 하고 /etc/docker/daemon.json 파일에 IP가 아닌 Domain을 등록하면 사용 할 수 있다.

반응형