KUICS

KUICS

Docker 3

Chapter 3 이미지 레지스트리와 도커허브

1. 이미지 레지스트리란

응용프로그램을 컨테이너 이미지로 패키징하는 것은 docker image build 명령어를 이용해 손쉽게 할 수 있습니다. 하지만 이를 통해 만들어진 이미지는 로컬 캐쉬에만 존재합니다. 이미지를 잘 사용하려면 다른 컴퓨터에서도 사용할 수 있어야 합니다. 이미지 레지스트리는 공유된 이미지의 주소를 의미합니다. 이 주소를 사용해서 자신이 만든 이미지를 푸시하거나 다른 사람이 만든 이미지를 pul할 수 있습니다 (GitHub에서 푸시와 풀하는 것처럼). 이미지 레지스트리는 도커의 주요한 기능 중 하나입니다.

도커허브는 Docker, Inc.가 관리하는 공용 무료 이미지 레지스트리입니다. 도커허브에는 90만개가 넘는 이미지가 존재하고, 120억번이 넘는 이미지 풀이 일어났습니다. 누구나 도커허브에 이미지를 푸시할 수 있으며 공식적인 이미지도 존재합니다.

도커허브에는 다양한 기능이 있고, 기본으로 지정되어 있는 저장소이기 때문에 처음에는 도커허브를 사용하는 것이 좋습니다. 하지만, 써드파티 저장소를 사용하고 싶다면 사용할 수 있습니다. 이 챕터에서는 도커허브를 사용하도록 하겠습니다.

2. 도커허브 사용법

도커허브는 Docker, Inc.에서 제공하는 공용 이미지 레지스트리입니다. 도커허브는 도커엔진의 기본 레지스트리입니다. 도커허브는 계정이 없더라도 이미지를 풀할 수 있습니다. 지금까지는 별다른 설정없이 도커허브에서 다운로드 받은 이미지를 이용해 컨테이너를 실행시켰습니다.

도커허브에 이미지를 푸시하기 위해서는 계정이 필요합니다. 도커허브에서 무료 계정을 만들 수 있습니다. 사용자명은 이미지를 빌드할 때 레포지토리 이름의 사용자명 부분과 같아야 합니다 (만약 사용자명이 kuicsofficial이라면 kuicsofficial이 앞에 붙은 이미지만 푸시할 수 있습니다.). 도커허브에 private 레포지토리를 만들 수 있습니다 (무료계정은 하나의 private 레포지토리만 만들 수 있습니다.).

레지스트리와 레포지토리는 다른 것입니다. 레지스트리는 여러개의 레포지토리가 모인 것입니다.

도커허브에서 계정을 만든 뒤에 docker login명령어를 통해 로그인할 수 있습니다.

Result of docker login

이제 image push 명령어를 사용해 이미지를 푸시할 수 있습니다.

Result of image push

푸시는 만약 레지스트리에 같은 레이어가 있다면, 푸시하지 않습니다. 위의 예시에서 기초 이미지를 공식 우분투 이미지에서 mount하고 있습니다. 만약 도커파일을 수정해서 푸시하면 밑의 레이어는 이미 레지스트리에 있으므로 맨 위의 레이어만 푸시합니다.

도커허브에 레포지토리를 생성하면, docker container run에 이미지 태그를 사용해 컨테이너를 실행시킬 수 있습니다(여기서는 docker container run kuicsofficial/echoserver).

이미지의 용량은 수 메가바이트에서 몇백 기가바이트일 수도 있습니다. 용량이 큰 이미지는 풀할 때 오래 걸립니다. 따라서 컨테이너를 실행시키기 위한 시간이 짧게는 수 초에서 길게는 몇 분까지도 걸릴 수 있습니다. 이러한 현상을 방지하기 위해서 이미지를 풀해서 필요해지기 전에 미리 다운로드 받아 놓을 수 있습니다.

Result of image pull

여기서는 이미 최신 이미지가 로컬 캐시에 있으므로 Image up-to-date라고 나옵니다.

3. 태그와 이미지 버전

지금까지는 이미지의 태그를 특별히 지정하지 않고 사용했습니다. 도커의 이미지 레포지토리는 기본적으로 {user}/{app}형태를 사용합니다. 이미지의 태그는 보통 버전을 지정하기 위해 사용합니다. 태그는 {user}/{app}:{tag}의 형태로 지정할 수 있습니다. 따로 태그를 지정하지 않으면 latest태그로 지정됩니다. docker image ls명령어에서 filter 옵션을 사용해 우분투 이미지만 볼 수 있습니다.

