Wpisy

Uruchomianie kontenera z serwerem MySQL na Dockerze

Tworzenie kontenerów

Kontenery służą do uruchamiania aplikacji w kontenerze. Aplikacje instalujemy na naszym komputerze, ale w izolowanym, dedykowanym środowisku dostarczonym przez Dockera.
Obraz to paczka zawierająca biblioteki systemu bazowego. Np. może to być system CentOS, Ubuntu czy inny Debian, z zainstalowanym serwerem WWW. Dla projektu Docker powstało bogate repozytorium z obrazami, w którym użytkownicy mogą znaleźć coś dla siebie. Można tam także publikować swoje obrazy.
Interesujących Nas obrazów możemy szukać na dwa sposoby: przez interfejs WWW lub korzystając z interfejsu CLI.
Interfejs WWW:
Kontener z Postgresem zdj.1
Drugi sposób zawiera polecenie docker search, które pozwala w szybki sposób znaleźć coś dla siebie.

$ sudo docker search mysql 
Kontener z Postgresem zdj.2
Warto zwrócić uwagę na kolumnę Official. Wartość [OK] oznacza, że obraz jest utrzymywany przez sprawdzony zespół i że jest to oficjalna dystrybucja tej aplikacji. Można użyć innych obrazów, ale nie będziemy mieli pewności, że wszystko będzie działało poprawnie.
Jeśli wejdziemy na stronę projektu mysql to możemy zobaczyć przez kogo projekt jest utrzymywany, jakie są wspierane wersje Dockera dla tego projektu, możemy znaleźć komendę do instalacji obrazu oraz zobaczyć, że obraz występuje w kilku wariantach (tagach). Mechanizm tagów używany jest przez twórców obrazów, aby można było pobierać obrazy w różnych wersjach (z różnymi funkcjonalnościami).Kontener z Postgresem zdj.3
Po wykonaniu poniższego polecenia, narzędzie pobierze obraz kontenera. Jeżeli nie dokleimy nazwy taga do nazwy obrazu to docker użyje domyślnej nazwy tagu (latest).

$ sudo docker pull mysql 

Kontener z Postgresem zdj.4
Sprawdzamy listę naszych obrazów:

$ sudo docker images

Kontener z Postgresem zdj.5
W Dockerze używany jest system plików AUFS, dlatego obrazy składają się z warstw, które często są współdzielone między różnymi obrazami. Np. jeżeli kiedyś będziemy chcieli ściągnąć najnowszą wersję obrazu mysql, ściągnięte zostaną tylko te warstwy, których nie mamy lokalnie.

Uruchamianie obrazu

Do uruchamiania obrazów służy polecenie docker run. Polecenie te wykorzystuje wybrany obraz, dokłada do systemu plików dodatkową warstwę, która może być modyfikowana (warstwy wchodzące w skład obrazu nigdy nie są modyfikowane!) i nakazuje w ramach tak utworzonego nowego kontenera, wykonanie wybranego polecenia. By było łatwiej, twórcy obrazów często w konfiguracji ustalają domyślne polecenie (np. start serwera WWW), więc nie trzeba się o nie martwić.  Możemy teraz postawić pierwszy kontener z MySQL.
Możemy użyć następującej komendy:

$ sudo docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=H@sl0MySQL -d mysql
Kontener z Postgresem zdj.6

Sprawdzamy, czy nasz kontener jest widoczny:

$ sudo docker ps

Kontener z Postgresem zdj.7

Ponieważ nie zrobiliśmy mapowania portów, nasz serwer mysql nie będzie widoczny ani w naszym komputerze hoście (jest to komputer, na którym uruchamiamy kontenery) ani w innych kontenerach. Zawsze możemy uruchomić basha na kontenerze oraz podpiąć jego konsolę, aby sprawdzić, czy kontener odpowiada. Jeśli jako rezultat zobaczymy wpis rozpoczynający się od root@id_kontenera, to znaczy, że kontener odpowiada na nasze pytania. Wpisujemyexit, aby zamknąć basha.

$ sudo docker exec -it 5aa3a769250d /bin/bash

Kontener z Postgresem zdj.8Chcąc stworzyć trochę bardziej użyteczny kontener, przekierujemy porty z kontenera na hosta. Aby to zrobić musimy stworzyć kontener na nowo.

$ sudo docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=H@sl0MySQL -d -p 9001:3306 mysql

Kontener z Postgresem zdj.9
Poniższy błąd oznacza, że mamy już kontener o nazwie mysql1. Możemy stworzyć nowy (dodatkowy) kontener lub usunąć stary i stworzyć nowy.
Aby usunąć stary kontener i stworzyć nowy kontener, najpierw uruchamiamy polecenie wyświetlające nasze kontenery, aby znaleźć id naszego kontenera.

