SlideShare uma empresa Scribd logo
1 de 27
PHP@Doker - w produkcji
PHPers #1
Rzeszów 27.01.2016
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
Na początku 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
Configure once – run everywhere
Sheeple.
Dev, stage, prod…
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.
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.
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.
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?
Volumeny
/var/lib/docker
● Przechowuje obrazy
– Ściągnięte z repozytoriów
– Zbudowane
– Częściowe (cache)
● Przechowuje volumeny
● Przechowuje metadane
● Co to oznacza?
/var/lib/docker
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
● Brak działających kontenetów...
/var/lib/docker
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
● Brak zachowanych obrazów...
/var/lib/docker
# du -sh /var/lib/docker
1,3G /var/lib/docker
● ...ups.
● Po losowym czasie mamy 100% dysku.
VOLUME /data
● Volumeny nie są kasowane...
● To dobrze!
● Ale trzeba ręcznie sprzątać…
● ...bo 100% w /var nie służy produkcji.
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
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?!
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
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
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% /
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
One Process
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!
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...
One Process
● To jak budować obrazy?
– Ręcznie uruchamiać usługi?
● SysV init
● Supervisord
● Daemontools
● Runit
● SystemD
● ….
– Zewnętrzny cron i –volumes-from?
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ś...)
Dziękuję
Pytania?

Mais conteúdo relacionado

Mais procurados

ansible kmonticolo bezlogo
ansible kmonticolo bezlogoansible kmonticolo bezlogo
ansible kmonticolo bezlogo
Kamil Monticolo
 
Onet barcamp 4 - Cloud Storage
Onet barcamp 4  - Cloud StorageOnet barcamp 4  - Cloud Storage
Onet barcamp 4 - Cloud Storage
OnetIT
 
TorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydachTorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydach
marekgoldmann
 

Mais procurados (20)

Infrastructure As Code
Infrastructure As CodeInfrastructure As Code
Infrastructure As Code
 
Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...
Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...
Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...
 
Uruchomienie i praca z laravel w wirtualnym kontenerze docker'a
Uruchomienie i praca z laravel w wirtualnym kontenerze docker'aUruchomienie i praca z laravel w wirtualnym kontenerze docker'a
Uruchomienie i praca z laravel w wirtualnym kontenerze docker'a
 
Sekrety magicznego ogrodu Docker
Sekrety magicznego ogrodu DockerSekrety magicznego ogrodu Docker
Sekrety magicznego ogrodu Docker
 
Od Zera do Farmera
Od Zera do FarmeraOd Zera do Farmera
Od Zera do Farmera
 
GlusterFS
GlusterFSGlusterFS
GlusterFS
 
ansible kmonticolo bezlogo
ansible kmonticolo bezlogoansible kmonticolo bezlogo
ansible kmonticolo bezlogo
 
Torquebox
TorqueboxTorquebox
Torquebox
 
Elasticsearch i Docker - skalowalność, wysoka dostępność i zarządzanie zasobami
Elasticsearch i Docker - skalowalność, wysoka dostępność i zarządzanie zasobamiElasticsearch i Docker - skalowalność, wysoka dostępność i zarządzanie zasobami
Elasticsearch i Docker - skalowalność, wysoka dostępność i zarządzanie zasobami
 
Swoole w PHP. Czy to ma sens?
Swoole w PHP. Czy to ma sens?Swoole w PHP. Czy to ma sens?
Swoole w PHP. Czy to ma sens?
 
Aplikacje internetowe real-time w oparciu o React/Redux
Aplikacje internetowe real-time w oparciu o React/ReduxAplikacje internetowe real-time w oparciu o React/Redux
Aplikacje internetowe real-time w oparciu o React/Redux
 
Monitoring sieci
Monitoring sieciMonitoring sieci
Monitoring sieci
 
PLNOG 6: Łukasz Jagiełło - Wdrożenie skalowalnego systemu plików GlusterFS w ...
PLNOG 6: Łukasz Jagiełło - Wdrożenie skalowalnego systemu plików GlusterFS w ...PLNOG 6: Łukasz Jagiełło - Wdrożenie skalowalnego systemu plików GlusterFS w ...
PLNOG 6: Łukasz Jagiełło - Wdrożenie skalowalnego systemu plików GlusterFS w ...
 
Złam zasady i stwórz wydajny stos IP przy użyciu DPDK
Złam zasady i stwórz wydajny stos IP przy użyciu DPDKZłam zasady i stwórz wydajny stos IP przy użyciu DPDK
Złam zasady i stwórz wydajny stos IP przy użyciu DPDK
 
