3 분 소요

 안녕하세요 마개입니다.
AWS EC2 서버를 이용하여 Docker의 Registry를 만들려고 합니다.


image


EC2의 서버 스펙은 다음과 같이 하였습니다.

  • OS: Ubuntu20.04
  • Instance: t2.medium (2 vCPU, 4 GiB Memory)
  • Storage: 40 GiB

 대략적인 테스트와 아직은 도커 이미지가 적기 때문에 작은 스펙을 이용합니다. 도커 이미지가 많으신 분들은 더 좋은 스펙을 이용하세요.



Docker & Docker Compose 설치

 먼저 EC2에 Docker가 없기 때문에 DockerDocker 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

image


이미지가 정상적으로 다운로드되었는지 확인합니다.

1
$ docker images

image


이미지가 있다면 이제 로컬 테스트를 위해 컨테이너를 생성합니다.

1
2
$ docker run -d -p 5000:5000 --name docker-registry registry
$ docker ps


image

컨테이너를 생성하였다면 제대로 생성이 되었는지 확인해봅니다.


1
$ curl localhost:5000/v2/_catalog

현재 Registry에 등록되어 있는 이미지가 있는지 확인해봅니다.

image

결과를 보면 현재는 없는 것을 확인하실 수 있습니다.



테스트용 이미지 생성 (로컬)

 이제 테스트를 해보기 위해 서버에서 이미지를 하나 만든 후 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”라는 태그로 이미지를 생성(빌드)해보겠습니다.

image


 이미지를 확인하면 “docker_hello”라는 Repository의 컨테이너가 생성된 것을 확인하실 수 있습니다. 이제 컨테이너를 생성해서 해당 이미지가 잘 동작하는지 확인합니다.


1
$ docker run docker_hello

image

컨테이너가 정상적으로 실행되었다는 것을 확인하실 수 있습니다.



테스트용 이미지 Push (로컬)

 이미지를 Registry에 Push하기 위해서는 이미지 태그를 변경해야 합니다. (위에서는 이미지가 정상적으로 작동하는지 보기 위해 임의로 “docker_hello”로 작성하였지만 Registry에 등록하기 위해서는 태그를 맞춰줘야 합니다.)

1
2
$ docker tag docker_hello localhost:5000/docker_hello
$ docker images

image


태그를 맞게 생성하였다면 이제 Push합니다.

1
$ docker push localhost:5000/docker_hello

image

위와 같이 정상적으로 Push되었다면 Registry에 정상적으로 등록되어 있는지 확인합니다.


1
$ curl localhost:5000/v2/_catalog

image

정상적으로 등록된 것을 확인하실 수 있습니다.



테스트용 이미지 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

image


1
$ docker images

image

이미지가 제대로 다운로드된 것을 확인하실 수 있습니다.



테스트용 이미지 Push (원격)

 이렇게 Docker Registry는 만들었는데 우리가 개발을 할 때 각자의 PC에서 개발을 하지 Registry 서버에서 직접 하지는 않습니다. 그렇기 때문에 이번에는 각자의 PC에서 진행을 해보겠습니다. 먼저 각자의 PC에서 Registry에 담겨있는 repository를 확인하겠습니다.

1
$ curl [Registry IP]:5000/v2/_catalog

image

아까 만들어놓았던 것이 있는 것을 확인하실 수 있습니다.


이젠 위에서 진행했던 Dockerfile을 이용하여 이미지를 먼저 생성하겠습니다.

1
$ docker build -t [Registry IP]:5000/docker_test .

이번에는 아까와 다르게 “docker_test”라는 이름으로 진행합니다. 이렇게 생성된 이미지를 원격 Registry로 Push해봅니다.


1
$ docker push [Registry IP]:5000/docker_test

image

그러면 위와 같이 에러가 발생할 수 있습니다. (저는 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

image

docker_test가 잘 올라간 것을 확인하실 수 있습니다.