Prezentacja będzie zawierała luźne anegdoty i doświadczenia z używania kontenerów dockera w produkcji, również do hostowania aplikacji PHP. Sposoby budowania kontenerów, typowe problemy deploymentu.
6. Adresy usług
● Wiele kontenerów lokalnych
● Wiele hostow
● Różne hosty
– np. DB: single node vs master+slaves
docker run
--name „dba.2501” …
docker run
--name „php.2501”
--link „dba.2501:db-master”
--link „dba.2501:db-slave” ...
Lokalnie udajemy produkcję...
docker run
--name „php.2501”
--add-host „db-master:10.0.0.2”
--add-host „db-slave:10.0.0.3” ... ...na produkcji udajemy linkowanie lokalne.
7. Adresy usług – pt 2
● ...ale, ale… ja mam więcej niż jeden projekt?!
docker run --name „2501.project.local” -p „80:80” ...
docker run --name „skynet.project.local” -p „80:80” …
Bind for 0.0.0.0:80 failed: port is already allocated
docker run --name „2501.project.local” -p „80:80” ...
● ...ups.
docker run --name „2501.project.local” -p „127.0.0.1:80:80” …
docker run --name „skynet.project.local” -p „127.0.0.2:80:80” …
● Słuchamy tylko lokalnie,
● Nie ma konfliktu adresów,
● ...ale: Linux only.
8. Nazwy hostów
● 2501.project.local
● project.stage.example.com
● project.com
server {
server_name ~(^|.)project.(local|(stage.example.)?com)$
} Nginx na ratunek.
$HTTP[„host”] =~ „~(^|.)project.(local|(stage.example.)?com)$” {
...
}
Lighttpd też może.
● ...albo po prostu wiele vhostów.
9. Uprawnienia
● Kontenery nie są prywatne
– Repozytoria (doker hub itp.)
– Devs nie muszą / nie powinni posiadać haseł
produkcyjnych
● Rozwiązania?
– Autoryzacja w oparciu o hosty?
● Co ze zmiennym IP kontenerów?
– Hasła w zmiennych środowiskowych?
11. /var/lib/docker
● Przechowuje obrazy
– Ściągnięte z repozytoriów
– Zbudowane
– Częściowe (cache)
● Przechowuje volumeny
● Przechowuje metadane
● Co to oznacza?
12. /var/lib/docker
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
● Brak działających kontenetów...
14. /var/lib/docker
# du -sh /var/lib/docker
1,3G /var/lib/docker
● ...ups.
● Po losowym czasie mamy 100% dysku.
15. VOLUME /data
● Volumeny nie są kasowane...
● To dobrze!
● Ale trzeba ręcznie sprzątać…
● ...bo 100% w /var nie służy produkcji.
16. VOLUME /data
FROM php:latest
MAINTAINER Marcin Kurzyna <marcin@kurzyna.eu>
RUN curl -sS https://getcomposer.org/installer |
php -- --install-dir=bin --filename=composer
VOLUME /data
WORKDIR /data
CMD ["php", "-S", "0.0.0.0:80", "-t", "/data"]FROM s16.base
ADD . /data
RUN composer install
17. VOLUME /data
[root@localhost ~]# docker run --rm -it -p 80:80 "s16.app"
PHP 7.0.2 Development Server started at Wed Jan 27 14:09:21 2016
Listening on http://0.0.0.0:80
Document root is /data
Press Ctrl-C to quit.
[Wed Jan 27 14:09:47 2016] 172.17.0.1:53556 [200]: /index.php - require_once():
Failed opening required '/data/vendor/autoload.php'
(include_path='.:/usr/local/lib/php') in /data/index.php on line 3
<?php
require_once __DIR__ . '/vendor/autoload.php';
● ...przecież robiłem composer install?!
18. VOLUME /data
[root@localhost ~]# docker run --rm -it -p 80:80 "s16.app"
PHP 7.0.2 Development Server started at Wed Jan 27 14:09:21 2016
Listening on http://0.0.0.0:80
Document root is /data
Press Ctrl-C to quit.
[Wed Jan 27 14:09:47 2016] 172.17.0.1:53556 [200]: /index.php - require_once():
Failed opening required '/data/vendor/autoload.php'
(include_path='.:/usr/local/lib/php') in /data/index.php on line 3
<?php
require_once __DIR__ . '/vendor/autoload.php';
● ...przecież robiłem composer install?!
● Definicja VOLUME „zamraża” stan katalogu
19. RHEL, CentOS, itp.
● Jądro bez obsługi (starego) AuFS
● Jądro bez obsługi (nowego) OverlayFS
● Pozostaje: Device Mapper
– Domyślnie loop-back: obrazy w pliku
– Plik sparse: 100GB
● Docker nie sprawdza rzeczywistej ilości miejsca
20. RHEL, CentOS, itp.
[root@localhost ~]# docker info
...
Storage Driver: devicemapper
Data Space Total: 107.4 GB
Metadata Space Total: 2.147 GB
Operating System: CentOS Linux 7 (Core)
...
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 6,7G 1,3G 5,5G 19% /
21. RHEL, CentOS, itp.
[root@localhost ~]# lvcreate -L50% -T vg/pool
[root@localhost ~]# docker daemon
--storage-driver devicemapper
--storage-opt dm.fs=xfs
--storage-opt dm.thinpooldev=/dev/mapper/vg-pool -H fd:/
[root@localhost ~]# docker info
...
Server Version: 1.9.1
Storage Driver: devicemapper
Pool Name: vg-pool
Pool Blocksize: 65.54 kB
Base Device Size: 107.4 GB
…
● Volumenty LVM – thin pool
● Ręcznie ustawiane lub docker-storage-setup
23. One Process
● Docker mantra: jeden kontener, jeden proces
<?php
session_start();
FROM ubuntu:latest
MAINTAINER Marcin Kurzyna <marcin@kurzyna.eu>
RUN apt-get -y update
RUN apt-get -y install php5-fpm
● ...tworzy pusty plik sesji: 72b
● Sukces!
24. One Process
● …
● Fail!
● Dlaczego?
● Dystrybucje domyślnie kasują pliki sesji z crona
● ...a cron nie działa.
● Kilkaset miliardów plików po 72b:
No space left on device...
25. One Process
● To jak budować obrazy?
– Ręcznie uruchamiać usługi?
● SysV init
● Supervisord
● Daemontools
● Runit
● SystemD
● ….
– Zewnętrzny cron i –volumes-from?
26. One Process
● Stworzyć obraz bazowy
– Ale VOLUME!
– Coś gotowego?
● Phusion Base Image
Trochę stary (Ubuntu LTS 14.04), ale:
– Cron
– Syslog
– Runit
● Wiedzą co robią, więc Ty nie musisz…
(choć powinieneś...)