際際滷

際際滷Share a Scribd company logo
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 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
Configure once  run everywhere
Sheeple.
Dev, stage, prod
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.
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.
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
 Rozwizania?
 Autoryzacja w oparciu o hosty?
 Co ze zmiennym IP kontener坦w?
 Hasa w zmiennych rodowiskowych?
Volumeny
/var/lib/docker
 Przechowuje obrazy
 cignite z repozytori坦w
 Zbudowane
 Czciowe (cache)
 Przechowuje volumeny
 Przechowuje metadane
 Co to oznacza?
/var/lib/docker
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
 Brak dziaajcych 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 rcznie sprzta
 ...bo 100% w /var nie su甜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甜 robiem 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甜 robiem composer install?!
 Definicja VOLUME zamra甜a stan katalogu
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
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
 Rcznie 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 domylnie kasuj pliki sesji z crona
 ...a cron nie dziaa.
 Kilkaset miliard坦w plik坦w po 72b:
No space left on device...
One Process
 To jak budowa obrazy?
 Rcznie uruchamia usugi?
 SysV init
 Supervisord
 Daemontools
 Runit
 SystemD
 .
 Zewntrzny 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, wic Ty nie musisz
(cho powiniene...)
Dzikuj
Pytania?

More Related Content

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 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
  • 4. Configure once run everywhere Sheeple.
  • 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?
  • 11. /var/lib/docker Przechowuje obrazy cignite z repozytori坦w Zbudowane Czciowe (cache) Przechowuje volumeny Przechowuje metadane Co to oznacza?
  • 12. /var/lib/docker # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES Brak dziaajcych 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 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...)