티스토리 뷰
이번 포스팅에서는 간단하게 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 역시 활용도가 있을 듯 합니다.
'③ 클라우드 > ⓓ Docker' 카테고리의 다른 글
[Docker Command] docker 명령어 뽀개기 (1) | 2019.09.04 |
---|---|
[Docker Insecure Registry] "server gave HTTP response to HTTPS client" (0) | 2019.08.27 |
[Docker Performance Monitoring] docker stats (0) | 2019.08.26 |
[Docker] 기동중인 도커 컨테이너에 파일 복사 및 스냅샷 생성 (0) | 2019.07.19 |
[Docker] 폐쇄망에 Docker 구축하기 (3) | 2019.05.21 |
- Total
- Today
- Yesterday
- Da
- 마이크로서비스 아키텍처
- JEUS7
- wildfly
- MSA
- apache
- openstack token issue
- jeus
- API Gateway
- webtob
- SA
- Docker
- SWA
- openstack tenant
- aws
- OpenStack
- nodejs
- 마이크로서비스
- 아키텍처
- Architecture
- node.js
- JBoss
- git
- aa
- JEUS6
- 오픈스택
- kubernetes
- k8s
- 쿠버네티스
- TA
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |