shansky     About     Archive     Feed

Docker and Mac OSX

Intro

Running docker on mac osx environment is working but when you’re running some serious project with many dockers it’s really slowing down and creates many problems.

Docker Machine

There’s no native support for docker in mac osx so to use docker, you must use docker-machine (used to known as: boot2docker) which talks with Virtualbox API like vagrant to create tiny virtual machine with linux distro: busybox (in fact it’s by default uses old boot2docker.iso but you can use your custom iso) with preinstalled docker daemon. Now docker client installed on mac osx will talk to docker daemon located on this linux virtualmachine throw forwarded port. So all networking base on virtualbox network interfaces vboxnet# and inside vm there’s vboxsf for mounting files from your osx host.

Problem Case #1

Let’s say we want to create container with dns based on consul, so we could autodiscover our other containers. Let’s assume that we won’t change dhcp ip range in virtualbox configuration for our docker-machine virtual machine, so we create interface which will be used by our docker dns container.

docker-machine create -d virtualbox --virtual-memory 4096 vm_1
eval "$(docker-machine env vm_1)"
docker-machine ssh vm_1 "sudo ifconfig eth1:1 172.17.255.253 network 255.255.255.0"

We will use this dns server in other containers so we need to change some docker daemon options:

docker-machine ssh vm_1 "/usr/local/bin/docker daemon -D -g /var/lib/docker -H unix:// -H tcp://0.0.0.0:2376 --bip=172.17.0.1/16
--dns=172.17.255.253  --label provider=virtualbox --tlsverify --tlscacert=/var/lib/boot2docker/ca.pem --tlscert=/var/l
ib/boot2docker/server.pem --tlskey=/var/lib/boot2docker/server-key.pem -s aufs &"

bip it’s docker0 interface ip address class from virtual machine and dns is static address of our dns container. When daemon starts we need to do one more thing. On host. But first get ip of our docker daemon URL

docker-machine ls
NAME       ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
vm_1      *        virtualbox   Running   tcp://192.168.99.100:2376           v1.11.0

Now we need add static route to our docker network

sudo route -n add 172.17.0.0/16 192.168.99.100

Check if our route uses vboxnet interface to route traffic to 172.17 network

netstat -nr | grep 172.17

Now we can test if our traffic goes to our dockers:

docker run -it ubuntu bash
root@containerhash:/# ifconfig # get ip of container
 nc -l 7777

from host:

telnet 172.17.0.8 777

Sweet if connected :wink:

Problem case #2

TBD

Chef fancy links

Introduction

  1. Introduction to chef

Chef configuration

  1. How to set up a chef 12 configuration mgmt on ubuntu 14.04
  2. How to Install a Chef Server, Workstation, and Client on Ubuntu

Data Bags

  1. Data Bags are a Code Smell
  2. Encrypted Data Bags

Cooking - coding cookbooks

  1. Baking Delicious resources with chef

Test Driven Development

  1. The lazy sysadmin’s guide to test driven chef cookbooks
  2. Reduce Chef infrastructure integration test times by 75%
  3. Integration Testing for Chef-Driven Infrastructure with Test Kitchen
  4. Mixing up Vagrant in Test-Kitchen

Continous Deployment

  1. YT: Continuous Deployment using Jenkins pipeline & Chef
  2. Continuous Delivery and Pipeline Traceability with Jenkins and Chef
  3. Chef, cookbook versioning and the development cycle

Videos

  1. chefconf2015

Projects

Syntax&Style check

  1. Foodcritic
  2. Chefspec
  3. Chef RFC
  4. Chef ruby

Testing

  1. Test-Kitchen
  2. Thor

Reporting

  1. chef_handler
  2. chef-irc-snitch
  3. chef-whitelist

Modifications

  1. Replacement chef-client that reads directly from a git repository

Knife

  1. Knife spork
  2. Knife flow
  3. Knife kvm
  4. Knife block
  5. Knife crawl
  6. Knife cleanup

Others

  1. chef-deploy: Chef Resources and Providers for deploying ruby web apps without capistrano

Problemy z ZOL (ZFS On Linux)

BUG: unable to handle kernel NULL pointer dereference at 0000000000000018

pod ubuntu 14.04

