Docker Registry 만들기

지금까지 도커를 사용하면서 도커 이미지 저장소에 대해서는 생각한 적이 없었다. Dockerfile을 만들어 두고 필요한 환경에서 빌드해서 사용하는 방식으로 사용했었다. 드디어 문제에 봉착하게 되었는데 분산된 서버의 경우 빌드가 불필요하게 각각 돌아간다는 점이다. 도커 허브를 사용하려고 했는데 숨겨야 할 정보가 있어서 비공개 저장소를 이용하려고 한다.


1. 저장소 실행

아래와 같이 이미지 저장소를 도커를 이용해서 간단하게 띄울 수 있다.

docker run -p 5000:5000 registry
version: "2"
services:
  registry:
    image: registry
    ports:
      - 5000:5000
    restart: unless-stopped


2. 도커 설정 수정

해당 저장소는 http로 접근할 수 있는데 도커 데몬에서는 기본적으로 https로 접근하려고 하므로 push , pull을 시도할 경우 오류가 발생한다. 도커 엔진에 아래와 같은 설정을 추가하자. (아래 명령어는 우분투 기준으로 작성되었다.)

sudo vi /etc/docker/daemon.json
{
    "insecure-registries" : ["baealex.secret.registry:5000"]
}
sudo service docker restart

https를 간단하게 적용할 방법이 있다면 그렇게 하는게 공수가 더 적을 것 같다. 찾아봐야지... + 간단하게 가능하지 않을까 생각했는데 쉽지 않았다. 퍼블릭 저장소로 만들고 letsencrypt를 활용하는게 이로울 듯. 여하튼 인증서를 생성한 다음 다음과 같이 인증서 볼륨을 연결해주고 환경변수를 추가하자.

version: "2"
services:
  registry:
    image: registry
    ports:
      - 5000:5000
    volumes:
      - ./certs/:/etc/certs/
    environment:
      REGISTRY_HTTP_TLS_CERTIFICATE=/etc/certs/domain.com.pem
      REGISTRY_HTTP_TLS_KEY=/etc/certs/domain.com-key.pem
    restart: unless-stopped


3. 이미지 푸시

이미지는 아래와 같이 생성한다.

docker build -t [생성할 이미지명]:[태그명=:latest] [Dockerfile의 위치]

$ docker build -t my_docker_image .

이미지의 태그는 아래와 같이 변경할 수 있다.

docker tag [기존의 이미지명]:[태그명=:latest] [새로운 이미지명]:[태그명=:latest]

$ docker tag my_docker_image baealex.secret.registry:5000/my_docker_image

빌드할때 처음부터 다음과 같이 생성해도 된다.

$ docker build -t baealex.secret.registry:5000/my_docker_image .

이후 푸시를 해준다.

$ docker push baealex.secret.registry:5000/my_docker_image


4. 이미지 실행

빌드되어 이미지 저장소에 푸시된 이미지를 아래와 같이 동작하면 된다.

$ docker run baealex.secret.registry:5000/my_docker_image

위 명령어의 경우 로컬에서 해당 이미지를 찾고 없으면 해당 이미지 서버에서 이미지를 풀 받아서 실행시킨다.


고려해 볼 만한 것들

  • 깃허브 액션으로 자동으로 이미지 빌드하기
    • 깃허브 액션을 VPN과 연결하면 가장 베스트
    • 불가능 하다면 퍼블릭 저장소로 만들되 인증 수단을 추가할 것
    • 인증서도 발급받아야 하니까 퍼블릭 저장소로 만드는게 나을듯?
    • 생각해보니 중요한 것들은 환경 변수로 빼고 도커 허브를 써도 될 듯?

이 글이 도움이 되었나요?

신고하기
0분 전
작성된 댓글이 없습니다. 첫 댓글을 달아보세요!
    댓글을 작성하려면 로그인이 필요합니다.