Docker

Debian KVM Docker

Instalacja dockera pod Debianem

apt install docker.io

Jeżeli mamy skonfigurowany bridge i korzystamy z wirtualizacji przy użyciu libvirt często po instalacji dockera pojawiają się problemy z działaniem sieci. Najprostszym rozwiązaniem (o ile nie korzystamy z ebtables/iptables do kształtowania ruchu w naszym połączeniu zmostkowanym) jest wyłączenie modułu br_netfilter. Wspomniany moduł możemy usunąć z dostępnych dla kernela modułów dodając wpis blacklist br_netfilter w pliku /etc/modprobe.d/blacklist.conf a następnie wywołując update-initramfs -u. Niestety niekiedy to rozwiązanie okazuje się nie być do końca skutecznym. Ostateczne rozwiąznie problemu to:

echo install br_netfilter /bin/true > /etc/modprobe.d/disable-br-netfilter.conf

Drugą opcją jest wyłączenie funkcjonalności tego modułu bez usuwania go:

sysctl -w net.bridge.bridge-nf-call-iptables=0

Przy czym to polecenie musi być wywoływane przy starcie systemu.

Trzecia opcja (po każdym uruchomieniu hosta):

iptables -I FORWARD -i br0 -o br0 -j ACCEPT

Prócz tego warto dodać swojego użytkownika do grupy docker by móc używać dockera przez ciągłego wywoływania sudo

usermod -a -G docker USERNAME

Struktura katalogów dockera

W katalogu /var/lib/docker przetrzymywane są dane związane z dockerem. Podkatalog image zwiera obraz a containers zawiera dane kontenerów. Każdy kontnere ma katalog zaczynający się od jego CONTAINER ID.

Edytując plik hostconfig.json możemy zmienić konfigurację istniejącego kontenera. Przykładowo możemy zmienić numer portu na którym kontener wystawia swój port, żeby tego dokonać należy:

  1. Zatrzymać kontener docker stop ID_KONTENERA
  2. Zatrzymać usługę docker
  3. Zmienić wartość w polu HostPort na nowy numer portu
  4. Uruchomić ponownie usługę docker
  5. W razie potrzeby uruchomić kontener docker start ID_KONTENERA Jeżeli nie zatrzymamy całej usługi dockera to niestety zmiany które wprowadzimy zostaną od razu nadpisane i nie będą uwzględnione.

Przydatne polecenia

Lista dostępnych lokalnie obrazów

docker image ls

Usuwanie obrazu z lokalnego repozytorium

docker image rm ID_OBRAZU

Pobieranie konkretnego obrazu

docker image pull NAZWA_OBRAZU:TAG

Przypisywanie oznaczenia obrazowi

docker tag ID_OBRAZU NAZWA:TAG

Lista wszystkich kontenerów

docker container ls -a

Uruchamianie konsoli bash podpiętej pod wybrany kontener

docker exec -it ID_KONTENERA bash

Uruchomienie kontenera z portem przekierowanym przez docker-proxy na lokalną maszynę (należy pamiętać, że run za każdym razem tworzy nowy kontener)

docker container run -d -P ID_KONTENERA

Uruchomienie kontenera który udostępnia port 80 na porcie 81 lokalnego hosta (należy pamiętać, że run za każdym razem tworzy nowy kontener)

docker container run -d -p 81:80 ID_KONTENERA

Jeżeli chcemy utworzyć kontener z systemem operacyjnym który ma działać to musimy go wywołać z powłoką, tylko wtedy będzie się go dało ponownie uruchomić polecenim docker start ID_KONTENERA. By tego dokonać należy wydać polecenie docker container run NAZWA_SYSTEMU bash

Zatrzymywanie pracy kontenera

docker container stop ID_KONTENERA

Zabicie kontenera

docker container kill ID_KONTENERA

Usuwanie kontenera

docker container rm ID_KONTENERA

Przeglądanie szczegółowych danych na temat kontenera

docker container inspect ID_KONTENERA

Uruchomienie systemu w kontenerze w trybie interaktywnym z bash

docker run -it ubuntu bash

Dockerfile

W nowym katalogu tworzymy plik dockerfile. Każda linia tego pliku to nowa wartwa w obrazie dockera. Umieszczając polecenia w pliku należy mieć na uwadze by były zupełnie nieinteraktywne.

FROM ubuntu:16.04
LABEL maintainer="dane do kontaktu"
RUN apt-get update
RUN apt-get install -y python3

FROM - oznacza skąd pobieramy pierwotną warstwę - podajemy nazwę obrazu. Brak tagu po dwukropku spowoduje pobranie najnowszej wersji.

LABEL maintainer - tutaj warto podać dane kontaktowe jeśli będziemy publikować obraz.

RUN to polecenie które ma być wykonane w kontenerze.

Docker Swarm - klaster dockera

Pobieranie obrazu dockera bazy influxdb

docker pull influxdb

Jeżli zależy nam na pobraniu konkretnej wersji (na przykład Ubuntu) to wydajemy polecenie:

docker pull ubuntu:18.04

Uruchomienie pobranego obrazu

docker run -it influxdb

Domyślnie kontener uruchomi się bez przekierowania portów a parametr -it podpina na stałe terminal.

Zeby uruchomić kontener w trybie headless i z przekierowanymi portami użyć trzeba polecenia:

docker run -d -P --name nasz_influx influxdb

Porty zostaną wybrane losowo, by zobaczyć jakie porty zostały przydzielona wystarczy wydać komendę

docker port nasz_influx

Możemy na sztywno wyznaczyć porty używając składni:

docker run -d -p 8086:8086 nasz_influx

Co spowoduje przekierowanie portu 8086 z nasz_influx na port 8086 maszyny hostującej nasze kontenery.
Pierwszy port to port maszyny hosta a drugi port z kontenera.

Stworzenie kontenera influxdb o nazwie nasz_influx z przekierowaniem na port 8086 przechowującego dane w katalog /var/lib/influxdb2 maszyny hostującej kontener wygląda następująco:

docker run -d -p 8086:8086 -v myInfluxVolume:/var/lib/influxdb2 --name nasz_influx influxdb

Zatrzymywanie działającego kontenera

docker stop nasz_influx

Ponowne uruchomienie już istniejącego kontenera (utworzonego po wydaniu polecenia run)

docker start nasz_influx

Przeglądanie pobranych obrazów

docker images

Przeglądanie uruchomionych kontenerów

docker ps

Jeżeli dodamy parametr -a to zobaczymy również kontenery, które zakończyły pracę.

Poprzedni wpis Następny wpis