Onet barcamp 4 - Cloud Storage
Onet barcamp 4  - Cloud StorageOnet barcamp 4  - Cloud Storage
Onet barcamp 4 - Cloud Storage
 
TorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydachTorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydach
 
Ansible - Automatyzacja zadań IT
Ansible - Automatyzacja zadań ITAnsible - Automatyzacja zadań IT
Ansible - Automatyzacja zadań IT
 
Net core (dawniej 5.0) – co to dla mnie. też dużo o open source
Net core (dawniej   5.0) – co to dla mnie. też dużo o open sourceNet core (dawniej   5.0) – co to dla mnie. też dużo o open source
Net core (dawniej 5.0) – co to dla mnie. też dużo o open source
 
Rundeck & Ansible
Rundeck & AnsibleRundeck & Ansible
Rundeck & Ansible
 
Docker praktyczne podstawy
Docker  praktyczne podstawyDocker  praktyczne podstawy
Docker praktyczne podstawy
 

Destaque

Chico saudades de_jesus
Chico saudades de_jesusChico saudades de_jesus
Chico saudades de_jesus
Aurora Boreal
 
Most
MostMost
Most
Ivka
 
Fomentando los valores a traves de las ti cs
Fomentando los valores a traves de las ti csFomentando los valores a traves de las ti cs
Fomentando los valores a traves de las ti cs
ermelcarano
 
Lineadetiempo vrosky
Lineadetiempo vroskyLineadetiempo vrosky
Lineadetiempo vrosky
Vroskyhann
 
23 February 2016 - Media Update - Lessons in PR from celebs
23 February 2016 - Media Update - Lessons in PR from celebs23 February 2016 - Media Update - Lessons in PR from celebs
23 February 2016 - Media Update - Lessons in PR from celebs
Tamryn Sher
 

Destaque (20)

Chico saudades de_jesus
Chico saudades de_jesusChico saudades de_jesus
Chico saudades de_jesus
 
Sustainable English
Sustainable EnglishSustainable English
Sustainable English
 
Digital Health & Wellness Summit @ Mobile World Congress 2016
Digital Health & Wellness Summit @ Mobile World Congress 2016Digital Health & Wellness Summit @ Mobile World Congress 2016
Digital Health & Wellness Summit @ Mobile World Congress 2016
 
Expressões mudas e sons
Expressões mudas e sonsExpressões mudas e sons
Expressões mudas e sons
 
Most
MostMost
Most
 
Fomentando los valores a traves de las ti cs
Fomentando los valores a traves de las ti csFomentando los valores a traves de las ti cs
Fomentando los valores a traves de las ti cs
 
Grados y costumbres
Grados y costumbresGrados y costumbres
Grados y costumbres
 
Folleto informativo ESUFA
Folleto informativo ESUFAFolleto informativo ESUFA
Folleto informativo ESUFA
 
Lineadetiempo vrosky
Lineadetiempo vroskyLineadetiempo vrosky
Lineadetiempo vrosky
 
2
22
2
 
Presentasi Larutan Bufer
Presentasi Larutan BuferPresentasi Larutan Bufer
Presentasi Larutan Bufer
 
20161118141037 4
20161118141037 420161118141037 4
20161118141037 4
 
Biopori
BioporiBiopori
Biopori
 
Format data simpatisan caleg
Format data simpatisan calegFormat data simpatisan caleg
Format data simpatisan caleg
 
Wood derived chemicals
Wood derived chemicalsWood derived chemicals
Wood derived chemicals
 
Capitulo1
Capitulo1Capitulo1
Capitulo1
 
Rius d’informació. Anàlisi de l’aigua dels rius que desemboquen al Tarragonès
Rius d’informació. Anàlisi de l’aigua dels rius que desemboquen al TarragonèsRius d’informació. Anàlisi de l’aigua dels rius que desemboquen al Tarragonès
Rius d’informació. Anàlisi de l’aigua dels rius que desemboquen al Tarragonès
 
Conferencia en Daroca sobre la crisis
Conferencia en Daroca sobre la crisisConferencia en Daroca sobre la crisis
Conferencia en Daroca sobre la crisis
 
23 February 2016 - Media Update - Lessons in PR from celebs
23 February 2016 - Media Update - Lessons in PR from celebs23 February 2016 - Media Update - Lessons in PR from celebs
23 February 2016 - Media Update - Lessons in PR from celebs
 
2
22
2
 

Semelhante a PHP@Docker - w produkcji

Rails tobak2005
Rails tobak2005Rails tobak2005
Rails tobak2005
Tomasz Bak
 
