반응형

 

GCP(Google Cloud Platform)을 사용한 Docker Private Registry 구축 입니다.

GCP에 미리 계정을 등록 해두어야 하고 구글 계정에 신용카드 또는 계좌가 등록 되어 있으면 편합니다. (1년간 무료로 이용이 가능하고, 신용카드 또는 계좌를 등록하는 이유는 자동 가입을 막기 위해서라고 합니다. 1년 후 자동으로 유료버전으로 전환되지 않습니다.)

 

무료 버전 등록은 http://cloud.google.com 에서 구글 계정 로그인 후 무료로 실행하기를 눌러서 진행 하시면 됩니다.

 

  • 1. Google Container Registry API 연동

GCP에서 Docker 이미지를 관리할 수 있는 Google Container Registry API를 제공 합니다.

GCP 무료 버전을 실행 하였으면 좌측의 API 및 서비스 → 라이브러리 클릭 합니다.

 

검색창에 Google Container Registry 를 검색 후 나오는 결과를 클릭 합니다.

 

사용 설정을 클릭 하면 Google Container Registry API를 사용하기 위한 연동이 완료 됩니다.

 

  • 2. Google Cloud SDK 설치

python 2.7버전이 필요하기 때문에 우선 리눅스에서 python -v 으로 버전을 확인해줍니다.

GCP로부터 이미지를 업로드 받거나 다운로드 받을 때 gcloud 라는 명령어가 필요 하기 때문에 Cloud SDK를 설치해야 합니다. ( CentOS 7 minimal을 기준으로 작성 합니다. )

우선 아래와 같이 tee 명령어 및 내용을 작성 후 sdk를 설치 해주세요.

sudo tee -a /etc/yum.repos.d/google-cloud-sdk.repo << EOM

[google-cloud-sdk]
name=Google Cloud SDK
baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
       https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOM

yum install google-cloud-sdk

 

** 만약 GUI 환경이 가능하신 경우 아래 명령을 따라갈 필요 없이 gcloud init 치셔서 몇번 넘기시다가 나오는 URI를 웹브라우저에 복사+붙여넣기 하셔서 코드를 인증하시고 끝나시면 gcloud auth login 만 입력하시면 됩니다.

 

이후 GCP 콘솔창에서 좌측의 메뉴 중 IAM 및 관리자 → 서비스 계정을 클릭 한 후 서비스 계정 만들기를 클릭 합니다.

 

 

이후 서비스 계정의 이름은 원하는데로 적어 주시고 아래처럼 권한을 프로젝트 → 소유자로 만들어 줍니다.

 

다음으로 넘어가서 키 만들기 → JSON 형식으로 만든 후 완료를 눌러서 마무리 합니다. (키 만들면서 다운로드되는 json 파일을 반드시 보관 해주세요)

 

키를 만들면서 다운로드된 json 파일을 리눅스의 /usr/lib64/google-cloud-sdk/bin 으로 옮깁니다.

이제 아래 명령어를 통해 서비스 계정 인증을 위해 아래 명령어를 입력해줍니다. (만약 gcloud 커맨드를 찾지 못한다면 /usr/lib64/google-cloud-sdk/bin 으로 이동하셔서 ./gcloud 로 사용 해주세요) 

gcloud auth activate-service-account --key-file=/usr/lib64/google-cloud-sdk/bin/[옮긴 json파일명]
gcloud auth configure-docker

# gcloud 커맨드를 인식하지 못할 경우
cd /usr/lib64/google-cloud-sdk/bin/
./gcloud auth activate-service-account --key-file=/usr/lib64/google-cloud-sdk/bin/[옮긴 json파일명]
./gcloud auth configure-docker

 

json 파일도 인증이 완료 되었다면 리눅스에서 삭제 해줍니다. (gcloud CLI가 키를 저장하여 리눅스에서 삭제해도 계속 유지된다고 합니다)

 

  • 3. 도커 이미지 업로드 / 다운로드

도커 이미지를 업로드 하기 전 이미지의 태그를 설정해주어야 합니다.

# docker tag [로컬 이미지명] [Google Container Registry 호스트명]/[프로젝트 ID]/[이미지명]
ex) docker tag centos:7 asia.gcr.io/[프로젝트 ID]/centos

