티스토리 뷰

728x90
반응형

이번 포스팅에서는 간단하게 Docker Registry를 구축하는 방법에 대해 살펴보겠습니다.

지난 여러번의 포스팅을 통해 Nexus를 활용한 Docker Private Registry를 구축하는 과정에 대해 살펴보았는데요.

사실 가장 유명한 Docker Private Registry는 docker.io/registry라고 볼 수 있습니다.

Docker가 설치되어 있는 인터넷이 되는 환경에서는 누구나 수분 안에 개인 Registry를 구축할 수 있는 이 과정을 한번 살펴보도록 하겠습니다.

 

Private Registry를 사용 할 경우 다음과 같은 장점이 있습니다.

- Docker Hub등의 Public Registry의 경우 하나의 이미지만 private 등록이 가능하고 organization의 경우 비용을 지불해야 하지만 Private Registry의 경우 제한이 없다.

- 개인 공간에서 보다 많은 권한을 부여하여 사용할 수 있다.

위와 같은 사유로 인해 내부 Private Cloud 환경에 적용가능한 Docker Private Registry를 지금부터 구현해 보도록 하겠습니다.

먼저 Docker를 설치하는 방법은 이전 포스팅을 참고하시기 바랍니다. (ex) wget -qO- https://get.docker.com/ | sh) 

Docker Registry 설치

1. Docker registry Images 가져오기

[root@kubemaster ~]# docker pull registry:latest
Trying to pull repository docker.io/library/registry ... 
latest: Pulling from docker.io/library/registry
c87736221ed0: Pull complete 
1cc8e0bb44df: Pull complete 
54d33bcb37f5: Pull complete 
e8afc091c171: Pull complete 
b4541f6d3db6: Pull complete 
Digest: sha256:8004747f1e8cd820a148fb7499d71a76d45ff66bac6a29129bfdbfdc0154d146
Status: Downloaded newer image for docker.io/registry:latest
[root@kubemaster ~]#

위와 같이 Docker Repository를 생성하고 다음 정상 생성되었는지 확인합니다.

[root@kubemaster ~]# docker images registry
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
docker.io/registry   latest              f32a97de94e1        5 months ago        25.8 MB
[root@kubemaster ~]#

위와 같이 docker docker images로 정상 생성여부를 확인하고 Docker에 접속할 계정을 생성합니다.

2. Docker registry 실행

[root@kubemaster ~]# docker run --name MyPrivate-Docker -d -p 5000:5000 registry
3d407c3736ddd67d0a2f6fb83b46544ce51bc08eba0d69096a7a3f9957531e15
[root@kubemaster ~]#

- docker run 명령어로 컨테이너 기동

- --name은 docker image 이름

- -d daemon으로 (백그라운드) 실행

- -p 5000:5000 registry 실행 (local 5000번 포트 -> 이미지 5000번 포트로 바인딩)

3. Docker registry 확인

