도커 레지스트리(Docker registry) 설치 on EC2 인스턴스

5 분 소요


👉 해당 포스트를 읽는데 도움을 줍니다.

👉 이어서 읽기를 추천합니다.

0. 들어가면서

이번 포스트에선 도커 개인 이미지 저장소 구축과 관련된 내용을 정리하였습니다. 도커 허브(hub)는 공개 레포지토리는 무제한이지만, 개인 레포지토리는 1개만 제공합니다. 개인 레포지토리가 1개 이상 필요할 것으로 예상되어 프로젝트에서 사용할 비공개 저장소를 EC2 인스턴스 위에 하나 만들기로 하였습니다. 내용이 길어지는 바람에 이번 포스트에선 도커 레지스트리(registry) 설치와 관련된 내용만 다루겠습니다. 다음 포스트에선 설치한 도커 레지스트리를 비공개로 사용할 수 있도록 암호화하는 과정을 정리해보겠습니다.

아래 설명을 보면 터미널 명령어들이 섞여 나오기 때문에 헷갈릴 수 있으므로 접미사로 표시하였습니다.

  • on EC2 인스턴스 접미사가 붙은 것은 AWS EC2 인스턴스에서 작업한 내용입니다.
  • on Macbook 접미사가 붙은 것은 맥북에서 작업한 내용입니다.
도커 레지스트리 설치 작업 영역
  • EC2 인스턴스에 도커 개인 이미지 저장소를 구축하였습니다.

1. 도커 설치하기

맥북에는 도커가 설치되어 있고, 무료 티어 AWS EC2 인스턴스도 생성되어 있다는 가정하에 설명을 진행하겠습니다.

EC2 서비스 접속 on Macbook
  • EC2 서비스를 만들 때 발급받은 .pem 파일로 해당 서비스에 접속합니다.
  • 접속 시도 확인시 yes 입력합니다.
~ % ssh -i private-key.pem ec2-user@{your-own-ec2-service-address}.ap-northeast-1.compute.amazonaws.com
도커 설치 on EC2 인스턴스
  • 다음 명령어를 통해 도커를 설치합니다.
~ $ sudo yum install docker
도커 설치 성공 로그 on EC2 인스턴스
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Resolving Dependencies
--> Running transaction check
---> Package docker.x86_64 0:20.10.7-5.amzn2 will be installed
--> Processing Dependency: runc >= 1.0.0 for package: docker-20.10.7-5.amzn2.x86_64
--> Processing Dependency: libcgroup >= 0.40.rc1-5.15 for package: docker-20.10.7-5.amzn2.x86_64
--> Processing Dependency: containerd >= 1.3.2 for package: docker-20.10.7-5.amzn2.x86_64
--> Processing Dependency: pigz for package: docker-20.10.7-5.amzn2.x86_64
--> Running transaction check
---> Package containerd.x86_64 0:1.4.6-7.amzn2 will be installed
---> Package libcgroup.x86_64 0:0.41-21.amzn2 will be installed
---> Package pigz.x86_64 0:2.3.4-1.amzn2.0.1 will be installed
---> Package runc.x86_64 0:1.0.0-2.amzn2 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==============================================================================================================================
 Package                    Arch                   Version                            Repository                         Size
==============================================================================================================================
Installing:
 docker                     x86_64                 20.10.7-5.amzn2                    amzn2extra-docker                  42 M
Installing for dependencies:
 containerd                 x86_64                 1.4.6-7.amzn2                      amzn2extra-docker                  24 M
 libcgroup                  x86_64                 0.41-21.amzn2                      amzn2-core                         66 k
 pigz                       x86_64                 2.3.4-1.amzn2.0.1                  amzn2-core                         81 k
 runc                       x86_64                 1.0.0-2.amzn2                      amzn2extra-docker                 3.3 M

Transaction Summary
==============================================================================================================================
Install  1 Package (+4 Dependent packages)

Total download size: 69 M
Installed size: 285 M
Is this ok [y/d/N]: Y
Downloading packages:
(1/5): libcgroup-0.41-21.amzn2.x86_64.rpm                                                              |  66 kB  00:00:00     
(2/5): pigz-2.3.4-1.amzn2.0.1.x86_64.rpm                                                               |  81 kB  00:00:00     
(3/5): containerd-1.4.6-7.amzn2.x86_64.rpm                                                             |  24 MB  00:00:01     
(4/5): docker-20.10.7-5.amzn2.x86_64.rpm                                                               |  42 MB  00:00:01     
(5/5): runc-1.0.0-2.amzn2.x86_64.rpm                                                                   | 3.3 MB  00:00:00     
------------------------------------------------------------------------------------------------------------------------------
Total                                                                                          41 MB/s |  69 MB  00:00:01

...

Complete!

2. 도커 레지스트리(registry) 설치

개인 이미지 저장소로 도커 레지스트리를 가장 많이 사용하는 것 같습니다. EC2 인스턴스에 설치해보겠습니다.

[Docker Registry][docker-registry-link]
The Registry is a stateless, highly scalable server side application that stores and lets you distribute Docker images. The Registry is open-source, under the permissive Apache license.

2.1. 도커 레지스트리 컨테이너 생성

도커 명령어를 통해 쉽게 생성할 수 있습니다.

도커 레지스트리 이미지 PULL on EC2 인스턴스
~ $ sudo docker pull registry
Using default tag: latest
latest: Pulling from library/registry
79e9f2f55bf5: Pull complete 
0d96da54f60b: Pull complete 
5b27040df4a2: Pull complete 
e2ead8259a04: Pull complete 
3790aef225b9: Pull complete 
Digest: sha256:169211e20e2f2d5d115674681eb79d21a217b296b43374b8e39f97fcf866b375
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
도커 레지스트리 이미지 확인 on EC2 인스턴스
~ $ sudo docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
registry     latest    b8604a3fe854   2 months ago   26.2MB
도커 레지스트리 컨테이너 실행 on EC2 인스턴스
~ $ sudo docker run -d --name private-registry -p 5000:5000 registry
fe931afc77b0a65dedf75451c0fd598664fe0d5a077d6f5f8f4dc0d76b65faef

