Categories
Docker 서버

실무에서 사용하기 위한 docker 활용법 – private docker registry 구축하기

docker 를 알아보다 보면 슬슬 실무에 적용해 보고 싶어지는데요. 실제로 배포등을 처리하려면 docker hub 가 필요합니다. 하지만 docker hub 는 계정당 1개만 private 저장소를 지원하는데요.

이를 해결하기 위해서는 자체적으로 구축한 도커 저장소가 있는게 아무래도 편하겠죠?

1. registry 서비스 띄우기

먼저 registry 도커이미지를 Docker hub에서 받습니다.

$ docker pull registry:latest
Using default tag: latest
latest: Pulling from library/registry
cd784148e348: Pull complete 
0ecb9b11388e: Pull complete 
918b3ddb9613: Pull complete 
5aa847785533: Pull complete 
adee6f546269: Pull complete 
Digest: sha256:1cd9409a311350c3072fe510b52046f104416376c126a479cef9a4dfe692cf57
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest

docker run 명령으로 registry 서비스 시작합니다.
컨테이너 이름을 private-registry, 포트맵핑은 5000 -> 5000 으로 설정하였습니다.

$ docker run --name private-registry -d -p 5000:5000 registry
1359ea5239fdbf59f72070a546847a2c0fcdda1bee3d39948890c990ea306c99

서비스가 제대로 떴는지 확인해 봅니다.

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
1359ea5239fd        registry            "/entrypoint.sh /etc…"   9 minutes ago       Up 9 minutes        0.0.0.0:5000->5000/tcp   private-registry

이렇게 보인다면 제대로 서비스가 실행중이라고 할 수 있습니다.


2. 테스트를 위한 도커 이미지 만들기

이제 테스트를 위한 간단한 도커 이미지를 만들어 보겠습니다.

여기서는 베이스 이미지로 도커에서 많이 사용하는 경량 리눅스 배포본 Alpine 을 기반으로 만들어 보겠습니다.

$ mkdir myapp
$ cd myapp
$ vi Dockerimage

아래와 같이 도커이미지 파일을 작성합니다. 간단히 ‘hello world!’ 를 콘솔에 출력하는 간단한 이미지입니다.

FROM alpine

CMD echo 'hello world!'

Dockerimage 파일을 작성했으면 도커 이미지를 생성합니다.

$ docker build -t doogle/myapp .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM alpine
 ---> 3f53bb00af94
Step 2/2 : CMD echo 'hello world!'
 ---> Using cache
 ---> 0e8664b14592
Successfully built 0e8664b14592
Successfully tagged doogle/myapp:latest

도커 이미지가 제대로 생성되었는지 확인힙니다. 와 용량이 정말 작네요. Ubuntu 18.04의 경우 80MiB 이상 잡아먹습니다.

$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
doogle/myapp                 latest              0e8664b14592        3 minutes ago       4.41MB

도커 이미지를 만들었다면 이제 테스트로 실행해 보겠습니다.

$ docker run doogle/myapp
hello world!

제대로 여기까지 왔다면 위와같이 ‘hello world!’를 출력하게 됩니다.


3. 로컬 저장소에 내가 만든 도커 이미지 등록하기

이미지를 도커 레지스트리에 올리기 위해서는 도커 레지스트리 주소기반의 동일한 내용의 이미지를 먼저 만들어야 합니다.

$ docker tag doogle/myapp localhost:5000/myapp

도커 이미지 목록을 보면 리포지토리값만 다른 이미지를 생성합니다.

$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
localhost:5000/myapp           latest              0e8664b14592        20 minutes ago      4.41MB
doogle/myapp                 latest              0e8664b14592        20 minutes ago      4.41MB

이제 새로 만든 이미지를 도커 레지스트리에 등록합니다.

$ docker push localhost:5000/myapp
The push refers to repository [localhost:5000/myapp]
7bff100f35cb: Pushed 
latest: digest: sha256:136dfdf37f0554f750aa8dc8f63947b45ae5aa7731ec94ef9df77e5969549200 size: 528

제대로 등록이되었는지 알고 싶다면 다음 링크를 열어보면 확인 할 수 있다.

http://localhost:5000/v2/_catalog

웹브라우저에서 아래와 같이 나오면 정상이다.

{"repositories":["myapp"]}

http://localhost:5000/v2/myapp/tags/list

웹브라우져에서 아래와 같이 나오면 정상이다.

{"name":"myapp","tags":["latest"]}


4. 로컬 저장소에 있는 도커 이미지 가져오기

이제 로컬 저장소를 Docker Hub 처럼 사용해 보겠습니다.

우선 기존에 테스트로 만든 컨테이너와 이미지들을 삭제해야 합니다.

myapp 의 경우 바로 실행후 종료되기 때문에 다음과 같이 -a 를 추가로 인자를 주어야 확인 할 수 있습니다.

$ docker ps -a
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS                      PORTS                    NAMES
e2a40d4d8bef        doogle/myapp           "/bin/sh -c 'echo 'h…"   40 minutes ago      Exited (0) 40 minutes ago                            xenodochial_kepler

도커 컨테이너를 삭제합니다.

$ docker rm e2a40d4d8bef
e2a40d4d8bef

도커 이미지를 확인합니다.

$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
doogle/myapp                 latest              0e8664b14592        About an hour ago   4.41MB
localhost:5000/myapp         latest              0e8664b14592        About an hour ago   4.41MB

다른 이미지들도 있겠지만 지워야 할 건 아까 만든 위의 2개입니다.

$ docker rmi doogle/myapp localhost:5000/myapp
Untagged: doogle/myapp:latest
Untagged: localhost:5000/myapp:latest
Untagged: localhost:5000/myapp@sha256:136dfdf37f0554f750aa8dc8f63947b45ae5aa7731ec94ef9df77e5969549200

이제 로컬 저장소에 있는 이미지를 실행해보겠습니다.

$ docker run localhost:5000/myapp
Unable to find image 'localhost:5000/myapp:latest' locally
latest: Pulling from myapp
cd784148e348: Already exists 
Digest: sha256:136dfdf37f0554f750aa8dc8f63947b45ae5aa7731ec94ef9df77e5969549200
Status: Downloaded newer image for localhost:5000/myapp:latest
hello world!

이미지가 없기 때문에 로컬 저장소에서 받아와서(pull) 실행하고 있습니다.

로컬 저장소는 사실 실무에서 사용할 일은 거의 없습니다. 이제 원격 저장소를 구축하는 방법을 알아보겠습니다.

5. 원격 도커 이미지 저장소 구축하기

원격 저장소를 구축하는 것도 기본적으로 로컬 저장소와 비슷합니다. 일단 1번을 그대로 원격 서버에서 진행합니다.
다만 registry 는 로컬과는 달리 원격의 경우 반드시 https 로만 접속을 허용합니다. 무료 let’s encrypt SSL인증서나 기타 유료 인증서를 발급받아 처리햐야 합니다. 인증서와 인증관련해서는 다음 기회에 ^^