Takim to komunikatem przywitał mnie ostatnio bo rebootcie mój ubunciak 14.04 na ZOLu. A dokładniej mniej więcej takim:

[57652.690951] BUG: unable to handle kernel NULL pointer dereference at 0000000000000018
[57652.691040] IP: [<ffffffffa1a7aa2c>] zap_count_write+0x16c/0x3f0 [zfs]
[57652.691120] PGD 0
[57652.691144] Oops: 0000 [#1] PREEMPT SMP                       
[57652.691190] Modules linked in: zfs(PO) nvidia(PO) zunicode(PO) zavl(PO) zcommon(PO) znvpair(PO) spl(O) microcode button                
[57652.691316] CPU: 1 PID: 1748 Comm: txg_sync Tainted: P           O  3.16.5-gentoo #        
[57652.691399] Hardware name: System manufacturer P5Q DELUXE/P5Q DELUXE, BIOS 0605    06/03/2008                                          
[57652.691489] task: ffff88013a83a3c0 ti: ffff8800b27d0000 task.ti: ffff8800b27d0000
[57652.691570] RIP: 0010:[<ffffffffa1a7aa2c>]  [<ffffffffa1a7aa2c>] zap_count_write+0x16c/0x3f0 [zfs]                                     
[57652.691673] RSP: 0018:ffff8800b27d3c28  EFLAGS: 00010286
[57652.691730] RAX: 000000000000001d RBX: ffff8801382a4000 RCX: 0000000000000008
[57652.691804] RDX: 000000000000001d RSI: 000000000000001c RDI: ffff8801382a4000
[57652.691880] RBP: ffff8800b27d3c80 R08: 0000000000000000 R09: 0000000000000002
[57652.691941] R10: 0000000000000000 R11: ffff880138200000 R12: 000000000000001c
[57652.691941] R13: 000000000000001d R14: 0000000000000002 R15: 0000000000000000
[57652.691941] FS:  0000000000000000(0000) GS:ffff88013fc80000(0000) knlGS:0000000000000000
[57652.691941] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
[57652.691941] CR2: 0000000000000018 CR3: 0000000001c10000 CR4: 00000000000007e0
[57652.691941] Stack:
[57652.691941]  ffff88012c3c5300 0000000000000000 0000000000000202 000000000000001e
[57652.691941]  ffffffffa1a22aaf ffffffffa1a19c09 ffff8800bb006000 0000000000000000
[57652.691941]  ffff880066956540 ffff8800bb006000 0000000000000000 ffff8800b27d3cb0
[57652.691941] Call Trace:
[57652.691941]  [<ffffffffa1a22aaf>] ? dmu_bonus_hold+0xcf/0x2d0 [zfs]
[57652.691941]  [<ffffffffa1a19c09>] ? dbuf_rele_and_unlock+0x179/0x350 [zfs]
[57652.691941]  [<ffffffffa1a7b094>] spa_feature_decr+0x44/0xb0 [zfs]
[57652.691941]  [<ffffffffa1a46d4a>] dsl_scan_sync+0x7ba/0x9d0 [zfs] 
[57652.691941]  [<ffffffffa001fd34>] ? spl_kmem_cache_free+0xa4/0x190 [spl]
[57652.691941]  [<ffffffffa1aa9f1d>] ? zio_wait+0x12d/0x1c0 [zfs]
[57652.691941]  [<ffffffffa1a56b52>] spa_sync+0x4a2/0xae0 [zfs]          
[57652.691941]  [<ffffffff810831cd>] ? autoremove_wake_function+0xd/0x30   
[57652.691941]  [<ffffffff8109f0f3>] ? ktime_get_ts+0x43/0xe0     
[57652.691941]  [<ffffffffa1a65b72>] txg_delay+0x3d2/0x5c0 [zfs]             
[57652.691941]  [<ffffffffa1a65890>] ? txg_delay+0xf0/0x5c0 [zfs]         
[57652.691941]  [<ffffffffa0021ddc>] __thread_exit+0x8c/0xa0 [spl]       
[57652.691941]  [<ffffffffa0021d70>] ? __thread_exit+0x20/0xa0 [spl]    
[57652.691941]  [<ffffffff81065cf4>] kthread+0xc4/0xe0                
[57652.691941]  [<ffffffff81065c30>] ? kthread_create_on_node+0x170/0x170           
[57652.691941]  [<ffffffff817ddbec>] ret_from_fork+0x7c/0xb0     
[57652.691941]  [<ffffffff81065c30>] ? kthread_create_on_node+0x170/0x170     
[57652.691941] Code: 48 89 d0 48 89 e5 41 57 4d 89 c7 41 56 45 89 ce 41 55 49 89 d5 41 54 49 89 f4 53 48 89 fb 48 83 ec 30 48 89 4d c0 b9 
08 00 00 00 <41> 8b 70 18 44 89 4d c8 4c 8d 4d d0 49 8b 50 08 41 b8 01 00 00
[57652.691941] RIP  [<ffffffffa1a7aa2c>] zap_count_write+0x16c/0x3f0 [zfs]
[57652.691941]  RSP <ffff8800b27d3c28>
[57652.691941] CR2: 0000000000000018     
[57652.691941] ------------[ cut here ]------------
[57652.691941] WARNING: CPU: 1 PID: 1748 at kernel/softirq.c:146 __local_bh_enable_ip+0x6a/0xa0()                                         
[57652.691941] Modules linked in: zfs(PO) nvidia(PO) zunicode(PO) zavl(PO) zcommon(PO) znvpair(PO) spl(O) microcode button                
[57652.691941] CPU: 1 PID: 1748 Comm: txg_sync Tainted: P           O  3.16.5-gentoo #1
[57652.691941] Hardware name: System manufacturer P5Q DELUXE/P5Q DELUXE, BIOS 0605    06/03/2008                                          
[57652.691941]  0000000000000009 ffff8800b27d36e0 ffffffff817d5f76 0000000000000000
[57652.691941]  ffff8800b27d3718 ffffffff81045ba8 0000000000000201 ffff88008f42ccc0
[57652.691941]  0000000000000000 0000000000000000 000000000000003c ffff8800b27d3728
[57652.691941] Call Trace:
[57652.691941]  [<ffffffff817d5f76>] dump_stack+0x4e/0x7a
[57652.691941]  [<ffffffff81045ba8>] warn_slowpath_common+0x78/0xa0              
[57652.691941]  [<ffffffff81045c85>] warn_slowpath_null+0x15/0x20      
[57652.691941]  [<ffffffff8104adda>] __local_bh_enable_ip+0x6a/0xa0      
[57652.691941]  [<ffffffff817dd4d5>] _raw_spin_unlock_bh+0x15/0x20     
[57652.691941]  [<ffffffff814b09ce>] cn_netlink_send_mult+0x15e/0x1f0   
[57652.691941]  [<ffffffff814b0a76>] cn_netlink_send+0x16/0x20       
[57652.691941]  [<ffffffff81479a85>] uvesafb_exec+0x155/0x2e0               
[57652.691941]  [<ffffffff81479d45>] uvesafb_blank+0x135/0x190               
[57652.691941]  [<ffffffff8146fbe2>] fb_blank+0x52/0xc0                     
[57652.691941]  [<ffffffff8146a7cb>] fbcon_blank+0x21b/0x320                       
[57652.691941]  [<ffffffff8107236d>] ? get_parent_ip+0xd/0x50                 
[57652.691941]  [<ffffffff81408207>] ? debug_smp_processor_id+0x17/0x20      
[57652.691941]  [<ffffffff81070eb4>] ? get_nohz_timer_target+0x14/0x110
[57652.691941]  [<ffffffff8105083a>] ? internal_add_timer+0x2a/0x70
[57652.691941]  [<ffffffff817dd263>] ? _raw_spin_unlock_irqrestore+0x13/0x30
[57652.691941]  [<ffffffff81052dc1>] ? mod_timer+0x101/0x210
[57652.691941]  [<ffffffff8144d0a3>] do_unblank_screen+0xa3/0x1c0
[57652.691941]  [<ffffffff8144d1cb>] unblank_screen+0xb/0x10
[57652.691941]  [<ffffffff813ff9d9>] bust_spinlocks+0x19/0x40
[57652.691941]  [<ffffffff810063bf>] oops_end+0x2f/0xc0
[57652.691941]  [<ffffffff817d0e0f>] no_context+0x297/0x2a4
[57652.691941]  [<ffffffff817d0e84>] __bad_area_nosemaphore+0x68/0x1bf
[57652.691941]  [<ffffffff817d0fe9>] bad_area_nosemaphore+0xe/0x10
[57652.691941]  [<ffffffff8103a306>] __do_page_fault+0x86/0x490
[57652.691941]  [<ffffffff817dd263>] ? _raw_spin_unlock_irqrestore+0x13/0x30
[57652.691941]  [<ffffffff8107236d>] ? get_parent_ip+0xd/0x50
[57652.691941]  [<ffffffff810723fd>] ? preempt_count_add+0x4d/0xa0
[57652.691941]  [<ffffffff817dd7a8>] ? _raw_spin_lock_irqsave+0x18/0x50
[57652.691941]  [<ffffffff817dd263>] ? _raw_spin_unlock_irqrestore+0x13/0x30
[57652.691941]  [<ffffffff8103a73c>] do_page_fault+0xc/0x10
[57652.691941]  [<ffffffff817df6e2>] page_fault+0x22/0x30
[57652.691941]  [<ffffffffa1a7aa2c>] ? zap_count_write+0x16c/0x3f0 [zfs]
[57652.691941]  [<ffffffffa1a22aaf>] ? dmu_bonus_hold+0xcf/0x2d0 [zfs]
[57652.691941]  [<ffffffffa1a19c09>] ? dbuf_rele_and_unlock+0x179/0x350 [zfs]
[57652.691941]  [<ffffffffa1a7b094>] spa_feature_decr+0x44/0xb0 [zfs]
[57652.691941]  [<ffffffffa1a46d4a>] dsl_scan_sync+0x7ba/0x9d0 [zfs]
[57652.691941]  [<ffffffffa001fd34>] ? spl_kmem_cache_free+0xa4/0x190 [spl]
[57652.691941]  [<ffffffffa1aa9f1d>] ? zio_wait+0x12d/0x1c0 [zfs]
[57652.691941]  [<ffffffffa1a56b52>] spa_sync+0x4a2/0xae0 [zfs]
[57652.691941]  [<ffffffff810831cd>] ? autoremove_wake_function+0xd/0x30
[57652.691941]  [<ffffffff8109f0f3>] ? ktime_get_ts+0x43/0xe0
[57652.691941]  [<ffffffffa1a65b72>] txg_delay+0x3d2/0x5c0 [zfs]
[57652.691941]  [<ffffffffa1a65890>] ? txg_delay+0xf0/0x5c0 [zfs]
[57652.691941]  [<ffffffffa0021ddc>] __thread_exit+0x8c/0xa0 [spl]
[57652.691941]  [<ffffffffa0021d70>] ? __thread_exit+0x20/0xa0 [spl]
[57652.691941]  [<ffffffff81065cf4>] kthread+0xc4/0xe0
[57652.691941]  [<ffffffff81065c30>] ? kthread_create_on_node+0x170/0x170
[57652.691941]  [<ffffffff817ddbec>] ret_from_fork+0x7c/0xb0
[57652.691941]  [<ffffffff81065c30>] ? kthread_create_on_node+0x170/0x170
[57652.691941] ---[ end trace 80ac2dc931b9aee5 ]---
[57652.836655] ---[ end trace 80ac2dc931b9aee6 ]---

Tylko że w moim przypadku to nie gentoo i inna wersja jajka. Niestety nie udało mi się określić co spowodowało problem. Oczywiście zgłoszono już podobne problemy ale zazwyczaj pojawiały się po jakiś operacjach na poolach, w moim przypadku nie robiłem żadnych zmian, a sama historia zfs’a też nic nie pokazuje… dziwne.

Operacja naprawcza będzie opisana poniżej. Pomaga ona również na problem:

Failed to load ZFS module stack.

który pojawił się przy próbach naprawy wcześniejszego BUGa. Równocześnie jest to również sposób na rozwiązanie, równie popularnego problemu: Error! Could not locate dkms.conf file

Powiązane problemy:

Environment Info

Kernel:

Linux mtiPC 3.13.0-48-generic #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

SPL i ZFS:

spl, 0.6.3, 3.13.0-48-generic, x86_64: installed
zfs, 0.6.3, 3.13.0-48-generic, x86_64: installed

Poole: Poola złożona z dwóch dysków SSD:

$ zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
rpool                 109G   109G    31K  /rpool
rpool/ROOT            109G   109G    31K  /rpool/ROOT
rpool/ROOT/ubuntu-1   109G   109G   106G  /
$ zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
rpool   222G   109G   113G    49%  1.00x  ONLINE  -
$ zpool status rpool 
  pool: rpool
 state: ONLINE
  scan: scrub repaired 0 in 0h0m with 0 errors on Sun Aug 24 15:07:19 2014
config:

  NAME                                                STATE     READ WRITE CKSUM
  rpool                                               ONLINE       0     0     0
    ata-INTEL_SSDSC2CT120A3_CVMP231503KM120BGN-part2  ONLINE       0     0     0
    ata-INTEL_SSDSC2BW120A4_CVDA442001XQ1207GN-part1  ONLINE       0     0     0

errors: No known data errors

Reapair HOW-TO

Live-USB

Potrzebne będzie jakieś live distro, najlepiej na USB - polecam je wykonać przy pomocy unetbooin - w moim przypadku ubuntu gnome 14.04.2 - najbliższe mojemu systemowi. I z niego startujemy system.

Przygotowanie live ubuntu do pracy

$ sudo -i
# add-apt-repository --yes ppa:zfs-native/stable
# apt-get update
# apt-get install -y debootstrap spl-dkms zfs-dkms ubuntu-zfs

Włączenie modułu ZFS:

# modprobe zfs
# dmesg | grep ZFS
[    1.925403] ZFS: Loaded module v0.6.3-5~trusty, ZFS pool version 5000, ZFS filesystem version 5

Output może być trochę inny :)

