직접 Docker Registry 만들기

9625 단어 docker_registryDocker

privte registry를 원하게 됐어요.


지금까지 자신이 사용하던 약간의 Docker 컨테이너 서버를 만들 때 서버에서 Docker file을 복제해 그 자리에서 인상을 만드는 절차가 세워져 있다.사실 혼자 쓰면 이렇게 끝날 것 같아서요.
Docker Hub에 업로드하는 것은 보통 등호로 공개되지만, 대다수 자신을 향한 컨테이너는 글자 그대로 자신을 향한 것이기 때문에 통용성이 없는 자체 제작 코드로 이동하거나 비밀 키를 안고 내부에 있어 공개하기 어렵다.
이런 느낌이라 본인이 직접 만든 Docker 이미지를 적극적으로 푸시하는 장면은 없다.
코어OS, Docker 서비스 등이 광범위해지면 컨테이너 공개가 주제가 된다.
실제로 flete와 Kubernetes를 만지작거리면 depro의 단위가 컨테이너 이미지인 것을 발견할 수 있다. 이것은 어느 기계에서든 Docker hub에서 이미지를 다운로드하면 이동할 수 있다는 투명성을 바탕으로 한 것이다.
그런 점에서 저는 Docker 컨테이너의 이미지와 Docker Hub의 중요성을 점차 이해하게 되었습니다.
하지만 내 용기 제작 기술은 아직 성숙하지 않아 방금 쓴 것처럼 비밀 열쇠가 달린 용기를 만들기 쉽다.
이렇게 되면 자신이 사용하는private registry만 자신의 서버에서 편리하게 사용할 수 있다.
레지스트리 자체도 용기로 공개되기 때문에 쉽게 얻을 수 있으니 준비해 두세요.
자신을 위해 Docker의 실험을 하기 위해registry 기능인 서버를 준비했는데, 이름은taigei(대고래)이다.(이거 하고 싶다)
그 타이거 구축 당시의 기록이야.

관련 정보


docker-registry의 설정 방법에 관해서는 다음과 같은 문장을 참조하였다.
$shibayu36->blog;/사내용 Docker Registry 만들기
http://blog.shibayu36.org/entry/2013/12/24/194134
SOTA/인증 Docker Proivte registry 설정
http://deeeet.com/writing/2014/10/02/docker-private-registry-auth/

인증 에이전트와 용기 연결


Docker가 push/pull을 진행할 때 포트를 지정하지 않고 URL만 지정하면 https(port 443)를 표준으로 사용합니다.Docker registry의default는port5000이므로 포트를 지정해야 합니다.
또한 표준에 인증이 없기 때문에 http의 BASIC 인증 전에 사용자 인증을 추가해야 한다.
이러한 배경에서 Docker registry와 함께 httpd를 인증과 역방향 에이전트로 사용합니다.

Docker 컨테이너에 대한 프록시 설정으로 위의 그림에서 보듯이 Docker 호스트 측에서 Apache와nginx를 준비하는 것은 매우 간단합니다. 저도 예전에 이렇게 했습니다.

다만 코어OS 등은 이런 구조를 구성할 수 없기 때문에 모두 컨테이너로 관리해야 하므로 프록시 자체도 컨테이너로 관리해야 해 비교적 운반성이 있다.
이번에 이 글을 쓰려는 의도는 이 구성에 도전해보니 생각보다 어렵더라고요.
용기는 참고 보도에서처럼pull이run을 했을 뿐, 많은 보도용--port 5000:5000으로 연결되어 있다.이렇게 하면 인증된 프록시 서버인port5000을 준비해도 호스트에서 외부로 칭찬을 아끼지 않을 수 없다.
외부에서 용기--expose=5000로 연결되지 않기 위해 브리지에서만 공개되며,proxy용기--link로 연결됩니다.
링크 연결을 통해registry 서버의 IP와port를 환경 변수를 통해proxy에 전달하는 것을 가리키기 때문에 어떻게 처리하는 것이 디자인의 관건이다.

링크된 proxy 컨테이너 만들기

--link myreg:registry 등proxy 용기를 시작할 때REGISTRY_*부터 시작되는 각종 환경 변수로 설정됩니다.
그 환경 변수에서 연결부 등을 지정하는 동시에proxy를 시작하는 것은 필요하지만,nginx라면 conf에 환경 변수를 가져와perrl 모듈을 사용하는 등 노력하는 느낌입니다.perl 모듈을 사용할 수 있는 패키지는 무엇입니까?여러 가지 번거로운 점이 너무 많아서 이번에는nginx를 포기하고 apche2를proxy로 사용하기로 했습니다.
apche의 conf는 ${환경 변수 이름}입니다. 어디서든 사용할 수 있기 때문에 간단합니다.
나는 Docker file이 이상한 짓을 하지 않았다고 생각한다. 느낌이 매우 평범하다.
Dockerfile
FROM debian:wheezy
MAINTAINER rerofumi

