Docker - с чего начать?
WebDev Meetup
Евгений Джумак
Radyushin & Co
Проблемы
- Отличия локального кружения от сервера
- Сложное развертывание приложений
- Конфликты ПО разных версий
- Доставка приложений
Build once
Configure once
Run anywhere



Windows
Linux
MacOS

Составляющие
→
А
D
C
E
F
B
Контейнеризация
Контейнеры
Хост
Ядро
ОС
A
C
B
B
C
Общий слой 1
Общий слой 2
Слой B
Слой C2
Слой C1
Слои
Приложение Б
Ubuntu
imagemagick
PHP
etc
Python
Приложение А
общие слои


AUFS
Btrfs
OverlayFS
$ docker pull
$ docker push
$ docker run
$ docker stop
$ docker kill
$ docker ps
$ docker top
$ docker logs
$ docker images
$ docker rm
$ docker rmi
$ docker build
Интерфейс
↓
→






💻
→
http://localhost:80
php:9000
mysql:3306
source code
➜ app tree
.
└── docker
├── mysql
│ └── data
├── nginx
└── php
5 directories, 0 files<?php //index.php
echo 'Hello from PHP container <br><br>';
try {
$pdo = new PDO(
'mysql:dbname=myapp;host=mysql', 'root', 'root', [
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]
);
echo $pdo->query("SELECT 'Hello from MYSQL container' as message")
->fetch()
->message;
} catch (PDOException $e) {
echo $e->getMessage();
}Example app
FROM ubuntu:xenial
RUN apt-get update && apt-get install -y nginx
RUN rm -f /etc/nginx/conf.d/default.conf
ADD nginx.conf /etc/nginx/nginx.conf
ADD app.loc.conf /etc/nginx/conf.d/
ENTRYPOINT ["nginx", "-g", "daemon off;"]Dockerfile
FROM php:fpm
RUN apt-get update && apt-get install -y \
&& docker-php-ext-install \
-j$(nproc) pdo pdo_mysql
EXPOSE 9000
RUN mkdir -p /var/www/
WORKDIR /var/www/
ENTRYPOINT php-fpm --nodaemonizephp-fpm
FROM
RUN
CMD
EXPOSE
ADD
COPY
ENTRYPOINT
WORKDIR
ENV
LABEL
ARG
ONBUILD
STOPSIGNAL
HEALTHCHECK
SHELL
Dockerfile инструкции
Сборка образов

Создание сети
➜ docker network ls
NETWORK ID NAME DRIVER SCOPE
6f080a7c71d9 bridge bridge local
134b1c90e434 host host local
6258bf916970 none null local
➜ docker network create -d bridge mynetwork
32fad364daff5318172c16445d024f4367ac50c2adf5c450de9dfc76f9cb31ae
➜ docker network ls
NETWORK ID NAME DRIVER SCOPE
6f080a7c71d9 bridge bridge local
134b1c90e434 host host local
32fad364daff mynetwork bridge local
6258bf916970 none null localЗапуск контейнеров
$ docker run -d -v ~/www/app/:/var/www/ \
--name=php \
2a8edf4f00e9
$ docker network connect mynetwork php
$ docker run -d -v ~/www/app/:/var/www/ \
--name=mynginx \
--network=mynetwork \
-p 8888:80 \
9a4fe96b26e1
$ docker run --name=mysql \
-v ~/www/app/docker/mysql/data/:/var/lib/mysql/ \
--network=mynetwork -p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=root mysql
Логин в контейнер
➜ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
35dd92814ba1 mysql "docker-entrypoint..." 8 minutes ago Up 8 minutes 0.0.0.0:3307->3306/tcp mysql
dec65530b85e 9a4fe96b26e1 "nginx -g 'daemon ..." 33 minutes ago Up 33 minutes 0.0.0.0:8888->80/tcp mynginx
b1b8ba35171f 2a8edf4f00e9 "/bin/sh -c 'php-f..." 58 minutes ago Up 58 minutes 9000/tcp php
➜ docker exec -ti 35dd92814ba1 /bin/bash
root@35dd92814ba1:/# mysql -u root -proot
mysql> create database myapp;
Query OK, 1 row affected (0.01 sec)
mysql>It works!

Оркестрация


version: "2" #docker-compose.yml
networks:
mynetwork:
services:
nginx:
build: ./nginx/
networks:
- mynetwork
ports:
- "8888:80"
- "8880:443"
volumes_from:
- php
mysql:
image: mysql
networks:
- mynetwork
expose:
- "3306"
ports:
- "3307:3306"
volumes:
- ./mysql/data/:/var/lib/mysql/
environment:
- MYSQL_ROOT_PASSWORD=root
php:
build: ./php/
networks:
- mynetwork
volumes:
- ~/www/app/:/var/www/
docker-compose up --build

Docker in production











Спасибо
elforastero@ya.ru
Docker Practice
By El Forastero
Docker Practice
- 1,712