Podmontowanie systemu bazowego i chroot na niego

Teraz można zaimportować poole:

# zpool import -d /dev/disk/by-id -R /mnt rpool

Powinno automatycznie zaciągnąć rpool, jeśli nie działa można spróbować:

# zpool import -R /mnt rpool

U mnie osobno jest partycja z GRUBem, więc mount boot/grub może się przydać (np. do sprawdzenia jakie jajka mamy) do utworzenia initramfs.

# mkdir -p /mnt/boot/grub
# mount /dev/disk/by-id/ata-INTEL_SSDSC2CT120A3_CVMP231503KM120BGN-part1 /mnt/boot/grub

[INFO] W tym momencie można wydać polecenie

# debootstrap trusty /mnt

by zainstalować świeży podstawowy ubuntu. Kilka mountów i chroot na system bazowy.

# mount --bind /dev /mnt/dev
# mount --bind /proc /mnt/proc
# mount --bind /sys /mnt/sys
# chroot /mnt /bin/bash --login

W tym momencie jesteśmy praktycznie na naszym systemie bazowym, można bez problemu instalować paczki, podnosić kernel, ładować moduły, edytować pliczki, itp. itd.

Jednak żeby rozwiązać problem należy pobawić się z kernelami i załadowanymi dla nich modułami.