Result of image ls

하나의 이미지에도 여러개의 태그가 있을 수 있습니다. 우분투의 경우에 Canonical에서 우분투에 패치를 하면 도커허브에도 코드네임과 버전을 붙여 업로드합니다. 따라서 ubuntu 16.04버전이 필요하다면 ubuntu:16.04로 태그를 명시함으로써 사용할 수 있습니다.

태그는 버전, 커밋 라벨, 코드네임일 수도 있습니다.

4. 빌드 자동화

자주 변경되지 않는 응용프로그램은 직접 이미지를 빌드하고 푸시해도 괜찮습니다. 하지만 정기적으로 이미지를 변경해야 한다면 빌드와 푸시를 자동화할 수 있습니다. 도커허브는 GitHub, BitBucket에 있는 도커파일의 자동 빌드를 지원합니다.

자동화된 빌드는 도커허브에 로그인한 후 도커허브의 레포지토리에서 Builds > Automated Builds를 통해 설정할 수 있습니다. GitHub 또는 BitBucket의 계정을 연동하고, 어떤 깃 레포지토리를 사용할 수 있는지 선택할 수 있습니다.

설정 후에 깃 레포지토리에 푸시가 들어오면 도커허브는 자동으로 도커파일을 빌드합니다. 수동으로 빌드를 시작하는 것도 가능합니다.

자동 빌드를 하면 깃의 브랜치별로 다른 태그를 붙이도록 설정할 수 있습니다.

Example of setting tag by branch name

5. 기초 이미지의 선택

도커허브는 기본 레지스트리이고, 수천개의 잘 만들어진 이미지들이 있습니다. 하지만, 도커허브에는 누구나 이미지를 등록할 수 있기 때문에 기초 이미지를 잘 선택해야 합니다.

처음에는 공식 이미지를 사용하는 것이 좋습니다. 공식 이미지는 지원이 잘 되며, 도커허브에서는 이미지에 대해 취약점 스캔을 하여 위험도를 알려줍니다.

6. 개인 레지스트리 운영하기

대부분의 이미지는 도커허브에 공용으로 사용할 수 있게 푸시되지만, 상업적인 용도의 이미지는 도커허브에 올리기에 꺼려질 수 있습니다. 그럴 때는 개인 레지스트리를 사용할 수 있습니다.

개인 레지스트리는 도커허브에 있는 registry이미지를 사용해 만들 수 있습니다.

Result of docker container run -d -p 5000:5000 registry:2

도커에서 기본 레지스트리인 도커허브가 아닌 다른 레지스트리를 사용하려면 레지스트리 주소를 명시해주어야 합니다. 레지스트리 이미지를 컨테이너를 5000번 포트를 이용하도록 실행시켰으므로 이 경우에는 localhost:5000을 사용하면 됩니다. 레지스트리 이름은 이미지 이름에 {registry}/{user}/{app}형태로 명시해주면 됩니다.

Result of docker push localhost:5000/kuicsofficial/echoserver

개인 레지스트리를 사용하면 우분투 이미지를 받아 다른 이름으로 푸시하는 등 더 자유로운 사용이 가능해지며 개인 레지스트리에 있는 우분투를 사용해 이미지를 만들면 버전을 관리하기 쉬워집니다. 또한, 나중에 우분투가 아닌 아치 리눅스로 기초 이미지를 변경하더라도 도커파일을 건드릴 필요없이 우분투와 같은 이름으로 아치 리눅스를 개인 레지스트리에 푸시해 놓으면 됩니다.

도커허브의 이미지는 푸시와 풀은 자유롭지만, 터미널에서 검색이 불가능합니다. 하지만 개인 레지스트리의 REST API는 다양한 기능을 제공합니다. 개인 레지스트리의 이미지 리스트는 _catalog에 HTTP GET을 사용하면 가져올 수 있습니다.

Result of curl localhost:5000/v2/_catalog

7. 기타 레지스트리

레지스트리 API가 공개되어 있기 때문에 다양한 선택지가 존재합니다. 예시로 GitLab은 자동으로 빌드 후 통합된 레지스트리에 푸시하는 기능을 지원합니다.


이 내용은 Docker_Succintly 책을 기반으로 쓰여졌습니다. 이 책은 Syncfusion 에서 다운로드 받을 수 있습니다.