[root@kubemaster ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
3d407c3736dd        registry            "/entrypoint.sh /e..."   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp   MyPrivate-Docker
[root@kubemaster ~]#

위와 같이 docker ps -a로 확인하면 추가한 docker registry를 확인할 수 있습니다.

[root@kubemaster ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
3d407c3736dd        registry            "/entrypoint.sh /e..."   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp   MyPrivate-Docker
[root@kubemaster ~]# 

docker ps -l 을 사용하면 최근에 추가한 컨테이너를 확인할 수 있죠.

4. Listen Port 확인

[root@kubemaster ~]# netstat -anp | grep 5000 | grep LIST
tcp6       0      0 :::5000                 :::*                    LISTEN      16478/docker-proxy- 
unix  2      [ ACC ]     STREAM     LISTENING     48731    15537/dockerd-curre  /run/docker/libnetwork/5907333dd2eb0b6189c5ac09da6b2d6b659daf5740cb00d50862e07b650009a3.sock
[root@kubemaster ~]#

바인딩한 5000번 포트가 정상적으로 Listen하고 있어요.

컨테이너의 5000번 포트가 호스트의 5000 포트로 노출되며, 도커 레지스트리는 http를 통해 기본적인 API를 제공합니다.

Docker Registry 활용

1. Dockerfile 작성

[root@kubemaster docker_image]# cat Dockerfile 
FROM ubuntu:16.04
MAINTAINER Nara Son <nara0617@gmail.com>
CMD echo 'Hello My Friend!'
[root@kubemaster docker_image]#

간단한 Dockerfile을 작성합니다.

2. Dockerfile을 이용하여 Docker Image를 생성합니다.

[root@kubemaster docker_image]# docker build -t 192.168.56.102:5000/nrson/hello:1.0 .
Sending build context to Docker daemon 2.048 kB
Step 1/3 : FROM ubuntu:16.04
Trying to pull repository docker.io/library/ubuntu ... 
16.04: Pulling from docker.io/library/ubuntu
f7277927d38a: Pull complete 
8d3eac894db4: Pull complete 
edf72af6d627: Pull complete 
3e4f86211d23: Pull complete 
Digest: sha256:97b54e5692c27072234ff958a7442dde4266af21e7b688e7fca5dc5acc8ed7d9
Status: Downloaded newer image for docker.io/ubuntu:16.04
 ---> 5e13f8dd4c1a
Step 2/3 : MAINTAINER Nara Son <nara0617@gmail.com>
 ---> Running in f98325c03ebf
 ---> 912b97a70ece
Removing intermediate container f98325c03ebf
Step 3/3 : CMD echo 'Hello My Friend!'
 ---> Running in 602fd2908b85
 ---> da2bc692472e
Removing intermediate container 602fd2908b85
Successfully built da2bc692472e
[root@kubemaster docker_image]#

192.168.56.102:5000/nrson/hello라는 tag 이름으로 docker 이미지를 생성하였습니다.

docker build 시 환경 변수를 주입하고자 할 경우에는 다음과 같이 작성이 가능합니다.

docker build -t 192.168.56.102:5000/nrson/hello:1.0 --build-arg MY_IMAGE=nrson .

여기서 주의 할 점은 tag 이름에 docker registry ip:port를 작성하여야 이후 docker push 시점에 해당 repogitory를 직접 찾아 간다는 점입니다.

즉 docker tag의 형식은 [DOCKER_REGISTRY_IP]:[DOCKER_REGISTRY_PORT]/[REPOGITORY]/[IMAGE_NAME]:[TAG] 라고 볼 수 있습니다.

3. docker images 생성확인

[root@kubemaster docker_image]# docker images 192.168.56.102:5000/nrson/hello:1.0
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
192.168.56.102:5000/nrson/hello   1.0                 da2bc692472e        2 minutes ago       120 MB
[root@kubemaster docker_image]# docker run 192.168.56.102:5000/nrson/hello:1.0
Hello My Friend!
[root@kubemaster docker_image]#

보시는 것처럼 방금전 생성한 192.168.56.102:5000/nrson/hello 이미지가 생성된 것을 볼 수 있습니다.

docker run 수행 시 Dockerfile에 작성한 Hello My Friend!가 출력되는 것을 볼 수 있습니다.

그럼 이제 생성한 이미지를 Docker Private Registry에 Push해야 겠죠?

4. docker tag를 이용하여 docker registry에 push

앞서 생성한 Private Registry에 이미지를 올려보도록 하겠습니다.

[root@kubemaster docker_image]# docker push 192.168.56.102:5000/nrson/hello:1.0
The push refers to a repository [192.168.56.102:5000/nrson/hello]
Get https://192.168.56.102:5000/v1/_ping: http: server gave HTTP response to HTTPS client
[root@kubemaster docker_image]#

이미 여러번 강조했지만, 위와 같이 server gave HTTP response to HTTPS client 라는 메시지가 출력되는 경우 다음과 같이 daemon.json 파일을 수정합니다.

[root@kubemaster docker_image]# vi /etc/docker/daemon.json 
{
    "insecure-registries": ["192.168.56.102:5000"]
}
[root@kubemaster docker_image]#

이후 docker를 restart 하고 registry를 다시 기동합니다.

[root@kubemaster docker_image]# systemctl daemon-reload
[root@kubemaster docker_image]# systemctl restart docker
[root@kubemaster docker_image]# docker run --name MyPrivate-Docker -d -p 5000:5000 registry
fcc45de395dfdc750a39efe31e4a0a68a5d2fe080773961494a8254a1a82a13e
[root@kubemaster docker_image]#

다시 docker push를 실행해 봅니다.

[root@kubemaster docker_image]# docker push 192.168.56.102:5000/nrson/hello:1.0
The push refers to a repository [192.168.56.102:5000/nrson/hello]
e79142719515: Pushed 
aeda103e78c9: Pushed 
2558e637fbff: Pushed 
f749b9b0fb21: Pushed 
1.0: digest: sha256:0a538ffd8d4b1d44c0fc68b81dae7eeae0a30b26915dfe9157743b1954e9cbba size: 1150
[root@kubemaster docker_image]# 

드디어 성공! 지금까지 따라오기 힘드시죠?

자 그럼 한번 정리하고 다음으로 넘어갈께요.

1) docker private rregistry를 설치하구요.

2) docker run... 5000:5000으로 docker 기동합니다.