# dkms status
spl, 0.6.3, 3.13.0-48-generic, x86_64: installed
zfs, 0.6.3, 3.13.0-48-generic, x86_64: installed

dkms wyświetla moduły zainstalowane dla konkretnych kerneli, w moim przypadku dla 3.13.0-48-generic ale taki output to “zdrowy” output. Normalnie dkms wyświetla jakieś problemy w nawiasie przy module. Warto przebudować moduły spl i zfs. Tutaj warto zwrócić uwagę że domyślnie chroot dalej myśli że ma kernel w nietypowej wersji, której nie ma w systemie bazowym - jest to wersja kernela z dystrybucji live. Więc przy instalacji modułów warto podawać dokładną wersję dla której moduł budujemy i instalujemy - w przeciwnym przypadku pobrana zostanie wartość dla zmiennej $KERNELRELEASE z uname -r czyli wersja kernela dla dystrybucji live.

# dkms remove -m zfs -v 0.6.3 --all
# dkms remove -m spl -v 0.6.3 --all
# dkms add -m spl -v 0.6.3 -k 3.13.0-48-generic
# dkms add -m zfs -v 0.6.3 -k 3.13.0-48-generic
# dkms install -m spl -v 0.6.3 -k 3.13.0-48-generic
# dkms install -m zfs -v 0.6.3 -k 3.13.0-48-generic

