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.

Установка

nano /etc/apt/sources.list

 deb https://apt.dockerproject.org/repo debian-stretch main

Работа с образами / 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

Автоматический запуск контейнеров в Debian

nano /etc/init.d/portainer

#!/bin/sh
 
### BEGIN INIT INFO
# Provides:		portainer
# Required-Start:	$docker
# Required-Stop:	$docker
# Default-Start:	2 3 4 5
# Default-Stop:		0 1 6
# Short-Description:	Portainer Services
### END INIT INFO
 
set -e
 
PROJECT_NAME=portainer
YAMLFILE=/var/lib/jenkins/workspace/portainer/docker-compose.yml
OPTS="-f $YAMLFILE -p $PROJECT_NAME"
UPOPTS="-d --no-recreate --no-build --no-deps"
 
. /lib/lsb/init-functions
 
case "$1" in
    start)
        log_daemon_msg "Starting service portainer" "portainer" || true
        docker-compose $OPTS up $UPOPTS
        ;;
 
    stop)
        log_daemon_msg "Stopping service portainer" "portainer" || true
        docker-compose $OPTS stop
        ;;
 
    reload)
        log_daemon_msg "Reloading service portainer" "portainer" || true
        docker-compose $OPTS up $UPOPTS
        ;;
 
    restart)
        docker-compose $OPTS stop
        docker-compose $OPTS up $UPOPTS
        ;;
 
    status)
        status=$(docker ps -aqf "name=${PROJECT_NAME}")
        if [ ! -z "${status}" ]; then
          echo "Already running ID: ${status}"
        fi
        ;;
 
    *)
        log_action_msg "Usage: /etc/init.d/portainer {start|stop|restart|reload|status}" || true
        exit 1
        ;;
esac
 
exit 0

nano /etc/systemd/system/portainer.service

[Unit]
Description=Portainer service with docker-compose
Requires=docker.service
After=docker.service
 
[Service]
Restart=always
 
WorkingDirectory=/var/lib/jenkins/workspace/portainer/
 
# Remove old containers, network and volumes
ExecStartPre=/usr/bin/docker-compose -f /var/lib/jenkins/workspace/portainer/docker-compose.yml down -v
ExecStartPre=-/bin/bash -c 'docker network rm docker_portainer_net'
ExecStartPre=-/bin/bash -c 'docker ps -aqf "name=portainer" | xargs docker rm'
 
# Compose up
ExecStart=/usr/bin/docker-compose -f /var/lib/jenkins/workspace/portainer/docker-compose.yml up
 
# Compose down, remove containers
ExecStop=/usr/bin/docker-compose -f /var/lib/jenkins/workspace/portainer/docker-compose.yml down
 
[Install]
WantedBy=multi-user.target

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

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 :!:

Репозитории

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

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