# Docker Registry 만들기

- Author: @baealex
- Published: 2022-07-08
- Updated: 2024-04-13
- Source: http://blex.me/@baealex/docker-registry-%EA%B0%9C%EC%9D%B8%EC%9A%A9-%EB%8F%84%EC%BB%A4-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%A0%80%EC%9E%A5%EC%86%8C-%EB%A7%8C%EB%93%A4%EA%B8%B0
- Tags: 프로그래밍, 도커, 배포

---

지금까지 도커를 사용하면서 도커 이미지 저장소에 대해서는 생각한 적이 없었다. `Dockerfile`을 만들어 두고 필요한 환경에서 빌드해서 사용하는 방식으로 사용했었다. 드디어 문제에 봉착하게 되었는데 분산된 서버의 경우 빌드가 불필요하게 각각 돌아간다는 점이다. 도커 허브를 사용하려고 했는데 숨겨야 할 정보가 있어서 비공개 저장소를 이용하려고 한다.

<br/>

#### 1. 저장소 실행

아래와 같이 이미지 저장소를 도커를 이용해서 간단하게 띄울 수 있다.

```bash
docker run -p 5000:5000 registry
```

```yml
version: "2"
services:
  registry:
    image: registry
    ports:
      - 5000:5000
    restart: unless-stopped
```

<br/>

#### 2. 도커 설정 수정

해당 저장소는 `http`로 접근할 수 있는데 도커 데몬에서는 기본적으로 `https`로 접근하려고 하므로 push , pull을 시도할 경우 오류가 발생한다. 도커 엔진에 아래와 같은 설정을 추가하자. (아래 명령어는 우분투 기준으로 작성되었다.)

```bash
sudo vi /etc/docker/daemon.json
```

```js
{
    "insecure-registries" : ["baealex.secret.registry:5000"]
}
```

```bash
sudo service docker restart
```

https를 간단하게 적용할 방법이 있다면 그렇게 하는게 공수가 더 적을 것 같다. 찾아봐야지... + 간단하게 가능하지 않을까 생각했는데 쉽지 않았다. 퍼블릭 저장소로 만들고 letsencrypt를 활용하는게 이로울 듯. 여하튼 인증서를 생성한 다음 다음과 같이 인증서 볼륨을 연결해주고 환경변수를 추가하자.


```yml
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
```

<br/>

#### 3. 이미지 푸시

이미지는 아래와 같이 생성한다.

```bash
docker build -t [생성할 이미지명]:[태그명=:latest] [Dockerfile의 위치]

$ docker build -t my_docker_image .
```

이미지의 태그는 아래와 같이 변경할 수 있다.

```bash
docker tag [기존의 이미지명]:[태그명=:latest] [새로운 이미지명]:[태그명=:latest]

$ docker tag my_docker_image baealex.secret.registry:5000/my_docker_image
```

빌드할때 처음부터 다음과 같이 생성해도 된다.

```bash
$ docker build -t baealex.secret.registry:5000/my_docker_image .
```

이후 푸시를 해준다.

```bash
$ docker push baealex.secret.registry:5000/my_docker_image
```

<br/>

#### 4. 이미지 실행

빌드되어 이미지 저장소에 푸시된 이미지를 아래와 같이 동작하면 된다.

```bash
$ docker run baealex.secret.registry:5000/my_docker_image
```

위 명령어의 경우 로컬에서 해당 이미지를 찾고 없으면 해당 이미지 서버에서 이미지를 풀 받아서 실행시킨다.

<br/>

#### 고려해 볼 만한 것들

- 깃허브 액션으로 자동으로 이미지 빌드하기
  - 깃허브 액션을 VPN과 연결하면 가장 베스트
  - 불가능 하다면 퍼블릭 저장소로 만들되 인증 수단을 추가할 것
  - 인증서도 발급받아야 하니까 퍼블릭 저장소로 만드는게 나을듯?
  - 생각해보니 중요한 것들은 환경 변수로 빼고 도커 허브를 써도 될 듯?