3) 다음으로 Dockerfile을 생성하여 Docker 이미지를 생성하고

4) docker tag로 tag를 명시하여 이미지를 업로드합니다.

docker pull 활용

다음으로 Docker Private Registry에서 Pull하는 방법에 대해 알아보겠습니다.

중요한 사항은 현재 local repository에 올라가 있는 image와 container를 모두 삭제한 이후 실행하는 것이 보다 확실할 수 있습니다.

1. docker rmi [image] and docker rm [container] 수행

올라가 있는 Container를 docker rm으로 제거합니다.

[root@kubemaster docker_image]# docker rmi 192.168.56.102:5000/nrson/hello:1.0
Untagged: 192.168.56.102:5000/nrson/hello:1.0
Untagged: 192.168.56.102:5000/nrson/hello@sha256:0a538ffd8d4b1d44c0fc68b81dae7eeae0a30b26915dfe9157743b1954e9cbba
Deleted: sha256:da2bc692472e158055c2f822954066cffe83a5861d0d1da33aa1af6a17bf99c4
Deleted: sha256:912b97a70ece9aa320abf78f86be98d73d56557b32b88f4ed721185122dac37d
[root@kubemaster docker_image]# docker images 192.168.56.102:5000/nrson/hello:1.0
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
[root@kubemaster docker_image]# 

2. Docker Registry에서 docker run 수행

[root@kubemaster docker_image]# docker run 192.168.56.102:5000/nrson/hello:1.0
Unable to find image '192.168.56.102:5000/nrson/hello:1.0' locally
Trying to pull repository 192.168.56.102:5000/nrson/hello ... 
1.0: Pulling from 192.168.56.102:5000/nrson/hello
f7277927d38a: Already exists 
8d3eac894db4: Already exists 
edf72af6d627: Already exists 
3e4f86211d23: Already exists 
Digest: sha256:0a538ffd8d4b1d44c0fc68b81dae7eeae0a30b26915dfe9157743b1954e9cbba
Status: Downloaded newer image for 192.168.56.102:5000/nrson/hello:1.0
Hello My Friend!
[root@kubemaster docker_image]# docker images 192.168.56.102:5000/nrson/hello:1.0
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
192.168.56.102:5000/nrson/hello   1.0                 da2bc692472e        13 minutes ago      120 MB
[root@kubemaster docker_image]#

위와 같이 정상적으로 docker run이 수행된 것을 볼 수 있습니다. locally에서 찾아보니 해당 이미지가 없어서 192.168.56.102:5000에서 이미지를 Pulling해서 실행하는 것을 볼 수 있습니다.

Dockerfile에 명시한 CMD echo 'Hello My Friend!' 의 경우 echo 출력 후 바로 종료되어 Container 역시 종료됨을 알 수 있습니다.

Docker Registry Dashboard

자 지금까지 살펴본 Docker Private Registry에는 한가지 문제가 있는데요. 바로 GUI를 제공하지 않는다는 점이죠.

해서 지금부터는 GUI를 지원하는 Docker Registry Web을 설치해 보도록하겠습니다.

1. docker-registry-web을 설치하기 위한 yaml파일 작성

[root@kubemaster docker_image]# cat config.yaml 
registry:
 # 기존에 설치한 docker private registry
 url: http://192.168.56.102:5000/v2
 # Docker registry name
 name: 192.168.56.102:5000
 # docker 권한 부여
 readonly: false
 auth:
 enabled: false
[root@kubemaster docker_image]#

2. docker-registry-web 실행