Teoretycznie można przed dkms install zrobić jeszcze dkms build dla każdego z modułów ale nie jest to wymagane, install i tak zbuduje moduł.

Teraz należy powiadomić wszystkich o zmianie w naszym jajku.

# update-initramfs -c -k 3.13.0-48-generic

Warto również zweryfikować czy moduł znajduje się w bootowanym obrazie, żeby nie zaskoczył nas problem z Failed to load ZFS module stack.:

# gzip -dc /boot/initrd.img-3.13.0-48-generic | cpio -it | grep zfs.ko

Jeśli go nie ma to znaczy że coś nie tak poszło przy instalacji modułu. (Czytamy logi?) [INFO] Może się zdarzyć że to nie pomoże, warto wtedy przeinstalować nagłówki jajka:

# apt-get install --reinstall linux-headers-3.13.0-48 linux-headers-3.13.0-48-generic

Warto odświeżyć gruba

# update-grub

Kroki końcowe:

Wychodzimy z chroota, odmontowanie i export pooli - jeśli export się nie powiedzie, system nie wystartuje.

# exit
# umount /mnt/boot/grub
# umount /mnt/dev
# umount /mnt/proc
# umount /mnt/sys
# zfs umount -a
# zpool export rpool

Koniec - reboot. Dziwne, u mnie działa


