EC2 인스턴스에 도커 레지스트리(Docker registry) 설치
RECOMMEND POSTS BEFORE THIS
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 인스턴스에 설치해 보자.
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.
도커 레지스트리 컨테이너는 도커 명령어를 통해 쉽게 생성할 수 있다.
도커 레지스트리 이미지 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
2.1. 도커 레지스트리 컨테이너 실행 확인 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 대시보드에서 해당 인스턴스의 시큐리티 그룹(security group)을 설정해야 한다.
EC2 > Instances > {container id}화면으로 이동한다.- 인스턴스 정보를 확인할 수 있는 대시보드에서 해당 인스턴스를 선택한다.
- 선택한 EC2 인스턴스 상세 정보 화면 하단의
Security탭에서security groups를 선택한다.
컨테이너에 접근하는 트래픽을 제어하는 인바운드 룰(inbound rule)을 변경한다. Edit inbound rules 버튼을 눌러 인바운드(inbound) 규칙 설정 화면으로 이동한다.
인바운드 룰을 추가한다.
Custom TCP를 선택하여 포트 5000번을 허용한다.- 소스(source)는
0.0.0.0/0으로 지정하여 모든 IP에서 접근을 허용한다.
2.3. 도커 이미지 push & pull
이제 맥북에서 이미지를 만들어 push, pull 해 보자.
nginx 이미지 pull from 도커 허브 on Macbook
간단한 테스트를 위해 도커 허브에서 nginx 이미지를 다운로드한다.
~ % 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
다운로드한 nginx 이미지를 EC2 인스턴스의 도커 레지스트리에 올린다.
{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
http: server gave HTTP response to HTTPS client 에러
도커의 push, pull은 https 기반으로 동작하지만, 레지스트리는 http로 동작하여 문제가 발생한다. Get "https://{ec2-instance-public-ip}:5000/v2/": http: server gave HTTP response to HTTPS client라는 에러 메시지를 볼 수 있다. 도커 레지스트리를 이용하는 클라이언트의 daemon.json 파일에 insecure-registries 설정을 추가하면 해결된다.
각 운영체제마다 daemon.json 파일의 위치가 다르다. 이번 글에서 도커 레지스트리를 이용하는 클라이언트는 맥북이다.
- 맥북의 파일 위치 -
~/.docker/daemon.json - 리눅스의 파일 위치 -
/etc/docker/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 on Macbook
개인 도커 레지스트리에서 이미지를 다운로드해 보자. 우선 로컬 이미지 목록을 확인한다.
~ % docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
모든 이미지를 지운 상태에서 레지스트리의 이미지를 pull한다.
~ % 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
RECOMMEND NEXT POSTS
- 비공개 도커 레지스트리(Private docker registry) 만들기
- 젠킨스(Jenkins) 파이프라인을 통해 EC2 인스턴스에 서비스 배포
- 젠킨스(Jenkins) 슬랙(Slack) 알림 메시지 전송
댓글남기기