$ sudo docker ps

Jeśli kontener jest uruchomiony (a nasz jest), to musimy go zatrzymać za pomocą polecenia poniżej. Po słowie stop podajemy albo id_kontenera albo jego nazwę.

$ sudo docker stop mysql1

Następnie uruchamiamy polecenie, które usunie nasz kontener.

$ sudo docker rm 5aa3a769250d

Na koniec sprawdzamy, czy nasz kontener został faktycznie usunięty.
Kontener z Postgresem zdj.10
Teraz możemy jeszcze raz wykonać wcześniejsze polecenie:

$ sudo docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=H@sl0MySQL -d -p 9001:3306 mysql 

Dodatkowy parametr -p 9001:3306 otwiera port 9001 na hoście i przekierowuje na porty 3306 w kontenerze (3306 to domyślny port mysql). Możemy teraz zauważyć, że wpis w kolumnie porty wygląda inaczej niż wcześniej.
Kontener z Postgresem zdj.11
Mamy teraz kontener i przekierowane porty. Aby jednak móc podłączyć się do mysql z zewnątrz musimy skonfigurować jeszcze sam serwer bazodanowy.
Przechodzimy do konsoli Dockera za pomocą poniższego polecenia (musimy pamiętać, że nowy kontener ma nowe id):

$ sudo docker exec -it e0f6e793d78f /bin/bash

Instalujemy w kontenerze VIM’a, który przydaje się przy edycji plików.

$ sudo apt-get update
$ sudo apt-get install vim

(W rzeczywistości kodu jest dużo więcej niż na zdjęciu!).

Czasami, aby móc łączyć się zdalnie z serwerem musimy wyedytować plik konfiguracyjny /etc/mysql/mysql.conf.d/mysqld.cnf lub /etc/mysql/my.cnf (zależy od wersji Ubuntu):

vim /etc/mysql/mysql.conf.d/mysqld.cnf

Odkomentowujemy bind-address i zmień domyślny adres 127.0.0.1 na 0.0.0.0. Jeśli takiego wpisu nie ma to dodajemy taki wpis do pliku:

bind-address = 0.0.0.0

Kontener z MySQL zdj.13
Logujemy się do mysql:

mysql -u root -p

Podczas logowania zostajemy poproszeni o hasło. Po wpisaniu hasła logujemy się do MySQLa.
Kontener z Postgresem zdj.15
Musimy jeszcze nadać uprawnienia dla użytkownika root, aby mógł logować się z dowolnego hosta. Wykonujemy następujące polecenia:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';

Kontener z Postgresem zdj.14Aby zapisać zmiany, musimy zresetować kontener.
Klikamy 2x CRTL + D, aby wyjść z MySQL i konsoli kontenera.
Potem wpisujemy komendę.

$ sudo docker restart e0f6e793d78f 

Po tych wszystkich operacjach mamy już wstępnie skonfigurowany mysql.

Źródła

  • Repozytorium obrazów Dockera: https://registry.hub.docker.com/
  • Dokumentacja referencyjna CLI Dockera: http://docs.docker.com/reference/commandline/cli/

Instalacja Dockera na serwerze Ubuntu

Instalacja Dockera na Ubuntu

Instrukcja, jak zainstalować serwer Ubuntu dla Dockera na maszynie wirtualnej Azure znajduje się tutaj.

Otwieramy maszynę wirtualną z zainstalowanym serwerem Ubuntu i zapisujemy adres IP (klikamy link dockerdemo-ip). Możemy przypisać opcjonalnie etykietę nazwy DNS i/lub zamienić adres IP na statyczny (zakładka Konfiguracja).

Docker Ubuntu Azure zdj.20

Możemy się połączyć z serwerem Ubuntu za pomocą poleceń ssh:

Uwierzytelnianie SSH:

ssh username@IPAddress -i ~/privatekey

Password Authentication:

ssh username@IPAddress

Docker Ubuntu Azure zdj.21

Usunięcie innych instalacji Dockera

Usuwamy Dockera (jeśli wcześniej był zainstalowany):

$ sudo apt-get remove docker docker-engine docker.io
$ sudo apt-get remove docker docker-engine docker.io containerd runc

Docker Ubuntu Azure zdj.22
Aktualizujemy indeksy pakietu apt:

$ sudo apt-get update

Docker Ubuntu Azure zdj.27

Instalujemy pakiety, aby pozwolić apt na używanie repozytoriów poprzez HTTPs. Jeśli wcześniej już instalowaliśmy jakieś pakiety, to będzie sprawdzona ich zgodność z najnowszymi wersjami.

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common