Source:
  1. #1155: Failed to load ZFS module stack.
  2. #3019: NULL pointer while trying to destroy a cloned filesystem.
  3. #1518: zfs receive -> unable to handle kernel NULL pointer dereference.
  4. Failed to load ZFS module stack
  5. Problems installing ubuntu 11.04 with native ZFS root -msg#00148
  6. HOWTO install Ubuntu to a Native ZFS Root Filesystem

Prywatne docker registry z prostą autoryzacją

Instalacja prywatnego registry dockera

pod ubuntu 14.04

paczka wersja
docker 1.4.1, build 5bc2ff8
docker-registry 0.9.1
python 2.7.6

Zależności

$ apt-get -y install build-essential python-dev libevent-dev python-pip liblzma-dev swig libssl-dev

Instalacja przez pip

dla wersji 0.9.1

$ pip install docker-registry

Jeśli pojawią się problemy przy budowaniu pakietu M2Crypto to znaczy że nie mamy swiga - można zainstalować przez apt-get albo bibliotek openssl - paczka libssl-dev załatwia sprawę.

Konfiguracja

Domyślna konfiguracja powinna znajdować się mniej więcej: /usr/local/lib/python2.7/dist-packages/config w pliku config_sample.yml. Wystarczy jej zmienić nazwę na config.yml.

Test lokalizacji plików docker-registry: gunicorn --access-logfile - --debug -k gevent -b 0.0.0.0:5000 -w 1 docker_registry.wsgi:application i sprawdzenie czego brakuje.

Tutaj również znajduje się plik konfiguracyjny dla mirrora repozytorium: config_mirror.yml


Zmiana domyślnej ścieżki /tmp i ustawienie ścieżki dla logów
mkdir -p /var/docker-registry /var/log/docker-registry

Podmienić w pliku konfiguracyjnym config.yml ścieżki:

    21c21
    <     sqlalchemy_index_database: _env:SQLALCHEMY_INDEX_DATABASE:sqlite:////tmp/docker-registry.db
    ---
    >     sqlalchemy_index_database: _env:SQLALCHEMY_INDEX_DATABASE:sqlite:////var/docker-registry/docker-registry.db
    74c74
    <     storage_path: _env:STORAGE_PATH:/tmp/registry
    ---
    >     storage_path: _env:STORAGE_PATH:/var/docker-registry/registry
    165c165
    <     storage_path: _env:STORAGE_PATH:/tmp/registry
    ---
    >     storage_path: _env:STORAGE_PATH:/var/docker-registry/registry
    221c221
    <     storage_path: _env:STORAGE_PATH:./tmp/test
    ---
    >     storage_path: _env:STORAGE_PATH:./var/docker-registry/test

Testowe odpalenie:

