Docker – local mirror

Dockerhub 제한 발표

https://www.docker.com/pricing/resource-consumption-updates

  • 안쓰는 리포지터리 삭제
  • 다운로드 제한

클라우드를 사용하는 경우에는 aws, gcp에서 클라우드 제공하는 미러 사용
앞으로는 어떻게든 mirror가 자동으로 잡히는 방향으로 설정이 잡히겠지만
아직까지는 수동으로 설정을 해 줘야한다.

dns를 잡아서 자동으로 처리 해 버릴수도 있지만 마음대로 그렇게 했다가 오류가 발생할 가능성도 있으니
개별 서버는 개별적으로 mirror 설정을 잡아줘야 한다

로컬 proxy registry 설치

https://github.com/docker/distribution

도커 소스코드가 생각보다 잘 관리되지 않고 있는 것 같다. 의존성 때문인지
https://github.com/docker/engine
이게 도커 메인코드인데 여기도 registry가 있는데 이걸 안쓰고 위의 리포를 사용해야한다.
그리고 moby는 뭘까

보통 받는이미지를 받고 또받고 하는데 이 과정에서 서버 부하가 과도하게 가니까 이걸 로컬 프록시로 처리 해 준다. 또 컨테이너 업로드는 dockerhub, quay, ecr, 개별설치 뭐가 됐건 레지스트리를 지정하고 할테니까
PROXY가 중요

도커 커맨드라인 실행

https://maelvls.dev/docker-proxy-registry-kind/

docker run -d --name docker-proxy-registry --restart=always -p 5000:5000 -e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io registry:2

docker compose

https://docs.docker.com/registry/deploying/

registry:
  restart: always
  image: registry:2
  ports:
    - 5000:5000
  environment:
    REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
    REGISTRY_HTTP_TLS_KEY: /certs/domain.key
    REGISTRY_AUTH: htpasswd
    REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
  volumes:
    - /path/data:/var/lib/registry
    - /path/certs:/certs
    - /path/auth:/auth

도커 데몬에 mirror에서 다운받도록 설정

도커 설정파일

  • /lib/systemd/system/docker.service 서비스실행시
  • /etc/docker/daemon.json 원래파일
  • /etc/systemd/system/docker.service.d 환경변수형태로
    https://docs.docker.com/config/daemon/systemd/

접속테스트 daemon.json, 윈도우 맥에서는 태스크아이콘에서 설정파일 편집

https서버인 경우

{
    "insecure-registries" : [
    ],
    "registry-mirrors": ["https://dockerhub-mirrror-addr.kr/"],
    "debug" : true,
    "experimental" : false
}

로컬 http로 실행하는 경우

{
  "insecure-registries": [
    "127.0.0.1:5000"
  ],
  "registry-mirrors": [
    "http://127.0.0.1:5000"
  ],
  "debug": true,
  "experimental": false
}

실행시킨 도커 로그를 켜놓은 다음
docker pull ubuntu를 해보면
로그에서 해당 서버를 통해 다운받는걸 확인할 수 있다

quay나 aws쓰는 경우에도
개발시에 자동으로 도커 이미지 받다보면
서버를 엄청 긁어댈 수도 있는데 그럴경우 속도도 더 빠르고 좋다.

Ubuntu14.04우분투 미러 리포지터리 만들기

우분투 버전 12.04, 14.04 테스트

필요대상 :
우분투 서버를 몇 개 이상 이용하는 사람

설치순서 :
—————-우분투 미러 생성 패키지 설치——————–
$ sudo apt-get install apt-mirror
설정파일 편집
/etc/apt/mirror.list

14.04에서 설정파일은 다음과 같다

############# config ##################
#
# set base_path    /var/spool/apt-mirror
#
# set mirror_path  $base_path/mirror
# set skel_path    $base_path/skel
# set var_path     $base_path/var
# set cleanscript $var_path/clean.sh
# set defaultarch  <running host architecture>
# set postmirror_script $var_path/postmirror.sh
# set run_postmirror 0
set nthreads     20
set _tilde 0
#
############# end config ##############

deb http://archive.ubuntu.com/ubuntu trusty main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu trusty-updates main restricted universe multiverse
#deb http://archive.ubuntu.com/ubuntu trusty-proposed main restricted universe multiverse
#deb http://archive.ubuntu.com/ubuntu trusty-backports main restricted universe multiverse

deb-src http://archive.ubuntu.com/ubuntu trusty main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu trusty-updates main restricted universe multiverse
#deb-src http://archive.ubuntu.com/ubuntu trusty-proposed main restricted universe multiverse
#deb-src http://archive.ubuntu.com/ubuntu trusty-backports main restricted universe multiverse