[root@kubemaster docker_image]# docker run -it -d -p 8080:8080 --name registry-web --link MyPrivate-Docker -v /root/docker_image/config.yaml:/conf/config.yml:ro hyper/docker-registry-web
Unable to find image 'hyper/docker-registry-web:latest' locally
Trying to pull repository docker.io/hyper/docker-registry-web ... 
latest: Pulling from docker.io/hyper/docker-registry-web
04c996abc244: Pull complete 
d394d3da86fe: Pull complete 
bac77aae22d4: Pull complete 
b48b86b78e97: Pull complete 
09b3dd842bf5: Pull complete 
69f4c5394729: Pull complete 
b012980650e9: Pull complete 
7c7921c6fda1: Pull complete 
e20331c175ea: Pull complete 
40d5e82892a5: Pull complete 
a414fa9c865a: Pull complete 
0304ae3409f3: Pull complete 
13effc1a664f: Pull complete 
e5628d0e6f8c: Pull complete 
0b0e130a3a52: Pull complete 
d0c73ab65cd2: Pull complete 
240c0b145309: Pull complete 
f1fd6f874e5e: Pull complete 
40b5e021928e: Pull complete 
88a8c7267fbc: Pull complete 
f9371a03010e: Pull complete 
Digest: sha256:723ffa29aed2c51417d8bd32ac93a1cd0e7ef857a0099c1e1d7593c09f7910ae
Status: Downloaded newer image for docker.io/hyper/docker-registry-web:latest
66f7172e53c07d343a047c7c581b312636c4aefe15c625688dc229534849be4f
[root@kubemaster docker_image]#

3. docker-registry-web container 기동 확인

[root@kubemaster docker_image]# docker ps -l
CONTAINER ID        IMAGE                       COMMAND             CREATED             STATUS              PORTS                    NAMES
66f7172e53c0        hyper/docker-registry-web   "start.sh"          38 seconds ago      Up 37 seconds       0.0.0.0:8080->8080/tcp   registry-web
[root@kubemaster docker_image]# 

위와 같이 기동이 완려되면 Docker Registry GUI 접속이 가능합니다.

-d 옵션으로 daemon 백그라운드로 기동하였으나, 로그를 확인하고 싶을 경우 아래와 같이 docker logs로 확인이 가능합니다.

[root@kubemaster docker_image]# docker logs 66f7172e53c0
CATALINA_OPTS: -Djava.security.egd=file:/dev/./urandom -Dcontext.path=
Using CATALINA_BASE:   /var/lib/tomcat7
Using CATALINA_HOME:   /usr/share/tomcat7
Using CATALINA_TMPDIR: /var/lib/tomcat7/temp
Using JRE_HOME:        /usr/lib/jvm/java-7-openjdk-amd64
Using CLASSPATH:       /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar
Aug 26, 2019 4:04:58 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
Aug 26, 2019 4:04:58 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 536 ms
Aug 26, 2019 4:04:58 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Aug 26, 2019 4:04:58 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.52 (Ubuntu)
2019-08-26 16:05:09,187 [localhost-startStop-1] INFO  hibernate4.HibernatePluginSupport  - Set db generation strategy to 'update' for datasource DEFAULT

Configuring Spring Security Core ...
... finished configuring Spring Security Core