도커 레지스트리 컨테이너 실행 확인 on EC2 인스턴스

~ $ sudo docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS         PORTS                                       NAMES
fe931afc77b0   registry   "/entrypoint.sh /etc…"   6 seconds ago   Up 4 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   private-registry

2.2. EC2 인스턴스 포트 허용

외부에서 EC2 인스턴스에 접근할 수 있도록 포트를 열어야 합니다. AWS EC2 설정 대시보드에서 포트 접근을 설정할 수 있습니다.

Security Groups 설정 화면 이동
  • EC2 인스턴스 정보를 확인할 수 있는 대시보드에서 해당 인스턴스를 선택합니다.
    • EC2 > Instances > {container id} 화면
  • 선택한 EC2 인스턴스 상세 정보 화면 하단에 Security 탭에서 security groups를 선택합니다.

Inbound rule 설정 화면
  • Edit inbound rules 버튼을 눌러 인바운드(inbound) 규칙 설정 화면으로 이동합니다.

Inbound rule 추가
  • Custom TCP를 선택하여 포트 5000번을 허용합니다.
  • 소스(source)는 0.0.0.0/0으로 지정하여 모든 IP에서 접근을 허용합니다.

2.3. 도커 이미지 push & pull

이제 맥북에서 이미지를 만들어 push, pull 해보겠습니다. 간단한 테스트로 도커 허브에서 nginx 이미지를 다운받아서 EC2 인스턴스에 위치한 개인 저장소에 올리겠습니다.

nginx 이미지 pull from 도커 허브 on Macbook
~ % docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
5eb5b503b376: Already exists 
1ae07ab881bd: Already exists 
78091884b7be: Already exists 
091c283c6a66: Already exists 
55de5851019b: Already exists 
b559bad762be: Already exists 
Digest: sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
nginx 이미지 태그 변경 및 확인 on Macbook
  • {ec2-instance-public-ip}에는 본인의 EC2 인스턴스 공개 IP를 사용하면 됩니다.
~ % docker tag nginx {ec2-instance-public-ip}:5000/nginx

~ % docker images
REPOSITORY                TAG       IMAGE ID       CREATED      SIZE
{ec2-instance-public-ip}:5000/nginx   latest    c316d5a335a5   5 days ago   142MB
nginx                     latest    c316d5a335a5   5 days ago   142MB
이미지 push on Macbook
  • docker push 명령어를 통해 쉽게 이미지를 업로드할 수 있습니다.
~ % docker push {ec2-instance-public-ip}:5000/nginx
Using default tag: latest
The push refers to repository [{ec2-instance-public-ip}:5000/nginx]
762b147902c0: Pushed 
235e04e3592a: Pushed 
6173b6fa63db: Pushed 
9a94c4a55fe4: Pushed 
9a3a6af98e18: Pushed 
7d0ebbe3f5d2: Pushed 
latest: digest: sha256:bb129a712c2431ecce4af8dde831e980373b26368233ef0f3b2bae9e9ec515ee size: 1570
“Get “https://{ec2-instance-public-ip}:5000/v2/”: http: server gave HTTP response to HTTPS client” 에러
  • 도커의 push, pullhttps 기반으로 동작하는데 레지스트리는 http로 동작하여 문제가 발생합니다.
  • 도커 레지스트리를 이용하는 클라이언트의 daemon.json 파일에 insecure-registries 설정을 추가하면 해결됩니다.
    • 해당 포스트에서 도커 레지스트리를 이용하는 클라이언트는 맥북입니다.
    • 맥북 daemon.json 파일 위치 - ~/.docker/daemon.json
    • 리눅스 daemon.json 파일 위치 - /etc/docker/daemon.json
    • 윈도우 daemon.json 파일 위치 - C:\ProgramData\docker\config\daemon.json
{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "features": { 
    "buildkit": true
  },
  "insecure-registries": [
    "{ec2-instance-public-ip}:5000"
  ]
}
이미지 push 성공 여부 확인 on Macbook
  • curl 명령어를 통해 push 된 이미지를 확인할 수 있습니다.
~ % curl -X GET http://{ec2-instance-public-ip}:5000/v2/_catalog
{"repositories":["nginx"]}
이미지 pull from 레지스트리 on Macbook
  • 모든 이미지를 지운 상태로 레지스트리에서 이미지를 pull 받습니다.
  • 이미지가 정상적으로 받아졌는지 확인합니다.
~ % docker images -a
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

~ % docker pull {ec2-instance-public-ip}:5000/nginx
Using default tag: latest
latest: Pulling from nginx
5eb5b503b376: Already exists 
1ae07ab881bd: Already exists 
78091884b7be: Already exists 
091c283c6a66: Already exists 
55de5851019b: Already exists 
b559bad762be: Already exists 
Digest: sha256:bb129a712c2431ecce4af8dde831e980373b26368233ef0f3b2bae9e9ec515ee
Status: Downloaded newer image for {ec2-instance-public-ip}:5000/nginx:latest
{ec2-instance-public-ip}:5000/nginx:latest

~ % docker images -a                   
REPOSITORY                TAG       IMAGE ID       CREATED      SIZE
{ec2-instance-public-ip}:5000/nginx   latest    c316d5a335a5   5 days ago   142MB

REFERENCE

댓글남기기