$ gunicorn --access-logfile - --debug -k gevent -b 0.0.0.0:5000 -w 1 docker_registry.wsgi:application
10/Feb/2015:00:16:31 +0000 WARNING: Cache storage disabled!
10/Feb/2015:00:16:31 +0000 WARNING: LRU cache disabled!
10/Feb/2015:00:16:31 +0000 DEBUG: Will return docker-registry.drivers.file.Storage

Konfiguracja i instalacja redis-server - cache:

$ apt-get -y install redis-server

W sekcjach cache i cache_lru w pliku config.yml podmienić:

    cache:
        host: localhost
        port: 6379
        db: 0

    cache_lru:
        host: localhost
        port: 6379
        db: 1

Teścik:

gunicorn --access-logfile - --debug -k gevent -b 0.0.0.0:5000 -w 1 docker_registry.wsgi:application

10/Feb/2015:00:27:17 +0000 INFO: Enabling storage cache on Redis
10/Feb/2015:00:27:17 +0000 INFO: Redis host: localhost:6379 (db0)
10/Feb/2015:00:27:17 +0000 INFO: Enabling lru cache on Redis
10/Feb/2015:00:27:17 +0000 INFO: Redis lru host: localhost:6379 (db0)
10/Feb/2015:00:27:17 +0000 INFO: Enabling storage cache on Redis
10/Feb/2015:00:27:17 +0000 INFO: Redis config: {'path': '/var/docker-registry/registry', 'host': 'localhost', 'password': None, 'db': 0, 'port': 6379}
10/Feb/2015:00:27:17 +0000 DEBUG: Will return docker-registry.drivers.file.Storage

Konfiguracja skryptu Upstart /etc/init/docker-registry.conf:

description "Docker Registry"

start on runlevel [2345]
stop on runlevel [016]

respawn
respawn limit 10 5

script
exec gunicorn --access-logfile /var/log/docker-registry/access.log --error-logfile /var/log/docker-registry/server.log -k gevent --max-requests 100 --graceful-timeout 3600 -t 3600 -b localhost:5000 -w 8 docker_registry.wsgi:application
end script

Opalany jako service:

service docker-registry start

Konfiguracja ssl i prostej autoryzacji

$ apt-get -y install nginx apache2-utils
$ htpasswd -c /etc/nginx/docker-registry.htpasswd USERNAME
/etc/nginx/sites-available/docker-registry
upstream docker-registry {
 server localhost:5000;
}

server {
 listen 8080;
 server_name private.registry.docker.example.com;

 # ssl on;
 # ssl_certificate /etc/ssl/certs/docker-registry;
 # ssl_certificate_key /etc/ssl/private/docker-registry;

 proxy_set_header Host       $http_host;   # required for Docker client sake
 proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

 client_max_body_size 0; # disable any limits to avoid HTTP 413 for large image uploads

 # required to avoid HTTP 411: see Issue #1486 (https://github.com/dotcloud/docker/issues/1486)
 chunked_transfer_encoding on;

 location / {
     # let Nginx know about our auth file
     auth_basic              "Restricted";
     auth_basic_user_file    docker-registry.htpasswd;

     proxy_pass http://docker-registry;
 }
 location /_ping {
     auth_basic off;
     proxy_pass http://docker-registry;
 }  
 location /v1/_ping {
     auth_basic off;
     proxy_pass http://docker-registry;
 }

}
$ ln -s /etc/nginx/sites-available/docker-registry /etc/nginx/sites-enabled/docker-registry
$ servier nginx restart
$ service docker-registry start

Teściki - pierwszy sprawdza czy repozytorium nadaje, drugi czy nginx nadaje a właściwie wymaga uprawnień, trzeci powinien dać wynik jak pierwszy:

$ curl localhost:5000
$ curl localhost:8080
$ curl USERNAME:PASSWORD@localhost:8080

Podpięcie pod registry

Instalacja dockera:

apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9;
/etc/apt/sources.list.d/docker.list
deb https://get.docker.io/ubuntu docker main
$ apt-get install lxc-docker
$ gpasswd -a ${USER} docker
$ service docker restart
$ docker login http://localhost:8080

Username: ghost
Password: 
Email: 
Login Succeeded

Praca z repozytorium