Google Container Registry 호스트명은 이미지 저장 위치에 따라 아래 중 하나를 사용하시면 되고, 프로젝트 ID는 GCP 콘솔 홈에서 확인하실 수 있습니다.

  • us.gcr.io : 미국
  • eu.gcr.io : 유럽
  • asia.gcr.io : 아시아

 

push 후 재대로 업로드 되었는지 확인 하고, 아래 이미지와 같이 콘솔 홈에서 좌측 메뉴를 내리다보면 Container Registry 클릭 → 이미지 클릭 하시면 업로드한 이미지를 확인할 수 있습니다.

# docker push [Google Container Registry 호스트명]/[프로젝트 ID]/[이미지명]
docker push asia.gcr.io/[프로젝트 ID]/centos

 

이후 기존에 있던 이미지를 삭제한 후 정상적으로 다운로드 되는지 확인 합니다.

# docker pull [Google Container Registry 호스트명]/[프로젝트 ID]/[이미지명]
docker pull asia.gcr.io/[프로젝트 ID]/centos

 

반응형
반응형

 

Private Registry는 개인 저장소라고도 하며 Docker hub에서 제공하는 registry 이미지를 사용 해 컨테이너에서 이미지를 로컬 저장하는 방식 입니다.  하지만 GUI 환경을 지원하지 않는데, Docker hub에 GUI로 볼 수 있는 웹이 배포되어 있습니다. 웹 설정은 가장 마지막에 다루겠습니다.

 

그리고 Pricate Registry를 다룰때엔 반드시 최소한 볼륨을 이용해 데이터를 보존 하거나, 스토리지 또는 데이터 백업등을 통하여 데이터를 관리 해야 합니다.

Private Registry는 registry 컨테이너가 삭제되면 모든 데이터가 삭제 됩니다.

 

  • 1. Docker Private Registry 환경 구축

# Docker hub 공식 저장소에서 registry 이미지 다운로드
docker image pull registry

# docker container run -d -p []:[port] --name [컨테이너명] registry
docker container run -d -p 5000:5000 --name registry registry

부팅 시 자동 시작은 --restart=always 옵션을 사용하시면 됩니다.

 

  • 2. Docker Private Registry 실행 테스트

실제로 Private Registry가 재대로 작동하는지 확인하기 위해 아래와 같이 간단한 centos+nginx 실행 코드를 Dockerfile에 넣고 빌드 해주세요. 저는 registry_nginx 라는 이미지 명으로 빌드 하였습니다.

FROM centos:7

RUN touch /etc/yum.repos.d/nginx.repo && echo -e '[nginx]\nname=nage repo\nbaseurl=http://nginx.org/packages/centos/7/$basearch/\ngpgcheck=0\nenabled=1' > /etc/yum.repos.d/nginx.repo

RUN yum -y install nginx curl

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

 