RUN echo 'deb http://ftp.jp.debian.org/debian/ wheezy main' > /etc/apt/sources.list

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update; \
    apt-get -y upgrade; \
    apt-get -y dist-upgrade; \
    apt-get -y install apache2; \
    apt-get clean; \
    rm -rf /var/lib/apt/lists/*

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2

# --- web setup
RUN mkdir -p /etc/ssl/local
ADD sslproxy.conf /etc/apache2/sites-available/
ADD htpasswd /var/www/.htpasswd

RUN a2enmod ssl
RUN a2enmod proxy
RUN a2enmod proxy_http
RUN a2enmod headers
RUN a2ensite sslproxy.conf

VOLUME ["/etc/ssl/local", "/var/log/apache2"]
EXPOSE 443
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
복사할 설정 파일을 미리 쓰는 것은 프록시 사이트에서 설정한 sslproxy입니다.conf와 BASIC 인증용 암호 파일의 htpasswd 2개입니다.
SSL의 키 파일 배치와 로그 파일 배치를 호스트 측에 배치할 수 있는 암호화 볼륨을 설정합니다.
sslproxy.conf는 docker-registry의 contry에 포함된 appache를 설정한 샘플을 바탕으로 작성되었습니다.
https://github.com/docker/docker-registry/blob/master/contrib/apache.conf
sslproxy.conf
<IfModule mod_ssl.c>
  <VirtualHost _default_:443>
    ServerName taigei.myhost.name

    SSLEngine On
    SSLCertificateFile    /etc/ssl/local/${SITESSL}.crt
    SSLCertificateKeyFile /etc/ssl/local/${SITESSL}.key

    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
    ErrorLog ${APACHE_LOG_DIR}/ssl_error.log

    Header set Host "taigei.myhost.name"
    RequestHeader set X-Forwarded-proto "https"

    ProxyRequests off
    ProxyPreserveHost on
    ProxyPass / http://${REGISTRY_PORT_5000_TCP_ADDR}:${REGISTRY_PORT_5000_TCP_PORT}/
    ProxyPassReverse / http://${REGISTRY_PORT_5000_TCP_ADDR}:${REGISTRY_PORT_5000_TCP_PORT}/

    <Location "/">
      AuthType Basic
      require valid-user
      AuthName "Docker Registry local"
      AuthUserFile /var/www/.htpasswd
    </Location>

    # Allow ping and users to run unauthenticated.
    <Location /v1/_ping>
      Satisfy any
      Allow from all
    </Location>

    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
  </VirtualHost>
</IfModule>
Taigei와 호스트 이름은 고정되어 있기 때문에 제때에 자신의 환경에서 다시 읽어 주십시오.
이 근처에도 환경 변수로 전달하면 충분히 운반 가능한 컨테이너가 될 것 같네요.
진행이 원활하지 않아 고민이 많았지만, 헤드/리퀘스트 헤드의 헤드 모듈이 추가된 부분에 초점을 맞췄다.만약 이것이 없다면 프록시 서버의docker-registry는 자신의 내부 IP를 응답 목표로 되돌려주고 프록시 서버는 실패합니다.

registry 시작


실제 시작할 때registry→proxy 순서대로 시작하고 링크로registry를 지정하지만 명령선에서 맵기 때문에fig 관리를 사용합니다.
참고로 제공하다.
fig.yml
myreg:
  image: registry
  volumes:
    - /var/opt/docker/registry:/tmp/registry
  expose:
    - "5000"  

httpdproxy:
  image: rerofumi/registryproxy
  volumes:
    - /var/opt/docker/httpd_proxy/log:/var/log/apache2
    - /var/opt/docker/httpd_proxy/sslkey:/etc/ssl/local
  links:
    - myreg:registry
  ports:
    - "443:443"
  environment:
    SITESSL: w-local

로컬registry 사용 방법


이렇게 완성된 자신에게 registry의 URL을 https://taigei.myhost.name/ 로 한다.

로컬registry 인증

$ docker login taigei.myhost.name로그인
이 인증은 docker hub와 다르기 때문에, docker hub의 로그인과push/pull은 예전과 같이 진행될 것입니다.

로컬registry의push/pull


컨테이너 이미지를 만들 때ユーザー名/コンテナイメージ名와 사선 앞에 사용자 이름을 쓰는 것은 docker hub의 약속입니다.이 그림에 추가된 사용자 이름으로 docker hub에 로그인하는 거야.
이 빗장을 사용하기 전에 로컬registry 주소를 사용하면 로컬push에서 사용할 수 있습니다.$ docker push taigei.myhost.name/testcontainer이 규칙이 있기 때문에, docker hub에 로그인해도 로컬registry와 구별할 수 있기 때문에, 부주의로 로컬에서 사용하는 물건을 docker hub에게 주기가 매우 어렵다.
풀을 칠 때 사선 앞에 주소를 붙이면 그곳에 연결되어 풀을 하기 때문에 다른 지정이 필요 없습니다.

로컬registry에 등록된 이미지 검색


docker hub의 경우 docker search 검색할 수 있습니다.
로컬registry에서 검색을 할 수 없습니다.(인증되지 않은 서버라면 가능합니다.)
WEB 브라우저 등 접근https://taigei.myhost.name/v1/search&q=을 통해 json에서 검색 결과를 얻을 수 있습니다.q= 뒤에 검색 문자열을 지정하십시오.

좋은 웹페이지 즐겨찾기