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 --nodaemonize

php-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