Docker

VIRTUAL MACHINES CONTAINERS
Virtual machines include the application, the necessary binaries and libraries, and an entire guest operating system -- all of which can amount to tens of GBs. Containers include the application and all of its dependencies --but share the kernel with other containers, running as isolated processes in user space on the host operating system. Docker containers are not tied to any specific infrastructure: they run on any computer, on any infrastructure, and in any cloud.

Установка

Работа с образами / Images

Для справки
$ docker image

Вывести список образов

$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
yii2_php                     latest              6a950c96e01d        23 hours ago        159MB

Удалить образ

$ docker image rm 6a950c96e01d

Анализировать образ

$ docker image inspect 6a950c96e01d
[
    {
        "Id": "sha256:6a950c96e01de12b463f1fce232b48f530c487c2d7af5fef2e59c693c21c8af1",
        "RepoTags": [
            "yii2_php:latest"
        ],
        "RepoDigests": [],
        "Parent": "sha256:a0883c
...
}

Избавляемся от неиспользуемых образов

$ docker image prune

Список образов

Алиас к
$ docker images
$ docker image ls
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
yii2_php                     latest              6a950c96e01d        23 hours ago        159MB
yii2_nginx                   latest              878bb2a77dfa        27 hours ago        23.2MB
yii2_kibana                  latest              e3f6594b57e1        27 hours ago        221MB
yii2_elasticsearch           latest              117a536c2655        27 hours ago        129MB
yii2_redis                   latest              546a364104fd        27 hours ago        31.1MB
yii2_mariadb                 latest              03ddc39bcf15        27 hours ago        204MB

Работа с контейнерами / Containers

Для справки
$ docker
$ docker exec --help

Запуск контейнера

Необходим Dockerfile
$ docker up

Список запущеных контейнеров

$ docker ps
CONTAINER ID        IMAGE                COMMAND                   CREATED             STATUS              PORTS                              NAMES
a50423920e0d        yii2_php             "/usr/sbin/php-fpm -F"    23 hours ago        Up 23 hours         9001/tcp, 0.0.0.0:9001->9000/tcp   yii2_php_1
fa24abd60049        yii2_nginx           "sh -c 'envsubst \"`e…"   24 hours ago        Up 24 hours         0.0.0.0:80->80/tcp                 yii2_n

Подсоеденение к контейнеру

Проверить предварительно на наличие запрашиваемой оболочки. В alpine по умолчанию нет bash
$ sudo docker exec -i -t a50423920e0d /bin/bash
$ sudo docker exec -i -t a50423920e0d /bin/sh

Запустить контейнер

$ docker start a50423920e0d

Остановить контейнер

$ docker stop a50423920e0d

Пребить контейнер

$ docker kill a50423920e0d
Для справки
$ docker-compose
$ docker-compose exec

docker-composer.yml

docker-composer.yml

version: '2'
services:
  mariadb:
    build: ./provision/mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: skringo
      MYSQL_USER: skringo
      MYSQL_PASSWORD: skringo
    ports:
      - '3306:3306'
    expose:
      - '3306'
    volumes:
      - './logs/mysql:/var/log/mariadb'
  redis:
    build: ./provision/redis
    restart: always
    environment:
      - REDIS_VERSION=4.0.9
    ports:
      - '6379:6379'
    expose:
      - '6379'
  redis-commander:
    container_name: redis-commander
    hostname: redis-commander
    image: rediscommander/redis-commander:latest
    build: .
    restart: always
    environment:
    - REDIS_HOSTS=local:redis:6379
    ports:
    - 8081:8081
  nginx:
    build: ./provision/nginx
    restart: always
    links:
      - php
    volumes:
      - './:/app'
      - './provision/nginx/etc/conf.d/yii2.advanced.template:/etc/nginx/conf.d/site.template'
      - './logs/nginx:/var/log/nginx'
    environment:
      - NGINX_VERSION=1.13.12-1~stretch
      - NGINX_HOST=skringo.loc
      - NGINX_PORT=80
    ports:
      - '80:80'
    command: 'sh -c "envsubst \"`env | awk -F = ''{printf \" $$%s\", $$1}''`\" < /etc/nginx/conf.d/site.template > /etc/nginx/conf.d/default.conf && nginx -g ''daemon off;''"'
  elasticsearch:
    build: ./provision/elasticsearch
    restart: always
    ports:
      - '9200:9200'
    expose:
      - '9200'
    environment:
      - ELASTICSEARCH_VERSION=5.6.9
      - JAVA_ALPINE_VERSION=8.151.12-r0
      - JAVA_VERSION=8u151
      - LANG=C.UTF-8
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    mem_limit: 1g
  kibana:
    build: ./provision/kibana
    links:
      - elasticsearch
    ports:
      - '5601:5601'
  php:
    build: ./provision/php/7.1
    restart: always
    links:
      - mariadb
      - redis
      - elasticsearch
    ports:
      - '9001:9000'
    expose:
      - '9000'
      - '9001'
    environment:
      - PHP_IDE_CONFIG=serverName=skringo.loc
    volumes:
      - './:/app'
      - './provision/php/7.1/xdebug.ini:/etc/php7/conf.d/xdebug.ini'
      - './logs/php7:/var/log/php7'
      - './logs/php7/xdebug:/tmp/xdebug_log'

networks:
  default:
    external:
      name: nginx-proxy

Подсоеденение к контейнеру

$ docker-compose exec php /bin/sh

Где php название используемого сервиса / services

Запуск с использованием локального конфига

$ docker-compose -f docker-compose.yml -f docker-compose-local.yaml up -d

Особенности работы с MAC OS

Все контейнеры в MAC OS находятся в виртуальной машине qcow2 и находятся по адресу /Users/mirocow/Library/Containers/com.docker.docker/Docker.qcow2

  • где mirocow имя вашего пользователя
Для MacOs устанавливается в отдельную виртуальную машину. К которой можно законектится с помощью tty.
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty

Проблемы и их решения

Circular import between fpm and nginx

Возникает при циклическом связывании контейнеров (2-ух сторонее связывание) В качестве решенияпроблемы, на данный момент, можно воспользоваться прокси сервером/контейнером docker-grand-ambassador

fpm:
  build: ./build/fpm
  links:
    - ambassador:nginx
nginx:
  build: ./build/nginx
  links:
    - ambassador:fpm
ambassador:
  image: cpuguy83/docker-grand-ambassador
  volumes:
    - "/var/run/docker.sock:/var/run/docker.sock"
  command: "-name testapp_fpm_1 -name testapp_nginx_1"

ERROR: Couldn't connect to Docker daemon - you might need to rundocker-machine start default`

скорее всего вам потребуется сделать следующее:

$ docker-machine create --driver=xhyve dev --xhyve-experimental-nfs-share

Компоненты

  • Репозитории - Репозитории Dokerfile - ов
  • docker-compose - Компановщик контейнеров
  • docker-machine - Это инструмент, позволяющий управлять удалёнными хостами Docker с локального компьютера.
  • Docker Toolbox - Комплект необходимых программ для Windows или MacOs (Внимание!!! ставит VirtualBox )
  • Weave Scope - Это очень удобный и наглядный сервис для мониторинга Docker контейнеров.
  • cAdvisor - Система мониторинга за контейнерами
  • DockStation - Отличный клиент для работы с docker-compose, docker-composer.yml :!:

Репозитории

Документация / Статьи

Другие системы виртуализации