1 kontener = 1 proces (lub kilka procesów, ale ściśle powiązanych z tym głównym)
(1 kontener na proces WWW, 1 na php, 1 na mysql)
** id zamienne z nazwą
** kiedy zwraca wykorzystane w poleceniu id/nazwę = polecenie zakończone sukcesem
** Exited (0) – wyłączony prawidłowo
1) pobranie obrazu
2) utworzenie kontenera *
można utworzyć kontener od razu, jeżeli nie będzie miał obrazu to sobie pobierze i uruchomi
########
kontener tworzy się nad image
image jest tylko RO
kontener nad imagem robi sobie przestrzeń RW
i od tego zależy ile waży dany kontener
########
docker image ls – listowanie pobranych obrazów
docker container ls – listowanie utworzonych kontenerów (bez -a same działające)
-a all
-s size
docker pull nazwa_obrazu(:tag/nr_wersji) – pobranie obrazu
^ Image id – identyfikator obrazu, który możemy użyć podczas tworzenia konfiguracji (lepsze niż nazwy)
############### DOCKER FILE (nazwa: Dockerfile)
# każda linia to warstwa
# obraz to szablon dla kontenera
# skąd image ma pobrać docelowe info o kernelu/systemie
# bazujemy na naszym pobranym obrazie
FROM ubuntu:16.04
# info o opiekunie danego dockerfile, info o twórcy (w dużych projektach)
LABEL maintainer=”WOJST”
# ustawienie zmiennej środowiskowej ENVIRONMENT=production
ENV nazwa_zmiennej=wartosc_zmiennej (alias np POSTFIX /etc/postfix; potem odwołujemy $POSTFIX)
# budując kontener na podstawie tego image najpierw wykonaj to
RUN apt-get update
# następnie zainstaluje pythona
# podczas tworzenia skryptów zapewniamy interaktywność z userem na poziomie zerowym
# wszystko ma robić z automatu, mamy zapewnić komendy które na pewno będą działały prawidłowo
RUN apt-get install -y python3
# skopiuje lokalny plik do kontenera
COPY local_file docker_fs
# po uruchomieniu zrób mi to: java – jar app.jar
ENTRYPOINT [„java”,”-jar”,”app.jar”]
## zmiana katalogu, inaczej cd
WORKDIR $env / dir
#############
Dockerfile to przepis na obraz
1. warstwa – Debian
2. warstwa – add emacs
3. warstwa – add Apache
########
docker build . – budowanie obrazu z powyższego pliku (kropka oznacza, że będzie szukał pliku o nazwie dockerfile)
docker build – < own_name_docker_file – budowanie obrazu z pliku o dowolnej nazwie
docker build . –tag/(-t) nazwa_taga – budowanie obrazu z pliku dockerfile, nadając mu odpowiedni tag
########
docker container run -itd –mount source=nazwa_wolumina,target=bezpośrednia_sciezka_w_kontenerze(np. /home) –restart xxx –link nazwa_kontenera:usługa –name <nazwa_kontenera> <image_id> /bin/bash – utworzenie kontenera
-i interaktywny
-t TTY, konsola
-d uruchomiony w tle
-P otwarcie dowolnego/wysokiego portu (docker container ls wskaże wysoki port, na jaki można się dostać przez adres localhost nadzorcy)
-p portnajakimmabycwidocznewnadzorcy:port_kontenera
–mount source, target- montowanie volumina
(gdyby był problem z montem to :
-v nazwa_voluminu:/pkt_montowania_w_kontenerze – montowanie woluminu [może być użyte kilka razy: -v 1:1 -v 2:2; wystarczy nazwa voluminu, nie potrzeba całej ściezki z inspecta]
-e zmienne środowiskowe (np danie danych do sql: login, hasło, baza danych)
! wrażliwe dane do pliku i potem login=/lokalizacja_pliku_z_hasłem
–link podłączenie pod usługę na innym kontenerze (np konterer_mysql:db, to w tym kontenerze zamiast IP serwera mysql wystarczy wpisać db; aktualizuje /etc/hosts)
–restart: określa zachowanie po zamknięciu (
[domyślnie] off – nie uruchomi ponownie
on-failure: x – uruchomi ponownie wtedy, gdy kod zamknięcia !=0 (zero oznacza, że admin wyłączył) – oznacza, że kontener się wykrzaczył bez interwencji usera, x określa ilość prób restartu
unless-stopped – uruchomi się ponownie, tylko wtedy gdy user go sam zatrzyma
always – zawsze będzie próbował uruchomić ponownie
# konfiguracje dodatkowe można dodać do pliku, a następnie podmontować go do conf.d
* jeżeli flaga to tylko jedna litera to jeden – (np -i), jeżeli flaga to długa nazwa to — (np –name)
docker container start/restart/stop/kill/pause id_of_containter – zarządzanie statusem kontenera
docker container rm nazwa_kontenera – skasowanie kontenera (wyłączonego)
-f – jeżeli kasujemy włączony
docker container attach id_of_container (dwa entery) – podłączenie do kontenera (wyjście z powłoki = zamknięcie kontenera)
docker container exec -it nazwa_kontenera bash (-c 'backup bazy danych $mysql_root_password) /(konkretne polecenie, np cat /etc/fstab) – podłączenie do kontenera (wyjście z powłoki != zamknięcie kontenera)
docker container inspect nazwa_kontenera – informacje kontenerze
docker container logs nazwa_kontenera – logi z kontenera
* restart – dane z kontenera są tracone (aktualizacje itp)
* pause kontenera – wisi, nic nie robi, nie chcemy ubijać – ale zatrzymać
########
docker image rm id_of_image/name_of_image – skasowanie obrazu
* jezeli skasowanie wywala błąd o dependency child, należy otagować swój image a następnie usunąć ten
docker tag id_of_image nazwa_repozytorium/nazwa_obrazu:tag– otagowanie obrazu
########
docker login – zalogowanie do repozytorium na Docker Hub
docker push repozytorium/nazwa_obrazu – wysłanie obrazu do Docker Hub
* zmieniamy tag aktualizując obraz i wtedy dajemy push drugiej wersji
########
Docker Swarm = klaster VM
! kubernetes to następca docker swarm
! docker zajmij się tym, żeby mój kontener się gdzieś odpalił, nie interesuje mnie gdzie
nadzorca (master) – VM
node – VM
VM mogą dołączać do klastra jako manager lub worker
docker node ls – wyświetlenie klastra (tylko na managerach)
1) Utwrrzenie klastra na jednym z hostów
docker swarm init –advertise-addr IP_hosta – utworzenie klastra na master1
2) Dodawanie hostów do klastra (po utworzeniu klastra robię tylko to) jako manager
docker swarm join-token manager – dodanie managera do master1 ->
skopiować i wywołać to co zwrócił na wszystkich masterach
3) dodanie node jako worker
na master1 generuje: docker swarm join-token worker
na node wklejam to co zwrócił
########
Docker compose – przepis na kontener
weź ten obraz, uruchom go, następnie uruchom mi tam x, x, x i y
########
Portainer – UI do dockera
odpalane jako kontener, dostęp po IP hosta:9000
sudo docker container run -tdi -p 9000:9000 -v „/var/run/docker.sock:/var/run/docker.sock” –name portainer portainer/portainer
######## VOLUMINY
przestrzeń dysku lokalnego wykorzystywanego przez kontener
mountuje się ją pod dany udział w kontenerze (np. /home)
jeden wolumin może być wykorzystywany przez wiele kontenerów
* podczas tworzenia z automatu się tworzy volumin tymczasowy, po skasowaniu kontenera się czyści
docker volume ls – wyświetli listę volumin
docker volume inspect nazwa_woluminu – szczegóły woluminu
docker volume create nazwa_voluminu – utworzenie volumina