$ docker run -t -i ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
ubuntu:latest: The image you are pulling has been verified
511136ea3c5a: Pull complete 
27d47432a69b: Pull complete 
5f92234dcf1e: Pull complete 
51a9c7c1f8bb: Pull complete 
5ba9dab47459: Pull complete 
Status: Downloaded newer image for ubuntu:latest
root@04bc2c52881e:/# touch /SUCCESS
root@04bc2c52881e:/# exit
$ docker commit $(docker ps -lq) test-image
fd2659d1f8d017d46fdaa37bc450669a3b6833b97129f57e269f616db680f919
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
test-image          latest              fd2659d1f8d0        14 seconds ago      192.7 MB
ubuntu              latest              5ba9dab47459        12 days ago         192.7 MB

Konfiguracja SSL

Odkomentować linie w konfiguracji nginx:

 ssl on;
 ssl_certificate /etc/ssl/certs/docker-registry;
 ssl_certificate_key /etc/ssl/private/docker-registry;
Podpisanie własnym CA

wszędzie ustawienia domyślne

$ mkdir ~/certs && cd ~/certs
$ openssl genrsa -out devdockerCA.key 2048
$ openssl req -x509 -new -nodes -key devdockerCA.key -days 10000 -out devdockerCA.crt
$ openssl genrsa -out dev-docker-registry.com.key 2048
$ ls

devdockerCA.crt  devdockerCA.key  dev-docker-registry.com.key

teraz trzeba uważać na to co się wpisuje w polu Common Name - to samo co w nazwie serwera w konfiguracji nginxa - np. private.registry.docker.example.com

$ openssl req -new -key dev-docker-registry.com.key -out dev-docker-registry.com.csr
$ openssl x509 -req -in dev-docker-registry.com.csr -CA devdockerCA.crt -CAkey devdockerCA.key -CAcreateserial -out dev-docker-registry.com.crt -days 10000
$ ls
devdockerCA.crt  devdockerCA.srl              dev-docker-registry.com.csr
devdockerCA.key  dev-docker-registry.com.crt  dev-docker-registry.com.key

Przeniesć…

$ cp dev-docker-registry.com.crt /etc/ssl/certs/docker-registry
$ cp dev-docker-registry.com.key /etc/ssl/private/docker-registry
$ mkdir /usr/local/share/ca-certificates/docker-dev-cert
$ cp devdockerCA.crt /usr/local/share/ca-certificates/docker-dev-cert
$ update-ca-certificates
$ service nginx restart
$ service docker restart

W pliku /etc/hosts dodać przekierowanie dla domeny

127.0.0.1 private.registry.docker.example.com

Test:

$ curl https://USERNAME:PASSWORD@private.registry.docker.example.com:8080
Dodawanie crt na klientach dockera

Na tym etapie logowanie przy pomocy:

docker login https://private.registry.docker.example.com:8080

Skończy się błędem

FATA[0004] Error response from daemon: Server Error: Post https://private.registry.docker.example.com:8080/v1/users/: x509: certificate signed by unknown authority 

Dlatego… na kliencie trzeba wgrać nasz nieautoryzowany certyfikat.

$ mkdir /usr/local/share/ca-certificates/docker-dev-cert

Wrzucić zawartość, wygenerowanego wcześniej devdockerCA.crt do np. /usr/local/share/ca-certificates/docker-dev-cert/devdockerCA.crt

$ update-ca-certificates
$ service docker restart

TODO:

  • Instalacja ze źródeł
  • instalacja w virtualenv
  • konfiguracja redis-server - dodać parametr dla lru cache
  • konfiguracja ssl dla certa wydanego przez startssl
  • więcej o użyciu z klientem dockera

Source:
  1. How To Set Up a Private Docker Registry on Ubuntu 14.04 - digitalocean.com
  2. Deploying your own Private Docker Registry
  3. Docker Registry or How to Run your own Private Docker Image Repository
  4. Building private Docker registry with basic authentication
  5. Setup Your Own Docker Registry on CoreOS
  6. Redis configuration
  7. Redis lru cache mode

Monitoring

Cli

Sieć

System

Log

Narzędzia systemowe

Monitoring

Sec


Chcesz dodać coś od siebie? Stwórz ‘iszu’