Prezentacja bdzie zawieraa lu添ne anegdoty i dowiadczenia z u甜ywania kontener坦w dockera w produkcji, r坦wnie甜 do hostowania aplikacji PHP. Sposoby budowania kontener坦w, typowe problemy deploymentu.
2. Marcin Kurzyna
W bran甜y od 14 lat
Wirtualna Polska S.A
NextWebMedia
GaduGadu
Freelance!
OpenSource
Docker, PHP etc
PLD Linux
HashIDs
https://keybase.io/mqu
https://www.linkedin.com/in/mkurzyna
3. Na pocztku by chroot
Docker Nihil novi
1982: chroot
2000: Virtuozzo
2001: Linux-Vserver
2005: OpenVZ
2008: LXC
2013: Docker
...
https://en.wikipedia.org/wiki/Operating-system-level_virtualization
6. Adresy usug
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 usug pt 2
...ale, ale ja mam wicej 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
Suchamy 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
Rozwizania?
Autoryzacja w oparciu o hosty?
Co ze zmiennym IP kontener坦w?
Hasa w zmiennych rodowiskowych?
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 rcznie sprzta
...bo 100% w /var nie su甜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甜 robiem 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甜 robiem composer install?!
Definicja VOLUME zamra甜a stan katalogu
19. RHEL, CentOS, itp.
Jdro bez obsugi (starego) AuFS
Jdro bez obsugi (nowego) OverlayFS
Pozostaje: Device Mapper
Domylnie loop-back: obrazy w pliku
Plik sparse: 100GB
Docker nie sprawdza rzeczywistej iloci 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
Rcznie 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 domylnie kasuj pliki sesji z crona
...a cron nie dziaa.
Kilkaset miliard坦w plik坦w po 72b:
No space left on device...
25. One Process
To jak budowa obrazy?
Rcznie uruchamia usugi?
SysV init
Supervisord
Daemontools
Runit
SystemD
.
Zewntrzny 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, wic Ty nie musisz
(cho powiniene...)