2019-08-26 16:05:09,984 [localhost-startStop-1] INFO  cache.CacheBeanPostProcessor  - postProcessBeanDefinitionRegistry start
2019-08-26 16:05:09,998 [localhost-startStop-1] INFO  cache.CacheBeanPostProcessor  - postProcessBeanFactory
2019-08-26 16:05:10,703 [localhost-startStop-1] WARN  config.ConfigurationFactory  - No configuration found. Configuring ehcache from ehcache-failsafe.xml  found in the classpath: jar:file:/var/lib/tomcat7/webapps/ROOT/WEB-INF/lib/ehcache-2.9.0.jar!/ehcache-failsafe.xml
2019-08-26 16:05:11,460 [localhost-startStop-1] INFO  sql.DatabaseMetaData  - HHH000262: Table not found: access_control
2019-08-26 16:05:11,462 [localhost-startStop-1] INFO  sql.DatabaseMetaData  - HHH000262: Table not found: event
2019-08-26 16:05:11,463 [localhost-startStop-1] INFO  sql.DatabaseMetaData  - HHH000262: Table not found: role
2019-08-26 16:05:11,465 [localhost-startStop-1] INFO  sql.DatabaseMetaData  - HHH000262: Table not found: role_access
2019-08-26 16:05:11,466 [localhost-startStop-1] INFO  sql.DatabaseMetaData  - HHH000262: Table not found: user
2019-08-26 16:05:11,468 [localhost-startStop-1] INFO  sql.DatabaseMetaData  - HHH000262: Table not found: user_role
2019-08-26 16:05:11,469 [localhost-startStop-1] INFO  sql.DatabaseMetaData  - HHH000262: Table not found: access_control
2019-08-26 16:05:11,470 [localhost-startStop-1] INFO  sql.DatabaseMetaData  - HHH000262: Table not found: event
2019-08-26 16:05:11,472 [localhost-startStop-1] INFO  sql.DatabaseMetaData  - HHH000262: Table not found: role
2019-08-26 16:05:11,473 [localhost-startStop-1] INFO  sql.DatabaseMetaData  - HHH000262: Table not found: role_access
2019-08-26 16:05:11,474 [localhost-startStop-1] INFO  sql.DatabaseMetaData  - HHH000262: Table not found: user
2019-08-26 16:05:11,476 [localhost-startStop-1] INFO  sql.DatabaseMetaData  - HHH000262: Table not found: user_role
2019-08-26 16:05:11,477 [localhost-startStop-1] INFO  sql.DatabaseMetaData  - HHH000262: Table not found: access_control
2019-08-26 16:05:11,478 [localhost-startStop-1] INFO  sql.DatabaseMetaData  - HHH000262: Table not found: event
2019-08-26 16:05:11,479 [localhost-startStop-1] INFO  sql.DatabaseMetaData  - HHH000262: Table not found: role
2019-08-26 16:05:11,480 [localhost-startStop-1] INFO  sql.DatabaseMetaData  - HHH000262: Table not found: role_access
2019-08-26 16:05:11,481 [localhost-startStop-1] INFO  sql.DatabaseMetaData  - HHH000262: Table not found: user
2019-08-26 16:05:11,482 [localhost-startStop-1] INFO  sql.DatabaseMetaData  - HHH000262: Table not found: user_role
2019-08-26 16:05:11,694 [localhost-startStop-1] INFO  ehcache.GrailsEhCacheManagerFactoryBean  - Initializing EHCache CacheManager
2019-08-26 16:05:13,497 [localhost-startStop-1] WARN  web.TokenService  - Authorization disabled
2019-08-26 16:05:15,110 [localhost-startStop-1] INFO  filter.AnnotationSizeOfFilter  - Using regular expression provided through VM argument net.sf.ehcache.pool.sizeof.ignore.pattern for IgnoreSizeOf annotation : ^.*cache\..*IgnoreSizeOf$
2019-08-26 16:05:15,114 [localhost-startStop-1] INFO  sizeof.AgentLoader  - Located valid 'tools.jar' at '/usr/lib/jvm/java-7-openjdk-amd64/jre/../lib/tools.jar'
2019-08-26 16:05:15,121 [localhost-startStop-1] INFO  sizeof.JvmInformation  - Detected JVM data model settings of: 64-Bit OpenJDK JVM with Compressed OOPs
2019-08-26 16:05:15,374 [localhost-startStop-1] INFO  sizeof.AgentLoader  - Extracted agent jar to temporary file /var/lib/tomcat7/temp/ehcache-sizeof-agent782285403080513554.jar
2019-08-26 16:05:15,374 [localhost-startStop-1] INFO  sizeof.AgentLoader  - Trying to load agent @ /var/lib/tomcat7/temp/ehcache-sizeof-agent782285403080513554.jar
2019-08-26 16:05:15,386 [localhost-startStop-1] INFO  impl.DefaultSizeOfEngine  - using Agent sizeof engine
2019-08-26 16:05:15,424 [localhost-startStop-1] INFO  impl.DefaultSizeOfEngine  - using Agent sizeof engine
2019-08-26 16:05:15,473 [localhost-startStop-1] INFO  context.GrailsConfigUtils  - [GrailsContextLoader] Grails application loaded.
2019-08-26 16:05:15,517 [localhost-startStop-1] INFO  conf.BootStrap  - Starting registry-web ver. 0.1.3-SNAPSHOT-bededf47611365f0a6d2bb87942e3b86c1e92d9f
2019-08-26 16:05:15,560 [localhost-startStop-1] INFO  web.ConfigService  - [environmentProperties, localProperties]
2019-08-26 16:05:15,568 [localhost-startStop-1] INFO  web.ConfigService  - resolved config:
2019-08-26 16:05:15,571 [localhost-startStop-1] INFO  web.ConfigService  - registry.url: http://192.168.56.102:5000/v2
2019-08-26 16:05:15,571 [localhost-startStop-1] INFO  web.ConfigService  - registry.auth: 
2019-08-26 16:05:15,571 [localhost-startStop-1] INFO  web.ConfigService  - registry.auth.key: /config/auth.key
2019-08-26 16:05:15,571 [localhost-startStop-1] INFO  web.ConfigService  - registry.readonly: false
2019-08-26 16:05:15,571 [localhost-startStop-1] INFO  web.ConfigService  - registry.trust_any_ssl: false
2019-08-26 16:05:15,571 [localhost-startStop-1] INFO  web.ConfigService  - registry.basic_auth: 
2019-08-26 16:05:15,571 [localhost-startStop-1] INFO  web.ConfigService  - registry.enabled: false
2019-08-26 16:05:15,571 [localhost-startStop-1] INFO  web.ConfigService  - registry.auth.enabled: false
2019-08-26 16:05:15,571 [localhost-startStop-1] INFO  web.ConfigService  - registry.context_path: 
2019-08-26 16:05:15,572 [localhost-startStop-1] INFO  web.ConfigService  - registry.auth.issuer: test-issuer
2019-08-26 16:05:15,572 [localhost-startStop-1] INFO  web.ConfigService  - registry.name: 192.168.56.102:5000
2019-08-26 16:05:15,573 [localhost-startStop-1] INFO  conf.BootStrap  - auth enabled: false
Aug 26, 2019 4:05:15 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Aug 26, 2019 4:05:15 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 17348 ms
[root@kubemaster docker_image]#

