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
$ apt autoremove --purge "lxc-docker*" "docker.io*" docker-engine docker-compose
$ apt install docker-engine docker-compose
$ docker run hello-world
$ cd ./project/
$ docker-compose up

Запуск от пользователя

$ sudo groupadd docker
$ sudo gpasswd -a ${USER} docker
$ sudo service docker restart

Mac OS

$ brew install docker docker-machine docker-compose docker-machine-driver-xhyve

Подробнее: https://github.com/zchee/docker-machine-driver-xhyve

Установить последнюю версию

$ curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

Работает с docker-compose.yml файлом

Подробнее: https://docs.docker.com/compose/install/
Пример: https://docs.docker.com/compose/gettingstarted/

Dockerfile

  • FROM — указывает название образа (image), который будет взят за основу.
  • ENV — устанавливает переменную среды
  • RUN — запустить команду в контейнере (все команды исполняются с полными правами в пределах контейнера)
  • ADD — добавить файл в контейнер
  • VOLUME — указать монтируемые директории (их можно монтировать на хост машину или на другие контейнеры)
  • EXPOSE — указать транслируемые порты (их можно транслировать на хост машину или на другие контейнеры)
  • CMD — запустить процесс (это и будет процесс, вокруг которого построен контейнер)

docker-compose

  • docker-compose - средство сборки и настройки контейнеров
    • docker-compose up - поднять контейнеры с учетом правил сборки docker-compose.yml
    • -d - Для запуска сервисов в фоне (for "detached" mode)
$ docker-compose config
$ docker-compose up

Отдельно стоит запомнить команду docker-compose up. Она представляет собой упрощенный вызов docker-compose build && docker-compose run

Сборочные контейнеры в связке с docker-compose удобно использовать в окружении разработчика, когда требуется, например, производить некоторые действия при изменении исходников.

С docker-compose все просто, но есть нюансы. Использовать one shot контейнеры возможно только, если docker-compose up выполняется с опцией “-d”, в противном случае по завершении работы такого контейнера, compose останавливает все остальные контейнеры.

Рабочий процесс

Определение Dockerfile для каждого из сервисов Определение связей между сервисами при помощи docker-compose.yml Запус системы при помощи docker-compose up

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

docker-compose-mixer

Содержание конфигурационного docker-compose-mixer.yml файла по своей сути является небольшим конфигом, который описывает как именно два или более проектов будут стартовать вместе.

$ wget https://github.com/paunin/docker-compose-mixer/blob/master/dist/dc-mixer?raw=true -O /usr/local/bin/docker-compose-mixer
$ chmod +x /usr/local/bin/docker-compose-mixer

Работает с docker-compose-mixer.yml файлом

Решает проблемы:

  • Конфликты имен контейнеров c обновлением всего дерева конфигурации
  • Конфликты портов пробрасываемых на хост-машину
  • Переопределение свойств сервиса
  • Разрешение относительных путей
  • Удаление лишних или дублирующихся сервисов

Подробнее: https://habrahabr.ru/post/274581/

docker-machine

В GitHub-репозитории Docker Machine можно найти три bash-сценария, которые упрощают работу команд docker и docker-machine. Они отвечают за выполнение команд и пользовательские настройки командной строки bash.

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

создания нового хоста
$ docker-machine create --driver virtualbox machine-name

generic

$ docker-machine create \
  --driver generic \
  --generic-ip-address=203.0.113.81 \
  --generic-ssh-key ~/.ssh/id_rsa \
  machine-name
  • где machine-name - название создаваемой машины
запустить
$ docker-machine start machine-name
выполнение команд на удаленном хосте
$ docker-machine ssh machine-name cat /etc/hosts

или подключится к удаленному хосту

$ docker-machine ssh machine-name
просмотреть список доступных хостов
$ docker-machine ls
получить подробную информацию о хосте
$ docker-machine inspect machine-name
настройки соединения хоста,
$ docker-machine config machine-name
отображает IP-адрес хоста
$ docker-machine ip machine-name
отключение
$ docker-machine stop machine-name
удаление
$ docker-machine rm machine-name
список удаленных хостов
$ docker-machine ls

Сценарии

1 Сценарий
$ wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine-prompt.bash -O /etc/bash_completion.d/docker-machine-prompt.bash

Чтобы завершить установку этого файла, нужно установить пользовательское значение переменной PS1 в файле .bashrc. PS1 – это специальная переменная оболочки, которая используется для редактирования командной строки bash. Откройте файл:

nano ~/.bashrc

Этот файл содержит три строки, которые начинаются с PS1:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"

В конец каждой строки нужно вставить $(__docker_machine_ps1 " [%s]"). Должно получиться следующее:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__docker_machine_ps1 " [%s]")\$ '
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(__docker_machine_ps1 " [%s]")\$ '
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$(__docker_machine_ps1 " [%s]")$PS1"

Теперь имя активной машины будет отображаться в командной строке оболочки.

2 Сценарий