Docker Ubuntu Azure zdj.23

Dodajemy oficjalny klucz GPG Dockera:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Docker Ubuntu Azure zdj.24
Weryfikujemy, że teraz mamy klucz z  fingerprintem 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88, poprzez przeszukanie ostatnich 8 znaków.

$ sudo apt-key fingerprint 0EBFCD88

Docker Ubuntu Azure zdj.26
Używamy następującego polecenia, aby skonfigurować stabilne (ang. stable) repozytorium. Zawsze potrzebujemy stabilnego repozytorium, nawet jeśli chcemy zainstalować kompilacje (ang. builds) z repozytoriami brzegowym (ang. edge) lub testowym (ang. test). Aby dodać repozytoria brzegowe lub testowe, dodajemy słowo edge lub test (lub oba) po słowie stable w poleceniach poniżej.

Ważne: Polecenie lsb_release -cs poniżej zwraca nazwę naszej dystrybucji Ubuntu, na przykład xenial. Czasami, w dystrybucji takiej jak Linux Mint, możemy potrzebować zmienić $(lsb_release -cs)na naszą macierzystą dystrybucję Ubuntu. Na przykład, jeśli korzystamy z Linux Mint Tessa, możemy użyć bionic.

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

Ważne: Począwszy od Dockera 17.06, stabilne (ang. stable) wydania są również przekazywane do repozytorów brzegowych (ang. edge) i testowych (ang. test).

Docker Ubuntu Azure zdj.28

Aktualizujemy raz jeszcze:

$ sudo apt-get update

Docker Ubuntu Azure zdj.29

Instalujemy ostatnią wersję Docker CE lub przechodzimy do następnego kroku, aby zainstalować specyficzną wersję:

$ sudo apt-get install docker-ce

Docker Ubuntu Azure zdj.30
To install a specific version of Docker CE, list the available versions in the repo, then select and install:
Aby zainstalować konkretną wersję programu Docker CE, wyświetlamy listę dostępnych wersji w repozytorium, a następnie wybieramy i instalujemy:
a. Sprawdzamy wersje dostępne w repozytorium:

$ apt-cache madison docker-ce

Docker Ubuntu Azure zdj.32
b. Instalujemy konkretną wersję, używając ciągu wersji z drugiej kolumny, na przykład: 5:18.09.1~3-0~ubuntu-xenial.

$ sudo apt-get install docker-ce=<VERSION_STRING>

Sprawdzamy, czy Docker CE jest poprawnie zainstalowany, uruchamiając obraz hello-world.

$ sudo docker run hello-world

Powininniśmy zobaczyć rezultat podobny do poniższego, jeśli wszystko działa poprawnie:

Docker Ubuntu Azure zdj.31

Polecenia Dockera

Poniżej znajduje się zestaw popularnych komend Dockera, przydatnych w codziennej pracy z kontenerami.

Sprawdzenie, czy mamy Dockera na komputerze:

$ sudo docker -v

Podstawowe komendy Dockera zdj.10

Wyświetlenie szczegółowych informacji o Dockerze:

$ sudo docker -info

Polecenia Dockera zdj.10

Wyświetlenie listy komend:

$ sudo docker -h

Polecenia Dockera zdj.1
Polecenia Dockera zdj.2
Wyświetlenie listy komend powiązanych z obrazami. Bez słowasudopolecenie zamiast zwrócić informację o dostępnych obrazach, może zwrócić informację o braku dostępu (ang. access denied)):

$ sudo docker image

Polecenia Dockera zdj.3

Praca z obrazami

Wyświetlenie listy obrazów w lokalnym repozytorium (nie w rejestrach):

$ sudo docker image ls

Polecenia Dockera zdj.4
Pobranie obrazu (komenda ogólna):

$ sudo docker pull <nazwa_repo>:[tag]

Pobranie najnowszego obraz debian z publicznego repozytorium:

$ sudo docker pull debian


Wyświetlenie pobranego obrazu w konsoli:

$ sudo docker image ls

Polecenia Dockera zdj.6
Pobranie obrazu debiana w wersji 8:

$ sudo docker pull debian:8

Polecenia Dockera zdj.7
Ponowne wyświetlenie pobranego obrazu w konsoli:

$ sudo docker image ls

Polecenia Dockera zdj.8

Praca z kontenerami

Wyświetlenie listy kontenerów (aktywnych) w konsoli:

$ sudo docker container ls

Aliasem do tego polecenia jest:

$ sudo docker ps

Polecenia Dockera zdj.11
Kolejne kolumny oznaczają odpowiedni identyfikator kontenera, nazwę obrazu z którego został on utworzony, wykonywaną komendę, czas utworzenia, status, udostępnione porty i nazwę pod jaką można się do niego odwoływać.
Zatrzymanie kontenera – komenda ogólna :