4. Docker Private Registry GUI 접속

Docker Private Registry를 위해 추가했던 Docker Imager가 저장되어 있는 것을 볼 수 있습니다.

Docker Registry Volume 관리

지금까지는 구축 관점에서 살펴보았는데 한가지 간과하고 있는 점이 있습니다. 바로 Container로 Registry를 구축할 경우 Registry Container가 Down 되면? Container의 휘발성으로 인해 모든 데이터가 삭제 되게 됩니다.

이와 같이 Container가 다운되었을 경우를 대비하여 Registry를 별도로 관리할 수 있는 Volume을 생성하고 이를 Container 내부와 공유할 수 있도록 설정하는 것이 중요합니다.

본 테스트에서는 Local Volume의 /root/data 경로를 Container 내부 registry 경로인 /var/lib/registry/docker/registry/v2와 매핑하여 Container가 다운 되더라도 재기동 시 Local volume에 저장된 데이터를 그대로 로딩할 수 있도록 설정하는 방법에 대해 알아보겠습니다.

말은 거창하지만 매우 간단합니다.

기존 기동 방법이었던

docker run --name MyPrivate-Docker -d -p 5000:5000 registry

에서

docker run --name MyPrivate-Docker -v /root/data:/var/lib/registry/docker/registry/v2 -d -p 5000:5000 registry

-v 옵션 부분만 추가하면 끝!

의미는 /root/data라는 경로의 local volume을 /var/lib/registry/docker/registry/v2라는 경로의 container volume에 마운트한다 정도로 생각하면 될 것 같네요.

[root@kubemaster ~]# docker run --name MyPrivate-Docker -v /root/data:/var/lib/registry/docker/registry/v2 -d -p 5000:5000 registry
f126cc6d0384342087248ce91c16f97a6b2510f0c0f2353cddbf15e96e655d0c
[root@kubemaster ~]# ls -la /root/data/
total 4
drwxr-xr-x   4 root root   39 Aug 27 01:39 .
dr-xr-x---. 10 root root 4096 Aug 27 01:38 ..
drwxr-xr-x   3 root root   20 Aug 27 01:39 blobs
drwxr-xr-x   3 root root   19 Aug 27 01:39 repositories
[root@kubemaster ~]# docker exec -it f126cc6d0384 /bin/sh
/ # ls -la /var/lib/registry/docker/registry/v2
total 0
drwxr-xr-x    4 root     root            39 Aug 26 16:39 .
drwxr-xr-x    3 root     root            16 Aug 26 16:41 ..
drwxr-xr-x    3 root     root            20 Aug 26 16:39 blobs
drwxr-xr-x    3 root     root            19 Aug 26 16:39 repositories
/ # 

위와 같이 두 공간이 동일하게 유지되는 것을 볼 수 있습니다. 이를 활용하면, 외부에서 사용하던 Docker Image를 이관할 때도 유용하게 사용할 수 있지 않을까 싶습니다.

 

지금까지 Docker Private Registry & GUI(Dashboard) 구축 과정에 대해 살펴보았습니다.

Nexus를 통해 통합 관리하는 측면에서의 장점이 있지만, 손쉽게 내부망에 Docker Registry를 구축하고 프로젝트 단위로 관리하기 위한 용도로는 docker registry 역시 활용도가 있을 듯 합니다.

728x90
반응형