NGSec 2016 - Ile warstw, tyle szans. - Leszek Miś@Defensive-Security.com
NGSec 2016 - Ile warstw, tyle szans. - Leszek Miś@Defensive-Security.comNGSec 2016 - Ile warstw, tyle szans. - Leszek Miś@Defensive-Security.com
NGSec 2016 - Ile warstw, tyle szans. - Leszek Miś@Defensive-Security.com
Leszek Mi?
 
Pocałunek śmierci
Pocałunek śmierciPocałunek śmierci
Pocałunek śmierci
Divante
 

Semelhante a PHP@Docker - w produkcji (20)

“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...
“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...
“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...
 
DTrace
DTraceDTrace
DTrace
 
Rails tobak2005
Rails tobak2005Rails tobak2005
Rails tobak2005
 
PLNOG16: Integracja Ceph w OpenStack - status i przyszłość, Paweł Stefański
PLNOG16: Integracja Ceph w OpenStack - status i przyszłość, Paweł StefańskiPLNOG16: Integracja Ceph w OpenStack - status i przyszłość, Paweł Stefański
PLNOG16: Integracja Ceph w OpenStack - status i przyszłość, Paweł Stefański
 
NGSec 2016 - Ile warstw, tyle szans. - Leszek Miś@Defensive-Security.com
NGSec 2016 - Ile warstw, tyle szans. - Leszek Miś@Defensive-Security.comNGSec 2016 - Ile warstw, tyle szans. - Leszek Miś@Defensive-Security.com
NGSec 2016 - Ile warstw, tyle szans. - Leszek Miś@Defensive-Security.com
 
OpenEmbedded
OpenEmbeddedOpenEmbedded
OpenEmbedded
 
Programowanie sterowników w Linuksie.
Programowanie sterowników w Linuksie.Programowanie sterowników w Linuksie.
Programowanie sterowników w Linuksie.
 
Shall we play a game? PL version
Shall we play a game? PL versionShall we play a game? PL version
Shall we play a game? PL version
 
Wprowadzenie do Big Data i Apache Spark
Wprowadzenie do Big Data i Apache SparkWprowadzenie do Big Data i Apache Spark
Wprowadzenie do Big Data i Apache Spark
 
Przenieś się do kontenera, czyli korzyści z Docker i Docker Compose
Przenieś się do kontenera, czyli korzyści z Docker i Docker ComposePrzenieś się do kontenera, czyli korzyści z Docker i Docker Compose
Przenieś się do kontenera, czyli korzyści z Docker i Docker Compose
 
Xdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHPXdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHP
 
Serwer internetowy w systemie Linux
Serwer internetowy w systemie LinuxSerwer internetowy w systemie Linux
Serwer internetowy w systemie Linux
 
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
 
100 M pakietów na sekundę dla każdego.
100 M pakietów na sekundę dla każdego. 100 M pakietów na sekundę dla każdego.
100 M pakietów na sekundę dla każdego.
 
Testowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStackTestowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStack
 
Kainos Tech Space #1 : DevOps : Artur Senk - Jenkins, najważniejsze narzędzie...
Kainos Tech Space #1 : DevOps : Artur Senk - Jenkins, najważniejsze narzędzie...Kainos Tech Space #1 : DevOps : Artur Senk - Jenkins, najważniejsze narzędzie...
Kainos Tech Space #1 : DevOps : Artur Senk - Jenkins, najważniejsze narzędzie...
 
PLNOG 21: Marcin Motylski - Bezpieczeństwo_i_Firewalle_w_Multi_Cloud / Data _...
PLNOG 21: Marcin Motylski - Bezpieczeństwo_i_Firewalle_w_Multi_Cloud / Data _...PLNOG 21: Marcin Motylski - Bezpieczeństwo_i_Firewalle_w_Multi_Cloud / Data _...
PLNOG 21: Marcin Motylski - Bezpieczeństwo_i_Firewalle_w_Multi_Cloud / Data _...
 
JavaScript, Moduły
JavaScript, ModułyJavaScript, Moduły
JavaScript, Moduły
 
Pocałunek śmierci
Pocałunek śmierciPocałunek śmierci
Pocałunek śmierci
 
Gluster FS
Gluster FSGluster FS
Gluster FS
 

PHP@Docker - w produkcji

  • 1. PHP@Doker - w produkcji PHPers #1 Rzeszów 27.01.2016
  • 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 początku 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
  • 4. Configure once – run everywhere Sheeple.
  • 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...
  • 13. /var/lib/docker # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ● Brak zachowanych obrazó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ś...)