이후 로컬호스트 5000번에서 작동하는 docker-nginx 이미지라는것을 좀 더 명확히 하기 위해 tag 설정을 하였습니다. (tag 설정 참고 : https://nirsa.tistory.com/49)

  • docker image tag [기존 이미지명] [사용자명]/[생성할 이미지명]
  • docker image tag registry_nginx localhost:5000/docker-nginx

 

이제 이미지를 private registry에 업로드하고, 기존에 있던 registry_nginx 와 localhost:5000/docker-nginx 이미지는 삭제 하였습니다.

  • docker image push [사용자명]/[이미지명]
  • docker image push localhost:5000/docker-nginx

 

이미지를 업로드 했고, 기존에 있던 이미지를 모두 삭제 하였으니 확인하기 위한 준비는 끝났습니다. 이제 다운로드를 해보면 정상적으로 이미지를 가져오고, 컨테이너 실행해도 nginx가 정상적으로 작동 합니다.

 

  • 3. Docker Private Registry 이미지 리스트확인

이미지 리스트는 아래와 같이 확인 가능 합니다.

  • curl -X GET http://localhost:5000/v2/_catalog

 

  • curl -X GET http://localhost:5000/v2/docker-nginx/tags/list

 

  • 4. Docker Private Registry 웹페이지 구축

docker hub에 해외 유저가 만든 Private Registry를 웹페이지로 구축한 이미지가 공유 되어 있습니다.

아래 코드를 입력 후 실행하면 정상적으로 될테지만, 현재 동작중인 container run를 입력하는 부분에서 동작중인 Private Registry 컨테이너 이름을 쓸 때 조심 해야 합니다. Priavate Registry 컨테이너가 깨질 수 있습니다.

docker pull hyper/docker-registry-web

# docker run -it -p 8080:8080 --name [hyper/registry-web 이미지가 사용할 컨테이너명] --list [현재 동작중인 registry 컨테이너명] -e REGISTRY_URL=http://[현재 동작중인 registry 컨테이너명]:[현재 동작중인 registry 포트]/v2 -e REGISTRY_NAME=localhost:5000 hyper/docker-registry-web
docker run -it -p 8080:8080 --name registry-web --link registry -e REGISTRY_URL=http://registry:5000/v2 -e REGISTRY_NAME=localhost:5000 hyper/docker-registry-web 

 

 

반응형
반응형

 

Docker Automated Build를 이용한 Dockerfile로부터 이미지 자동 Build 입니다. (관리툴인 GitHub과 Bitbucket를 이용한 방법이 있는데, 이 글에서는 GitHub을 사용 합니다)

 

  • 1. Docker Hub Repository 생성

http://hub.docker.com 에 접속하여 로그인 후 상단의 Repositories → Create Repository 클릭 합니다.

 

Repository의 이름을 적어주고 이번 글에서는 Public으로 진행하기에 체크, Build Settings가 써있는곳에 고양이 모양이 있는것이 GitHub인데 누르고 로그인하여 연결 해줍니다.  (GitHub 계정이 없다면 생성해야 합니다.) 

연결이 완료 됬다면 Create 를 눌러서 생성 해줍니다.

Builds를 누른 후 Link to GitHub을 클릭 합니다. (위에서 연결 안했다면 연결 시켜 주세요)

 

처음엔 아래 사진에 맨 위에서 보이는 SOURCE REPOSITORY 부분만 나올텐데, 마우스로 클릭하면 GitHub에 연결할때 사용한 정보들이 나오니 모두 클릭 후 아래와 같이 해줍니다. 

 

* 가장 하단의 Build Context는 Dockerfile이 위치한 경로를 적어주시면 됩니다.

 

  • 2. Dockerfile Upload

Dockerfile이 있는 리눅스에서 아래와 같이 커맨드를 입력해 줍니다. (Dockerfile의 코드는 이미지로 빌드할 아무 코드나  미리 작성 해주세요)

* 아래 명령어가 약간 햇갈린다면 github로 로그인 했을 때 아래와 같은 코드를 작성하라는 문구가 있으니 참고하여 작성하시면 되고, 중간에 gibhub의 계정과 암호를 입력하는 부분은 github 계정 정보 그대로 입력하시면 됩니다.

echo "# 사용자명" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/[git계정명]/[사용자명].git
git push -u origin master

 

  • 3. Docker Image 빌드 확인

이제 docker image pull [docker hub 사용자명]/[생성할 이미지명] 을 입력하면 별도의 빌드 필요 없이 자동으로 이미지가 생성 됩니다.

 

* denied: requested access to the resource is denied 에러 발생시 참고 : https://nirsa.tistory.com/53

반응형
반응형

 

"unable to find [user] : no matching entries in passwd file" 에러는 Dockerfile을 build를 할 때 발생 합니다.

 

  • 발생 원인

위의 사진의 경우 빨간색으로 테두리된 사용자 계정(nirsa)이 /etc/passwd 파일에 존재하지 않음

(즉, 사용자 계정이 생성되지 않음)

(Dockerfile 에서 USER 명령을 사용하여 RUN,CMD,ENTRYPOINT 명령을 특정 사용자로 실행하려 했을 경우 발생할 수 있음)

 

  • 해결 방법

해결 방법은 비교적 간단한데, 문제가 되는 사용자 계정을 생성해주면 됩니다.

Dockerfile에서 상단에 RUN useradd nirsa 등으로 사용자 계정을 생성 후 빌드를 시도 합니다.

 

반응형

+ Recent posts