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을 등록하면 사용 할 수 있다.
'프로그래밍 개발(Development) > Docker' 카테고리의 다른 글
RUN, CMD, ENTRYPOINT 명령어의 개념과 차이점 (1) | 2022.05.09 |
---|---|
Docker log file 주기적으로 삭제 및 관리(logrotate 사용) (0) | 2022.02.28 |
Docker, Docker-compose 수동 설치(Centos, ubuntu) (0) | 2022.02.23 |
Docker 명령어 정리 (0) | 2021.08.16 |
Django & Nginx를 도커(Docker)로 실행하기 (with. docker-compose) (0) | 2021.08.12 |