레지스트리 (Registry)
도커 컨테이너, 이미지에 대한 내용은 어느 정도 알았으니, 이미지를 관리하는 방법에 대해서 알아본다.
지금까지는 로컬에서 이미지를 저장하고 컨테이너를 실행했다. 현재는 이미지를 로컬에 저장할 수 있지만 만약 다른 컴퓨터나 동료 개발자에게 공유하고 싶은 경우엔 어떻게 할까?
이때 사용하는 것이 레지스트리(Registry)이다.
레지스트리는 컨테이너 이미지를 저장하고 공유할 수 있는 원격 저장 공간이라고 생각하면 된다.
가장 유명한 레지스트리는 도커 허브이다. 도커 허브는 공개, 비공개로 레지스트리를 사용할 수 있다.
이외에도 여러 사설 레지스트리들을 제공하는 플랫폼들이 있으니 필요에 따라 사용하면 된다.
레지스트리 (Registry) vs 레포지토리 (Repository)
레지스트리와 레포지토리의 차이점은 무엇일까?
결론부터 말하자면 레지스트리 안에 레포지토리가 포함된다고 생각하면 된다. 레포지토리 내에는 이미지 프로젝트들의 형상 관리가 이루어지고 있다. 즉, 관련된 이미지들의 모음이다.
도커 허브로 레지스트리 사용하기
도커 계정으로 로그인하기
Docker Hub Container Image Library | App Containerization
Docker Hub Container Image Library | App Containerization
Increase your reach and adoption on Docker Hub With a Docker Verified Publisher subscription, you'll increase trust, boost discoverability, get exclusive data insights, and much more.
hub.docker.com
우선, 도커 허브에 접속해서 도커 계정으로 로그인한다. (도커 계정이 없다면 가입한다.)
해당 계정으로 CLI 상에서 로그인한다.
$ docker login
Log in with your Docker ID or email address to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com/ to create one.
You can log in with your password or a Personal Access Token (PAT). Using a limited-scope PAT grants better security and is required for organizations using SSO. Learn more at https://docs.docker.com/go/access-tokens/
Username: <ID>
Password:
Login Succeeded
연습용 이미지 빌드
연습용 이미지를 빌드하기 위해 git repo를 clone 해온다.
$ git clone https://github.com/dockersamples/helloworld-demo-node
Cloning into 'helloworld-demo-node'...
remote: Enumerating objects: 61, done.
remote: Counting objects: 100% (20/20), done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 61 (delta 14), reused 7 (delta 7), pack-reused 41
Receiving objects: 100% (61/61), 18.89 KiB | 3.15 MiB/s, done.
Resolving deltas: 100% (18/18), done.
클론해온 디렉토리로 이동해서 이미지를 빌드한다. 이때 저장소 명을 본인의 <USER_NAME>
으로 변경해 준다.
$ cd helloworld-demo-node/
$ docker build -t <USER_NAME>/docker-test .
[+] Building 11.5s (13/13) FINISHED docker:desktop-linux
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.10kB 0.0s
=> resolve image config for docker-image://docker.io/docker/dockerfile:1 2.4s
=> [auth] docker/dockerfile:pull token for registry-1.docker.io 0.0s
=> docker-image://docker.io/docker/dockerfile:1@sha256:e87caa74dcb7d46cd820352bfea12591f3dba3ddc4285e19c7dcd13359f7cefd 1.2s
=> => resolve docker.io/docker/dockerfile:1@sha256:e87caa74dcb7d46cd820352bfea12591f3dba3ddc4285e19c7dcd13359f7cefd 0.0s
=> => sha256:b700940304c1766f2ca98905ff8068aef048ed6f2553c2fe0e9cd88fea2364af 1.26kB / 1.26kB 0.0s
=> => sha256:040331aba5a634087ae5dfc311b8e12d96a2d377dc123c9a41010ce2e1ce07ed 11.34MB / 11.34MB 1.1s
=> => sha256:e87caa74dcb7d46cd820352bfea12591f3dba3ddc4285e19c7dcd13359f7cefd 8.40kB / 8.40kB 0.0s
=> => sha256:662a65554608a3dffb02b59f9dad2c1f61ab0e8705da0999d5e02d0388c19380 482B / 482B 0.0s
=> => extracting sha256:040331aba5a634087ae5dfc311b8e12d96a2d377dc123c9a41010ce2e1ce07ed 0.1s
=> [internal] load metadata for docker.io/library/node:21.6.2-alpine 2.3s
=> [auth] library/node:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [stage-0 1/4] FROM docker.io/library/node:21.6.2-alpine@sha256:d3271e4bd89eec4d97087060fd4db0c238d9d22fcfad090a73fa9b512869988 5.1s
=> => resolve docker.io/library/node:21.6.2-alpine@sha256:d3271e4bd89eec4d97087060fd4db0c238d9d22fcfad090a73fa9b5128699888 0.0s
=> => sha256:d3271e4bd89eec4d97087060fd4db0c238d9d22fcfad090a73fa9b5128699888 1.43kB / 1.43kB 0.0s
=> => sha256:523bcf3e0ea153770f80e7dd17baa090c885c9e4df8494452453d41c1ed48f61 1.16kB / 1.16kB 0.0s
=> => sha256:1e898ee95cff75fd7d134a9a28e0232648eb65370720d5a21a30d8bfa8b5557f 7.15kB / 7.15kB 0.0s
=> => sha256:bca4290a96390d7a6fc6f2f9929370d06f8dfcacba591c76e3d5c5044e7f420c 3.35MB / 3.35MB 0.6s
=> => sha256:9dbc8bdc72a184d6d5be7f234305b89cf23e46d38d8b2f3d700fb161de83ca4c 43.24MB / 43.24MB 4.3s
=> => sha256:3f3d29790238761c95da49826d1e7bf3dfc71329604b25232c5b8e9fc70d930d 2.37MB / 2.37MB 1.0s
=> => extracting sha256:bca4290a96390d7a6fc6f2f9929370d06f8dfcacba591c76e3d5c5044e7f420c 0.1s
=> => sha256:9f348378407ffaf11909ba6ef92861146998bc2b55c63e7ee85b7b52bc2d017f 447B / 447B 1.0s
=> => extracting sha256:9dbc8bdc72a184d6d5be7f234305b89cf23e46d38d8b2f3d700fb161de83ca4c 0.7s
=> => extracting sha256:3f3d29790238761c95da49826d1e7bf3dfc71329604b25232c5b8e9fc70d930d 0.0s
=> => extracting sha256:9f348378407ffaf11909ba6ef92861146998bc2b55c63e7ee85b7b52bc2d017f 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 67.49kB 0.0s
=> [stage-0 2/4] WORKDIR /usr/src/app 0.1s
=> [stage-0 3/4] RUN --mount=type=bind,source=package.json,target=package.json --mount=type=bind,source=package-lock.json,tar 0.3s
=> [stage-0 4/4] COPY . . 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:2ab29ed23a98e04b9d7f2eab9092ec4b065328a79cc2143ff8ff6c8c845e39c3 0.0s
=> => naming to docker.io/<USER_NAME>/docker-test 0.0s
2 warnings found (use --debug to expand):
- LegacyKeyValueFormat: "ENV key=value" should be used instead of legacy "ENV key value" format (line 12)
- JSONArgsRecommended: JSON arguments recommended for CMD to prevent unintended behavior related to OS signals (line 36)
What's next:
View a summary of image vulnerabilities and recommendations → docker scout quickview
💡 마지막 구두점(.)의 의미는 build를 진행할 때 DockerFile을 찾는 경로를 의미한다.
docker images
을 실행하면 새로 빌드된 이미지가 리스트에 나온다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<USER_NAME>/docker-test latest 2ab29ed23a98 About a minute ago 139MB
ubuntu 20.04 583f1722e16e 5 weeks ago 65.7MB
docker/welcome-to-docker latest 648f93a1ba7d 8 months ago 19MB
연습용 이미지 컨테이너 실행
이제 레지스트리에 push 하기 앞서 이미지가 정상적인지 컨테이너로 실행하여 확인해 본다. docker run
을 사용한다.
$ docker run -d -p 8080:8080 <USER_NAME>/docker-test
60fa215e275b5e5e65d331a226fedd49d191897d2b1016c5417ac013450119df
💡 -d 옵션은 deatched, -p 옵션은 포트포워딩을 의미한다.
http://localhost:8080 에 접속하면 귀여운 도커 아이콘이 보인다.
정상적으로 동작하는 것을 확인했으면 컨테이너는 종료시켜 준다.
docker ps
로 컨테이너 ID 확인 후 docker rm -f <CONTAINER_ID>
를 실행하여 컨테이너를 종료시킨다.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
60fa215e275b <USER_NAME>/docker-test "docker-entrypoint.s…" 8 minutes ago Up 8 minutes 0.0.0.0:8080->8080/tcp clever_shockley
$ docker rm -f 60fa215e275b
60fa215e275b
이미지 태그 달기
먼저 이미지를 빌드하게 되면 디폴트로 latest
태그를 가지게 된다. 이제 이 태그를 버전 관리를 위해 1.0
으로 변경해 본다.
그리고 이미지 목록을 확인하면 기존 latest
태그 이외에도 1.0
태그를 가진 새로운 이미지가 생성된다. (다만, 파일 시스템에 아무런 변화가 없었으므로 IMAGE ID는 동일하다)
$ docker tag <USER_NAME>/docker-test <USER_NAME>/docker-test:1.0
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<USER_NAME>/docker-test 1.0 2ab29ed23a98 7 minutes ago 139MB
<USER_NAME>/docker-test latest 2ab29ed23a98 7 minutes ago 139MB
ubuntu 20.04 583f1722e16e 5 weeks ago 65.7MB
docker/welcome-to-docker latest 648f93a1ba7d 8 months ago 19MB
레지스트리에 푸시하기
docker push
를 사용해서 도커 허브 레지스트리에 새로 빌드한 이미지를 푸시해본다.
docker push <USER_NAME>/docker-test:1.0
The push refers to repository [docker.io/<USER_NAME>/docker-test]
120fde230b43: Pushed
fbf4f1e851b2: Pushed
58cbe21bb5ae: Pushed
5d66c6f55abe: Mounted from library/node
005305d5255d: Mounted from library/node
7beab2af1838: Mounted from library/node
b09314aec293: Mounted from library/node
1.0: digest: sha256:b232e3e85f04b73c00aa0b91bd771d4235fc26241b7dd96b904ac7988a71c002 size: 1781
본인의 도커 허브 계정으로 로그인한 후 레포지토리를 확인해면 업로드 된 이미지를 확인할 수 있다.
Refrences
'Docker' 카테고리의 다른 글
[Docker] 도커(docker) 시작하기 (2) - 이미지(image) (0) | 2024.07.09 |
---|---|
[Docker] 도커(docker) 시작하기 (1) - 컨테이너(container) (1) | 2024.07.04 |
[Docker] mac에 docker 설치 (feat. docker-compose) (0) | 2024.06.26 |