Docker에서는 이미 주어진 Image들을 다운로드 받아서 사용하고 있다.

그러면, 이러한 Image들은 어디에 있는 것일까?!

 

"Docker Hub"라는 공식적으로 운영하고 있는 Image Server가 바로 그 곳이다.

 

이름에서 떠오르는 것과 같이.... GitHub와 같은 역할을 하는 아이다.

소스코드가 아닌 Docker Image를 저장하는 그 곳!

명령어도 유사하다~

 

 

 

 

 

그런데, 우리는 (나 혼자만?) 공식적인 것 말고.... 사적인 것, 나만의 것을 갖고 싶은 욕구가 있다.

즉, 나만의 Docker Hub를 운영하고 싶으면 어떻게 해야할까?

 

 

 

이럴 때 필요한 구글신께 외치는 주문~!!!

   - Docker Registry Server Install

 

그러면, 게시를 내려주시는 우리의 구글신님~!!!

   - https://docs.docker.com/registry/deploying/

 

 

 

 

우리가 지금부터 해야할 것은 "Docker Registry Server"를 구축하는 것이다.

 

 

 

 

 

Docker와 관련이 있는 것이니만큼, Docker Registry Server 역시 Docker 이미지로 배포가 된다.

즉, 별도의 설치과정 없이 이미지를 다운로드 받아서 실행하면 된다는...

 

하지만, 언제나처럼 제대로 사용하기 위해서는 공부를 해야하고, 시행착오를 겪어야 한다는... ^^

 

 

 

 

 

일단, Docker를 설치해야한다.

   - [ Docker Install (Ubuntu 14.04 - 64bit) - using Download ] : http://www.whatwant.com/863

 

 

 

이제 우리가 필요한 Registry Server의 이미지를 땡겨오자.

 

$ sudo docker pull registry
Using default tag: latest
latest: Pulling from library/registry
90f4dba627d6: Pull complete
3a754cdc94a5: Pull complete
0756a217635f: Pull complete
f82b9495c796: Pull complete
154ef19ddee6: Pull complete
Digest: sha256:5eaafa2318aa0c4c52f95077c2a68bed0b13f6d2b464835723d4de1484052299
Status: Downloaded newer image for registry:latest

 

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
registry              latest              c2a449c9f834         3 days ago          33.2 MB
hello-world         latest              1815c82652c0        2 weeks ago         1.84 kB

 

 

 

 

실행은 간단하다.

 

$ sudo docker run --name my-registry -d --restart=always -p 5000:5000 registry
0af462462b05ea13191470dff48ab52edf2206b65c885d2d82fd5c319daca63a

 

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
0af462462b05        registry            "/entrypoint.sh /e..."   9 seconds ago       Up 8 seconds        0.0.0.0:5000->5000/tcp   my-registry

 

"--name" 옵션 뒤에 앞으로 사용할 Container 이름을 임의로 지어주면 되고...

"-d" 옵션을 통해서 Daemon으로 실행하고 싶다고 알려주고~

"--restart=always" 옵션을 통해서 Container 안에서 프로세스가 죽더라도 항상 재시작을 하도록 하고~

"-p" 옵션으로 포트 매핑을 해주면 된다.

 

제일 뒤에는 원본(?)으로 사용할 이미지를 지정해준다.

 

ps를 통해서 실행되고 있는 모습을 확인해볼 수 있다.

 

 

 

 

 

지금 실행해 놓은 Registry를 실험해보기 위해서, 등록해볼 마루타를 하나 만들어보자.

 

 

 

Dockerfile을 하나 만들어보자.

 

$ nano ./Dockerfile

 

FROM busybox
MAINTAINER whatwant <whatwant@gmail.com>
CMD /bin/echo "hi-world!!"

 

방금 만든 마루타의 Dockerfile을 빌드해서 이미지로 만들어보자.

 

$ sudo docker build -t hi-world .
Sending build context to Docker daemon 2.048 kB
Step 1/3 : FROM busybox
 ---> c30178c5239f
Step 2/3 : MAINTAINER whatwant <whatwant@gmail.com>
 ---> Running in 6115aa49c789
 ---> efaf526395ee
Removing intermediate container 6115aa49c789
Step 3/3 : CMD /bin/echo "hi-world!!"
 ---> Running in b57e417ec463
 ---> 0983858cdd37
Removing intermediate container b57e417ec463
Successfully built 0983858cdd37

 

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hi-world            latest              0983858cdd37     14 seconds ago       1.11 MB
registry             latest              c2a449c9f834        3 days ago           33.2 MB
busybox            latest              c30178c5239f        2 weeks ago         1.11 MB
hello-world       <none>           1815c82652c0        2 weeks ago         1.84 kB

 

 

 

