Это старая версия документа!


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
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
$ newgrp docker

UI

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

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

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

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

$ docker image rm 6a950c96e01d

Удалить все образы

$ sudo docker rm -f $(sudo docker ps -a -q)
$ sudo docker rmi -f $(sudo docker images -q)

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

$ 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
Для справки
$ 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

Сетевые драйверы

bridge: сетевой драйвер по умолчанию. Если вы не указываете драйвер, это тип сети, которую вы создаете. Мостовые сети обычно используются, когда ваши приложения работают в автономных контейнерах, которые должны взаимодействовать.

host: для автономных контейнеров, удаляет сетевую изоляцию между контейнером и Docker-хостом. Хост доступен только для служб swarm в Docker версии 17.06 и выше.

overlay: overlay сети соединяют несколько демонов Docker вместе и позволяют сервисам Swarm связываться друг с другом. Вы также можете использовать overlay сети для облегчения связи между сервисом Swarm и автономным контейнером. Или между двумя автономными контейнерами на разных демонах Docker. Эта стратегия устраняет необходимость выполнять маршрутизацию на уровне ОС между этими контейнерами.

macvlan: сети Macvlan позволяют назначать MAC-адрес контейнеру, делая его физическим устройством в вашей сети. Демон Docker направляет трафик в контейнеры по их MAC-адресам. Использование драйвера macvlan иногда является лучшим выбором при работе с устаревшими приложениями. Приложениям, которые ожидают прямого подключения к физической сети, а не маршрутизации через сетевой стек хоста Docker.

none: для этого контейнера отключит все сети. Обычно используется в сочетании с пользовательским сетевым драйвером. Ни один не доступен для swarm услуг

Установка

$ docker network create bridge-network
$ docker network create --driver=bridge bridge-network
$ docker network create -d overlay my-multihost-network
$ docker network create --driver overlay overlay_network
$ docker network create --subnet 10.1.0.0/16 --gateway=10.1.0.1 --ip-range 10.1.4.0/24 --driver=bridge --label=host4networks brifge04
$ docker network create nginx-proxy

Использование

$ docker run -it --name=test_brifge04 --net brifge04 centos:centos7 /bin/bash
$ docker run -it --name=test_brifge04_2 --net brifge04 --ip=10.1.4.100 centos:centos7 /bin/bash

Аанализ сетей

$ docker network inspect bridge
$ docker network inspect nginx-proxy
$ docker network ls

Особенности работы с 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

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

Возникает при циклическом связывании контейнеров (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"

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

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

Репозитории

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

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