Второй сценарий называется docker-machine-wrapper.bash. Он добавляет к команде docker-machine подкоманду use, которая позволяет быстро переключаться между машинами Docker. Чтобы загрузить этот сценарий, наберите:

$ wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine-wrapper.bash -O /etc/bash_completion.d/docker-machine-wrapper.bash
3 Сценарий

Последний сценарий называется docker-machine.bash. Он отвечает за завершение команд docker-machine.

$ wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine.bash -O /etc/bash_completion.d/docker-machine.bash

Чтобы активировать внесённые изменения, закройте и снова откройте терминал. Если вы находитесь в сессии SSH, закройте и снова откройте сессию. Теперь завершение команд docker и docker-machine включено.

О контейнере

$ docker info
 
Containers: 9
 Running: 6
 Paused: 0
 Stopped: 3
Images: 28
Server Version: 1.12.5
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 90
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: null overlay host bridge
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: seccomp
Kernel Version: 3.16.0-4-amd64
Operating System: Debian GNU/Linux stretch/sid
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 7.8 GiB
Name: nas.ztc
ID: 6JPA:SQDY:WJRJ:F2R7:NDTL:SIYE:Z6UK:AVIH:3EZS:7GJM:UCXZ:KPDU
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: No memory limit support
WARNING: No swap limit support
WARNING: No kernel memory limit support
WARNING: No oom kill disable support
WARNING: No cpu cfs quota support
WARNING: No cpu cfs period support
Insecure Registries:
 127.0.0.0/8

Статус

$ docker stats
 
CONTAINER           CPU %               MEM USAGE / LIMIT   MEM %               NET I/O               BLOCK I/O             PIDS
c8d1eb7a8f7a        0.02%               0 B / 0 B           0.00%               38.07 kB / 649.1 kB   258 kB / 0 B          0
271073504ac9        0.10%               0 B / 0 B           0.00%               6.517 kB / 648 B      0 B / 4.096 kB        0
462c8942181f        0.00%               0 B / 0 B           0.00%               7.701 kB / 648 B      0 B / 0 B             0
94e2422ce234        0.33%               0 B / 0 B           0.00%               22.98 MB / 558.9 kB   1.798 MB / 314.8 MB   0
6a43329858d9        18.18%              0 B / 0 B           0.00%               7.431 kB / 648 B      249.9 kB / 20.62 GB   0
404d5b6bf024        0.08%               0 B / 0 B           0.00%               7.959 kB / 648 B      0 B / 0 B             0

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

$ docker exec -it security-mysql /bin/bash
$ docker exec -it security-mysql cat /etc/passwd

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

$ docker ps -a
CONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS                   PORTS                                                NAMES
c8d1eb7a8f7a        teratek_web                         "/usr/bin/supervisord"   About an hour ago   Up 57 minutes            443/tcp, 0.0.0.0:80->80/tcp, 9000/tcp                security-web
271073504ac9        stefobark/sphinxdocker              "sh -c '/bin/sleep 5 "   About an hour ago   Up 57 minutes            0.0.0.0:9306->9306/tcp, 0.0.0.0:9312->9312/tcp       security-sphinx
462c8942181f        imkulikov/docker-grand-ambassador   "/usr/bin/grand-ambas"   About an hour ago   Up 57 minutes                                                                 security-proxy
94e2422ce234        mvertes/alpine-mongo                "/root/run.sh mongod"    About an hour ago   Up 57 minutes            0.0.0.0:27017->27017/tcp, 0.0.0.0:28017->28017/tcp   security-mongo
6a43329858d9        mysql                               "docker-entrypoint.sh"   About an hour ago   Up 57 minutes            0.0.0.0:3306->3306/tcp                               security-mysql
404d5b6bf024        redis:alpine                        "docker-entrypoint.sh"   About an hour ago   Up 57 minutes            6379/tcp                                             security-redis
  • -a - Позволяет увидеть не запущенные контейнеры
  • -l - Выведет список недавно созданных контейнеров
  • где docker-grand-ambassador прокси для 2-ух направленной связи контейнеров

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

$ docker stop 7d0eb5cd3b3b

Удаление контейнера

$ docker rm 7d0eb5cd3b3b

Поиск образов

$ docker search alpine

Загрузка образа в систему

$ docker pull alpine
$ docker pull alpine:latest

Чистые образы

Готовые сервисы

Готовые сборки

Создание образа

$ docker build -t image-name .
  • Где . папка, где расположен Dockerfile
  • container-name - название создаваемого контейнера

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

$ docker images

Запуск образа

$ docker run -d -p 80:80 -t hello-world
$ docker run -d --publish 8080:80 -t hello-world
  • 8080 - Порт хост машины
  • 80 - Порт контейнера
  • -i - откроет интерактивную оболочку контейнера (лучше не использова, а подключаться с помощью docker exec)
  • -t - название запускаемого контейнера
$ docker run -v /var/run/docker.sock:/var/run/docker.sock \
       -v $(which docker):/bin/docker \
       -ti nachine_name

Применяется для монтирования пространств из внешних источников. К примеру virtualbox

Рецепты

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

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

Компаненты

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

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