Windows + Docker + RabbitMQ – jak zacząć?

Po obejrzeniu różnych prezentacji z konferencji na temat Dockera i jego możliwości, postanowiłam wreszcie spróbować jak to wygląda w praktyce – zwłaszcza jeśli chodzi o Docker Hub

Co na temat Dockera mówi Wikipedia?

“Docker jest określany jako narzędzie, które pozwala umieścić program oraz jego zależności w lekkim, przenośnym, wirtualnym kontenerze, który można uruchomić na prawie każdym serwerze z systemem Linux”

Troszkę się myli, bo już powodzeniem Docker działa również na Windows o czym za chwilę.

Co nam daje Docker Hub?

Otóż powiedzmy, że potrzebujemy zrobić jakiś proof of concept w PHP z MySQL, ale nie mamy go zainstalowanego na komputerze, bo na przykład na co dzień pracujemy w Ruby:) Zakładam, że jest to Windows, więc wszystko wyżej wymienione musimy zainstalować od zera albo przynajmniej w formie gotowca jak WampServer itp. Przyjmijmy jednak tą czarną wersję – instalujemy po kolei – Apache, MySQL, PHP… Często po drodze coś się poknoci, coś trzeba dokonfigurować i tak zamiast zajmować się upragnionym projektem nadal męczymy się z konfiguracją.

I tutaj z pomocą przychodzi nam Docker Hub, który to jest zbiorem obrazów różnych środowisk i ma w swoich zasobach tysiące najbardziej popularnych konfiguracji. I tak znajdziemy tutaj zarówno obrazy oficjalne jak i utworzone przez użytkowników. Wśród takich można znaleźć m.in. właśnie obraz z wspomnianym wyżej środowiskiem – na przykład tutaj. Oprócz tego dostępnych jest całe mnóstwo innych: środowisko z NodeJS, Ruby, MariaDB czy Perl.

Zatem teraz, gdy zapragniemy się pobawić czymś, nie musimy już żmudnie instalować wszystkiego od zera narażając się na konfiguracyjny koszmar, ale możemy skorzystać z Dockera, dzięki czemu nie zaśmiecimy sobie komputera kolejnym frameworkiem, bazą danych czy językiem.

Jako, że ostatnio świeżo zainstalowałam system, postanowiłam, iż spróbuję obrazów Dockera, by właśnie nie bawić się w instalowanie tymczasowych rzeczy. Wybór padł na RabbitMQ, ponieważ wymaga zainstalowania nie tylko samego siebie, ale również Erlanga co już czyni instalację go na komputerze nieco skomplikowaną.

Krok 1 – Instalacja Dockera (Windows)

Zaczynamy od ściągnięcia instalatora ze strony Dockera i uruchomienia go. Po przejściu przez ekrany instalatora na których właściwie możemy się ograniczyć do klikania po kolei bez zmieniania niczego, Docker nam się uruchomi – w trayu obok zegara pojawi nam się animowana ikonka orki. Przestanie się ona animować po uruchomieniu.

Krok 2 – Pobranie i uruchomienie obrazu RABBITMQ

Następnie w dowolnej konsoli – może to być cmd.exe lub PowerShell możemy zweryfikować działanie Dockera na naszym systemie. Robimy to za pomocą komendy

docker version

albo

docker info

U mnie efekt wykonania tych dwóch poleceń w Powershellu wygląda tak:

PS C:\Users\Maga> docker version
Client:
Version: 1.12.0-rc2
API version: 1.24
Go version: go1.6.2
Git commit: 906eacd
Built: Fri Jun 17 20:35:33 2016
OS/Arch: windows/amd64
Experimental: true

Server:
Version: 1.12.0-rc2
API version: 1.24
Go version: go1.6.2
Git commit: a7119de
Built: Fri Jun 17 22:09:20 2016
OS/Arch: linux/amd64
Experimental: true

PS C:\Users\Maga> docker info
Containers: 3
Running: 1
Paused: 0
Stopped: 2
Images: 3
Server Version: 1.12.0-rc2
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 28
Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: host null bridge overlay
Swarm: inactive
Runtimes: default
Default Runtime: default
Security Options: seccomp
Kernel Version: 4.4.13-moby
Operating System: Alpine Linux v3.4
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.951 GiB
Name: moby
ID: GDGQ:RKGE:TAAR:PJBY:7USG:WRRO:RO34:WJFC:CNFN:TJ2Q:D6Q3:MCTV
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: true
Insecure Registries:
127.0.0.0/8

Powiedzmy zatem, że chcielibyśmy pobawić się RabbitMQ, w związku z czym wykonujemy na przykład komendę:

docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management

Pozwala ona na ściągnięcie i uruchomienie obrazu z Rabbitem wyposażonym już w dodatek w postaci panelu administracyjnego dostępnego z okna przeglądarki. Ułatwia on zarządzanie kolejkami i wszystkim co z Rabbitem związane. Dodatkowo interesująca jest opcja -p, która to umożliwia wystawienie z Dockera na zewnątrz portów z których chcemy korzystać. W naszym przypadku są to: port 15762 – port panelu administracyjnego oraz port 5762 – domyślny port na którym działa RabbitMQ. Jeśli chodzi o opcje –name i –hostname pozwalają nam one nazwanie obrazu (przydatne przy późniejszym zarządzaniu nim – np. usuwaniu czy zatrzymywaniu) a także ustawienie nazwy hosta dla obrazu. Szczególnie ważne w tej komendzie są właśnie porty, ponieważ ta konfiguracja pozwala nam na dostęp do Rabbita w kontenerze z zewnątrz. Dodatkowo potrzebujemy wiedzieć jaki jest adres naszego kontenera. Możemy go uzyskać wydając komendę:

docker inspect

Na samym końcu w sekcji Network Settings mamy Ports, które to nam pokazują pod jakim adresem dostępny jest nasz kontenerowy RabbitMQ.

"NetworkSettings": {
"Bridge": "",
"SandboxID": "354fe7fe505b0348c644fa2310e061eb2485c736aef2803bef01cc9cf5bf249e",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"15672/tcp": [
{
"HostIp": "10.0.75.2",
"HostPort": "15672"
}
],
"5672/tcp": [
{
"HostIp": "10.0.75.2",
"HostPort": "5672"
}
]
},
"SandboxKey": "/var/run/docker/netns/354fe7fe505b",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "63e61764bfcfab2ea0cc86ad347eae8700bb19b8586379e65fb1970773f8ba3f",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "ea74a2753b20bd4f8b1e974b2611df9091c23b4110ee3fa469da6ecffd1752e1",
"EndpointID": "63e61764bfcfab2ea0cc86ad347eae8700bb19b8586379e65fb1970773f8ba3f",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}
}

I teraz by z naszego komputera otworzyć na przykład panel administracyjny RabbitMQ wystarczy wejść na adres, który wyświetla się w Ports – w moim przypadku będzie to http://10.0.75.2:15762