Docker Private Registry 만들기 (AWS EC2 Ubuntu)
안녕하세요 마개입니다.
AWS EC2 서버를 이용하여 Docker의 Registry를 만들려고 합니다.
EC2의 서버 스펙은 다음과 같이 하였습니다.
- OS: Ubuntu20.04
- Instance: t2.medium (2 vCPU, 4 GiB Memory)
- Storage: 40 GiB
대략적인 테스트와 아직은 도커 이미지가 적기 때문에 작은 스펙을 이용합니다. 도커 이미지가 많으신 분들은 더 좋은 스펙을 이용하세요.
Docker & Docker Compose 설치
먼저 EC2에 Docker가 없기 때문에 Docker
와 Docker Compose
를 설치해야 합니다. Docker를 설치하는 것은 간단히 명령어로 대체하겠습니다. (이 때의 Docker Compose는 2.0.1 버전을 이용하였습니다.)
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
32
# Docker 설치 (Ubuntu)
$ sudo apt-get update
# 필수 패키지 설치
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
# GPG Key 인증
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Docker Repository 등록
$ sudo add-apt-repository \
"deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
$ sudo systemctl enable docker
$ sudo usermod -aG docker $USER
# Version 확인
$ docker -v
# Docker Compose 설치 (Ubuntu)
$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.0.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
$ docker-compose -v
Docker Registry 컨테이너 생성
사용하고자 하는 Registry
이미지를 먼저 서버에 생성하겠습니다.
1
$ docker pull registry
이미지가 정상적으로 다운로드되었는지 확인합니다.
1
$ docker images
이미지가 있다면 이제 로컬 테스트를 위해 컨테이너를 생성합니다.
1
2
$ docker run -d -p 5000:5000 --name docker-registry registry
$ docker ps
컨테이너를 생성하였다면 제대로 생성이 되었는지 확인해봅니다.
1
$ curl localhost:5000/v2/_catalog
현재 Registry에 등록되어 있는 이미지가 있는지 확인해봅니다.
결과를 보면 현재는 없는 것을 확인하실 수 있습니다.
테스트용 이미지 생성 (로컬)
이제 테스트를 해보기 위해 서버에서 이미지를 하나 만든 후 Registry에 등록해보겠습니다.
1
2
3
FROM ubuntu:18.04
MAINTAINER magae
CMD echo 'hello'
Ubuntu 이미지를 이용해서 테스트용 Dockerfile을 제작합니다.
1
2
$ docker build -t docker_hello .
$ docker images
“docker_hello”라는 태그로 이미지를 생성(빌드)해보겠습니다.
이미지를 확인하면 “docker_hello”라는 Repository의 컨테이너가 생성된 것을 확인하실 수 있습니다. 이제 컨테이너를 생성해서 해당 이미지가 잘 동작하는지 확인합니다.
1
$ docker run docker_hello
컨테이너가 정상적으로 실행되었다는 것을 확인하실 수 있습니다.
테스트용 이미지 Push (로컬)
이미지를 Registry에 Push하기 위해서는 이미지 태그를 변경해야 합니다. (위에서는 이미지가 정상적으로 작동하는지 보기 위해 임의로 “docker_hello”로 작성하였지만 Registry에 등록하기 위해서는 태그를 맞춰줘야 합니다.)
1
2
$ docker tag docker_hello localhost:5000/docker_hello
$ docker images
태그를 맞게 생성하였다면 이제 Push합니다.
1
$ docker push localhost:5000/docker_hello
위와 같이 정상적으로 Push되었다면 Registry에 정상적으로 등록되어 있는지 확인합니다.
1
$ curl localhost:5000/v2/_catalog
정상적으로 등록된 것을 확인하실 수 있습니다.
테스트용 이미지 Pull (로컬)
Registry에 등록한 이미지를 Pull하기 전에 기존에 만들었던 이미지와 컨테이너를 삭제합니다.
1
2
3
4
5
6
7
8
9
10
11
$ docker ps -a
# 컨테이너 이름은 생성할 때 지정하지 않았기 때문에 각자 다릅니다. 위의 명령어를 입력해서 나온 컨테이너 중에 테스트용 컨테이너에 해당하는 이름을 찾아 입력합니다.
$ docker rm unruffled_fermi
$ docker images
$ docker rmi localhost:5000/docker_hello:latest
$ docker rmi docker_hello:latest
# Ubuntu의 경우 테스트 이미지를 만들 때 같이 생성되었기 때문에 삭제합니다.
$ docker rmi ubuntu:18.04
이미지와 컨테이너를 모두 삭제했다면 Registry에 등록되어 있는 이미지를 다운로드합니다.
1
$ docker pull localhost:5000/docker_hello:latest
1
$ docker images
이미지가 제대로 다운로드된 것을 확인하실 수 있습니다.
테스트용 이미지 Push (원격)
이렇게 Docker Registry는 만들었는데 우리가 개발을 할 때 각자의 PC에서 개발을 하지 Registry 서버에서 직접 하지는 않습니다. 그렇기 때문에 이번에는 각자의 PC에서 진행을 해보겠습니다. 먼저 각자의 PC에서 Registry에 담겨있는 repository를 확인하겠습니다.
1
$ curl [Registry IP]:5000/v2/_catalog
아까 만들어놓았던 것이 있는 것을 확인하실 수 있습니다.
이젠 위에서 진행했던 Dockerfile을 이용하여 이미지를 먼저 생성하겠습니다.
1
$ docker build -t [Registry IP]:5000/docker_test .
이번에는 아까와 다르게 “docker_test”라는 이름으로 진행합니다. 이렇게 생성된 이미지를 원격 Registry로 Push해봅니다.
1
$ docker push [Registry IP]:5000/docker_test
그러면 위와 같이 에러가 발생할 수 있습니다. (저는 IP를 hosts에 따로 등록하여 이용하였습니다.)
이럴 때 Docker에 insecure-registries를 설정해야 합니다.
1
2
# 파일이 없으신 분은 생성합니다.
$ vim /etc/docker/daemon.json
1
2
3
{
"insecure-registries": ["Registry IP:5000"]
}
설정을 한 후에 docker를 다시 실행시켜줍니다.
1
2
$ systemctl daemon-reload
$ systemctl restart docker
완료되었으면 다시 Push를 진행합니다.
1
$ docker push [Registry IP]:5000/docker_test
이상없이 Push가 되었다면 다시 Repository를 확인합니다.
1
$ curl [Registry IP]:5000/v2/_catalog
docker_test가 잘 올라간 것을 확인하실 수 있습니다.