clean http://archive.ubuntu.com/ubuntu

– 리포지터리를 추가하려면 목록을 추가하면 된다
– basepath 등 윗쪽 설정을 변경하면 파일 저장경로를 변경할 수 있다. 파티션을 나눠놔서 용량이 부족할 수 있다변 필히 설정해줘야 할 부분. 디렉토리를 변경했다면 mkdir을 해준다. 자동으로 안되는 모양이다.
– 32/64 리포지터리를 두개다 저장하지 않고 한쪽만 하려면 이것을 명시해줄 수 있다. 그런데 이거 64비트로 깔고 써도 두개가 같이 깔리는게 있던데 호환성 문제가 발생 할 수 있지 않을까 싶다. (이런모양 deb-amd64 http://archive.ubuntu.com/ubun……….)

기본설정된거 쓰지말고 서버에서 사용되고있는 리포지터리 목록을 갖다붙이자
용량이 부족하면 src부분은 다 빼도된다? 되지 않을까?

 

미러링 시작!
$ sudo nano /etc/apt/mirror.list
명령을 입력하면 아래와 같은 모양으로 업데이트가 시작된다. 시간이 꽤 걸리는편이니 기다리지 말자

$ sudo apt-mirror /etc/apt/mirror.list
Downloading 162 index files using 20 threads...
Begin time: Thu Jun 12 10:21:40 2014
[20]... [19]... [18]... [17]... [16]... [15]... [14]... [13]... [12]... [11]... [10]... [9]... [8]... [7]... [6]... [5]...

설정을 잘못하고 실행시킨 경우 다음과 같은 에러메세지를 보게 된다(고한다)
apt-mirror is already running, exiting at /usr/bin/apt-mirror line 187.
이런경우 설정파일을 고치고 다시 실행을 해도 실행이 되지 않으니 /spare/var/apt-mirror.lock이 파일을 먼저 지워줘야된다.

—————-/우분투 미러 생성 패키지 설치——————–
—————-미러 자동업데이트——————–
주의! 테스트서버가 아닌 실제운영 서버라면, 그중에서도 우분투 공식리포지터리가 아닌 개발자 리포지터리에서 패키지를 설치했다면 버전을 고정시킬 필요가 있다. 이런경우에는 미러를 운영용/테스트용으로 두개를 돌려서 테스트용에서 안정성이 확보된 이후에 사용하는게 좋다. 꼭 수동으로 할 필요는 없지만 안전장치는 필요하다. 운영서버의 10%만 최신업데이트를 해서 뻑이나면 그부분만 갈아엎는다던가 추가조치는 알아서~

위에 설정한 mirror.list를 기반으로 미러 업데이트 크론 설정
실행을 시킬 때 $ apt-mirror 만 치면 기본적으로 mirror.list를 쓴다

$ sudo nano /etc/cron.d/apt-mirror
-----다음내용 추가-----
#
# Regular cron jobs for the apt-mirror package
#
# 0 4     * * *   apt-mirror      /usr/bin/apt-mirror > /var/spool/apt-mirror/var/cron.log
----------------------------
$ sudo chmod 755 /etc/cron.d/apt-mirror

또는 /etc/cron.daily/~ 경로에 apt-mirror.sh형태로 넣어도 된다.
!#/bin/bash
apt-mirror /usr/bin/apt-mirror > /var/spool/apt-mirror/var/cron.log

—————-/미러 자동업데이트——————–
—————-http서비스——————–
우분투 서버에 접속해봤을 때 아파치서버로 접속이 된다면 패쓰
아님 아파치 서버 설치
sudo apt-get install apache2
이렇게 하면 간편하긴한데… 아파치 설정할 줄 알면 따로 하는게 좋다.
sudo ln -s /spare/mirror/gb.archive.ubuntu.com/ubuntu/ /var/www/ubuntu
—————-/http서비스——————–
—————-apt-get소스목록수정——————–
/etc/apt/sources.list 요 파일을 수정해주면 이제 미러서버를 통해서 업데이트를 하게 된다. 속도가 한결 빠른걸 볼 수 있다.

deb http://us.archive.ubuntu.com/ubuntu/ trusty universe
여기서 그냥 자기서버주소로 바꿔주면 된다.
deb http://localhost/ubuntu/ trusty universe
기본미러목록에 security는 없었으므로 security는 유지한다. 아니면 security도 미러링 해서 처리해도되고.. 하는사람마음.
—————-/apt-get소스목록수정——————–

참고사이트

Create Your Own Local Mirror of the Ubuntu Repositories