이미지를 만들었으면, 이제는 우리의 Registry Server에 등록을 해보자.

 

$ sudo docker tag hi-world localhost:5000/hi-world


$ sudo docker push localhost:5000/hi-world
The push refers to a repository [localhost:5000/hi-world]
3a1dff9afffd: Pushed
latest: digest: sha256:b182254942f5ffeb903b7125c4693e12c2330db6c16a75681e76c633535edade size: 527

 

잘 등록되었는지 확인도 해보자.

 

$ curl -X GET http://localhost:5000/v2/_catalog
{"repositories":["hi-world"]}

 

$ curl -X GET http://localhost:5000/v2/hi-world/tags/list
{"name":"hi-world","tags":["latest"]}

 

 

 

 

이번에는 Registry Server를 제대로 사용할 수 있는지 확인해보자.

그런데, 이미 가지고 있는 이미지들이 있으니 테스트를 위해서 확인하고 지워놓자.

 

$ sudo docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
hi-world                  latest              81d1537591cc        32 minutes ago      1.11 MB
localhost:5000/hi-world   latest              81d1537591cc        32 minutes ago      1.11 MB
registry                  latest              c2a449c9f834        3 days ago          33.2 MB
busybox                   latest              c30178c5239f        2 weeks ago         1.11 MB
hello-world               latest              1815c82652c0        2 weeks ago         1.84 kB

 

hi-world, localhost:5000/hi-world 2개의 이미지가 있다. 지우자!

 

$ sudo docker rmi hi-world
Untagged: hi-world:latest


$ sudo docker rmi localhost:5000/hi-world
Untagged: localhost:5000/hi-world:latest
Untagged: localhost:5000/hi-world@sha256:410ad4c96024f632bde893190d71a3c10457419c50375ab1d878f2ad67d76775
Deleted: sha256:81d1537591cc43e879aeed3e0556788f9b6b75ab6377fd1db6c9266472f27f09
Deleted: sha256:358acd2e8b9f52adffcdd2870487bdc36d7842677d602ffdf533776ac55a7574

 

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
registry            latest              c2a449c9f834        3 days ago          33.2 MB
busybox             latest              c30178c5239f        2 weeks ago         1.11 MB
hello-world         latest              1815c82652c0        2 weeks ago         1.84 kB

 

hi-world 이미지가 없는 것을 확인했다.

이제 땡겨오자.

 

 

$ sudo docker pull localhost:5000/hi-world
Using default tag: latest
latest: Pulling from hi-world
27144aa8f1b9: Already exists
Digest: sha256:410ad4c96024f632bde893190d71a3c10457419c50375ab1d878f2ad67d76775
Status: Downloaded newer image for localhost:5000/hi-world:latest

 

$ sudo docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
localhost:5000/hi-world   latest              81d1537591cc        33 minutes ago      1.11 MB
registry                  latest              c2a449c9f834        3 days ago          33.2 MB
busybox                   latest              c30178c5239f        2 weeks ago         1.11 MB
hello-world               latest              1815c82652c0        2 weeks ago         1.84 kB

 

잘 받아온 것을 확인했다.

 

 

동작이 잘되는지도 확인해보자.

 

$ sudo docker run localhost:5000/hi-world
hi-world!!

 

물론 잘된다.

 





혹시 아래와 같은 에러가 발생할 경우에는...


$ sudo docker pull xxx.xxx.xx.xx:5000/asdf

Using default tag: latest

Error response from daemon: Get https://xxx.xxx.xxx.xxx:5000/v1/_ping: http: server gave HTTP response to HTTPS client



아래와 같이 환경설정을 해주면 된다.


$ sudo nano /etc/default/docker

 

...

# Use DOCKER_OPTS to modify the daemon startup options.

#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

DOCKER_OPTS="--insecure-registry xxx.xxx.xxx.xxx:5000"

...


$ sudo service docker restart

 



 

기본적인 사항은 여기까지 해서 살펴보았지만...

아직 사용하기에는 문제가 많이 있는 상태이다.

 

당장 인증 관련한 부분에 있어서 문제가 있다. 아무나 쓸 수 있도록 한다면 뭐 무방하지만.... ^^

LDAP과 같은 계정서버와의 연계라던지 아니면 로드밸런싱이라던지... 등 알아봐야할게 아직 많다.

 

뭐 일단, 이번 포스트는 여기까지~

 

반응형

+ Recent posts