$ sudo docker stop <nazwa_kontenera\id_kontenera>

Zatrzymanie kontenera przy użyciu nazwy kontenera przy pomocy polecenia:

$ sudo docker stop amazing_grothendieck

Polecenia Dockera zdj.13
Po wykonaniu tej komendy, kontener jest zatrzymany. Teraz możemy porównać 2 polecenia:

$ sudo docker ps

i

$ sudo docker ps -a

Pierwsze wyświetla tylko uruchomione kontenery, drugie także te zatrzymane.
Polecenia Dockera zdj.14
Ponowne włączenie kontenera:

$ sudo docker start amazing_grothendieck

Polecenia Dockera zdj.15

Wyświetlanie statusu kontenerów

Sprawdzenie, jakie procesy działają w kontenerze:

$ sudo docker top hakase

Polecenia Drupala zdj.16
Tutaj widać zalety wykorzystania Dockera – narzut uruchomienia kolejnych kontenerów to tylko kwestia uruchomienia kilku dodatkowych serwerów. W pełnej wirtualizacji mamy dodatkowo kilkadziesiąt dodatkowych programów.
Jeśli chcemy sprawdzić, jakie porty udostępnia Docker, sprawdzimy to za pomocą polecenia:

$ sudo docker port hakase

Polecenia Dockera zdj.17
Jeżeli chcemy zobaczyć logi kontenerów, sprawdzamy to za pomocą polecenia:

$ sudo docker logs hakase

Polcenia Dockera zdj.18

Zapisywanie zmian w kontenerze

Obrazy nie są modyfikowane. Modyfikowane są tylko kontenery, które tworzymy za pomocą komendy:

$ sudo docker run

Oznacza to, że kiedy będziemy tworzyć kolejny kontener, nie będzie on zawierał zmian, które zostały wykonane przez inne kontenery korzystające z tego samego obrazu.
Jeśli chcemy zapisać zmiany w konterze i np. utworzyć nowy obraz bazujący na tych zmianach, najpierw sprawdzamy, jakie zmiany przechowuje nasz kontener. Robimy to za pomocą polecenia:

$ sudo docker diff hakase

Polecenia Dockera zdj.19
Jeżeli nasze zmiany są poprawne, możemy zatwierdzić te zmiany i wykorzystać w przyszłości.

Usuwanie kontenerów

Kiedy kontenery nie są nam już potrzebne, można je usunąć. Najpierw sprawdzamy dostępne obrazy:

$ sudo docker images

Polecenia Dockera zdj.20
Najpierw próbujemy usunąć obraz nginx_image, używany przez kontener hakase:

$ sudo docker rmi nginx_image

Polecenia Dockera zdj.21
System nie pozwolił nam na usunięcie obrazu, ponieważ uruchomiony jest konter, który bazuje na tym obrazie.
Najpierw sprawdzamy, czy kontener jest aktywny:

$ sudo docker ps

Polecenia Dockera zdj.22
Jak widać, kontener hakase jest aktywny, więc przed jego usunięciem musimy go najpierw zatrzymać:

$ sudo docker stop hakase

Polecenia Dockra zdj.23
Po tych operacjach możemy usunąć kontener:

$ sudo docker rm hakase

Polecenia Dockera zdj.24
Sprawdzamy, czy nasz kontener został usunięty:

$ sudo docker ps

Polecenia Dockera zdj.25
Po tym kroku, możemy usunąć bazowy obraz:

$ sudo docker rmi nginx_image

Polecenia Dockera zdj.26

Współdzielenie katalogów między serwerem a kontenerami

Czasami istnieje potrzeba współdzielenia katalogu pomiędzy kontenerem a komputerem. Jeżeli rozwijamy własny projekt, można współdzielić kod projektu. W przypadku tradycyjnych rozwiązań wirtualizacyjnych, np. Virtualbox, pojawia się duży narzut wydajności na operacje IO, w przypadku Dockera takiego dużego narzutu już nie ma.
Przykładowy kod współdzielenia katalogów z logami aplikacji:

$ docker -d run --name drupal_server -v /sciezka/na/serwerze:/sciezka/w/kontenerze

Polecenie -v wskazuje, iż: /sciezka/na/serwerze ma być dostępna jako katalog „/sciezka/w/kontenerze” w kontenerze.

Operacje globalne

Zatrzymanie wszystkich aktywnych kontenerów:

$ docker stop $(docker ps -q)

Usunięcie wszystkich kontenerów:

$ docker rm $(docker ps -a -q)

Usunięcie wszystkich obrazów:

$ docker rmi $(docker images -q)