지금까지 도커를 사용하면서 도커 이미지 저장소에 대해서는 생각한 적이 없었다. 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과 연결하면 가장 베스트
- 불가능 하다면 퍼블릭 저장소로 만들되 인증 수단을 추가할 것
- 인증서도 발급받아야 하니까 퍼블릭 저장소로 만드는게 나을듯?
- 생각해보니 중요한 것들은 환경 변수로 빼고 도커 허브를 써도 될 듯?
Ghost