Показать страницуИстория страницыСсылки сюдаCopy this pageExport to MarkdownODT преобразованиеНаверх Вы загрузили старую версию документа! Сохранив её, вы создадите новую текущую версию с этим содержимым. Медиафайлы{{tag>vagrant chef shell puppet salt ansible docker devops virtual}} ====== Docker ====== {{https://habrastorage.org/files/67f/73a/551/67f73a551a254c19854adf3b4665a7bb.png?300}} | VIRTUAL MACHINES | CONTAINERS | | {{https://www.docker.com/sites/default/files/WhatIsDocker_2_VMs_0-2_2.png?200}} | {{https://www.docker.com/sites/default/files/WhatIsDocker_3_Containers_2_0.png?200}} | | 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. | ===== Установка ===== * https://docs.docker.com/engine/installation/linux/debian/ nano /etc/apt/sources.list <code> deb https://apt.dockerproject.org/repo debian-stretch main </code> <code bash> $ 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 </code> * Запуск производится от root * [[system:docker#компаненты|docker]] - клиент для управления docker-engine * [[system:docker#компаненты|docker-engine]] - движок ситемы docker * [[system:docker#компаненты|docker-compose]] - Если установлен компоновщик/композитор, то контейнеры следует запускать docker-compose up * [[system:docker#компаненты|docker-machine]] - https://github.com/docker/machine === Запуск от пользователя === <code bash> $ sudo groupadd docker $ sudo gpasswd -a ${USER} docker $ sudo service docker restart </code> ==== Mac OS ==== <code bash> $ brew install docker docker-machine docker-compose docker-machine-driver-xhyve </code> Подробнее: https://github.com/zchee/docker-machine-driver-xhyve ==== Установить последнюю версию ==== <note tip><code bash> $ 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 </code> Работает с docker-compose.yml файлом</note> Подробнее: https://docs.docker.com/compose/install/\\ Пример: https://docs.docker.com/compose/gettingstarted/ ===== Настройка ===== ==== Dockerfile ==== * FROM — указывает название образа (image), который будет взят за основу. * ENV — устанавливает переменную среды * RUN — запустить команду в контейнере (все команды исполняются с полными правами в пределах контейнера) * ADD — добавить файл в контейнер * VOLUME — указать монтируемые директории (их можно монтировать на хост машину или на другие контейнеры) * EXPOSE — указать транслируемые порты (их можно транслировать на хост машину или на другие контейнеры) * CMD — запустить процесс (это и будет процесс, вокруг которого построен контейнер) * [[system:vagrant:docker:Dockerfile]] * [[system:vagrant:docker:supervisord.conf]] ==== docker-compose ==== * docker-compose - средство сборки и настройки контейнеров * docker-compose up - поднять контейнеры с учетом правил сборки docker-compose.yml * -d - Для запуска сервисов в фоне (for "detached" mode) <code bash> $ docker-compose config $ docker-compose up </code> Отдельно стоит запомнить команду docker-compose up. Она представляет собой упрощенный вызов docker-compose build && docker-compose run Сборочные контейнеры в связке с docker-compose удобно использовать в окружении разработчика, когда требуется, например, производить некоторые действия при изменении исходников. <note tip>С docker-compose все просто, но есть нюансы. Использовать one shot контейнеры возможно только, если docker-compose up выполняется с опцией “-d”, в противном случае по завершении работы такого контейнера, compose останавливает все остальные контейнеры.</note> === Рабочий процесс === Определение Dockerfile для каждого из сервисов Определение связей между сервисами при помощи [[system:docker:docker-compose.yml|docker-compose.yml]] Запус системы при помощи docker-compose up == Документация == * https://ast.rocks/blog/docker-orchestration ==== docker-compose-mixer ==== Содержание конфигурационного docker-compose-mixer.yml файла по своей сути является небольшим конфигом, который описывает как именно два или более проектов будут стартовать вместе. <note tip><code bash> $ 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 </code> Работает с docker-compose-mixer.yml файлом</note> Решает проблемы: * Конфликты имен контейнеров c обновлением всего дерева конфигурации * Конфликты портов пробрасываемых на хост-машину * Переопределение свойств сервиса * Разрешение относительных путей * Удаление лишних или дублирующихся сервисов Подробнее: https://habrahabr.ru/post/274581/ ==== docker-machine ==== В GitHub-репозитории Docker Machine можно найти три bash-сценария, которые упрощают работу команд docker и docker-machine. Они отвечают за выполнение команд и пользовательские настройки командной строки bash. === Использование === == создания нового хоста == <code bash>$ docker-machine create --driver virtualbox machine-name</code> * -d --driver задаёт драйвер ([[https://docs.docker.com/machine/drivers/|список доступных драйверов]]) * generic * [[https://github.com/zchee/docker-machine-driver-xhyve|xhyve]] - (Используется для MacOs) * virtualbox * [[https://github.com/Parallels/docker-machine-parallels|parallels]] **generic** <code bash> $ docker-machine create \ --driver generic \ --generic-ip-address=203.0.113.81 \ --generic-ssh-key ~/.ssh/id_rsa \ machine-name </code> * где machine-name - название создаваемой машины == запустить == <code bash>$ docker-machine start machine-name</code> == выполнение команд на удаленном хосте == <code bash>$ docker-machine ssh machine-name cat /etc/hosts</code> или подключится к удаленному хосту <code bash>$ docker-machine ssh machine-name</code> == просмотреть список доступных хостов == <code bash>$ docker-machine ls</code> == получить подробную информацию о хосте == <code bash>$ docker-machine inspect machine-name</code> == настройки соединения хоста, == <code bash>$ docker-machine config machine-name</code> == отображает IP-адрес хоста == <code bash>$ docker-machine ip machine-name</code> == отключение == <code bash>$ docker-machine stop machine-name</code> == удаление == <code bash>$ docker-machine rm machine-name</code> == список удаленных хостов == <code bash>$ docker-machine ls</code> === Сценарии === == 1 Сценарий == <code bash>$ wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine-prompt.bash -O /etc/bash_completion.d/docker-machine-prompt.bash</code> Чтобы завершить установку этого файла, нужно установить пользовательское значение переменной PS1 в файле .bashrc. PS1 – это специальная переменная оболочки, которая используется для редактирования командной строки bash. Откройте файл: <code>nano ~/.bashrc</code> Этот файл содержит три строки, которые начинаются с PS1: <code>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"</code> В конец каждой строки нужно вставить <text>$(__docker_machine_ps1 " [%s]")</text>. Должно получиться следующее: <code>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"</code> Теперь имя активной машины будет отображаться в командной строке оболочки. == 2 Сценарий == Второй сценарий называется docker-machine-wrapper.bash. Он добавляет к команде docker-machine подкоманду use, которая позволяет быстро переключаться между машинами Docker. Чтобы загрузить этот сценарий, наберите: <code bash>$ wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine-wrapper.bash -O /etc/bash_completion.d/docker-machine-wrapper.bash</code> == 3 Сценарий == Последний сценарий называется docker-machine.bash. Он отвечает за завершение команд docker-machine. <code bash>$ wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine.bash -O /etc/bash_completion.d/docker-machine.bash</code> Чтобы активировать внесённые изменения, закройте и снова откройте терминал. Если вы находитесь в сессии SSH, закройте и снова откройте сессию. Теперь завершение команд docker и docker-machine включено. ===== Контейнер ===== ==== О контейнере ==== <code bash> $ 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 </code> ==== Статус ==== <code bash> $ 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 </code> ==== Работа с контейнером ==== <code bash> $ docker exec -it security-mysql /bin/bash $ docker exec -it security-mysql cat /etc/passwd </code> ==== Список контейнеров (запущенных и нет) ==== <code bash> $ 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 </code> * -a - Позволяет увидеть не запущенные контейнеры * -l - Выведет список недавно созданных контейнеров * где docker-grand-ambassador прокси для 2-ух направленной связи контейнеров * curl -L http://security-web/sphinx_yiic/products ==== Остановка контейнера ==== <code> $ docker stop 7d0eb5cd3b3b </code> ==== Удаление контейнера ==== <code bash> $ docker rm 7d0eb5cd3b3b </code> ===== Образы ===== ==== Поиск образов ==== <code bash>$ docker search alpine</code> ==== Загрузка образа в систему ==== <code bash> $ docker pull alpine $ docker pull alpine:latest </code> ==== Чистые образы ==== * https://hub.docker.com/_/busybox/ * https://hub.docker.com/_/alpine/ * https://hub.docker.com/_/debian/ ==== Готовые сервисы ==== * https://hub.docker.com/r/mvertes/alpine-mongo/ (mvertes/alpine-mongo) 78 MB * https://hub.docker.com/r/vinsonzou/alpine-mariadb/ (vinsonzou/alpine-mariadb) 48.7 MB * https://hub.docker.com/r/yobasystems/alpine-mariadb/ (yobasystems/alpine-mariadb) 47.9 MB * https://hub.docker.com/r/jaskipper/alpine-mariadb/ (jaskipper/alpine-mariadb) 8.5 MB * https://hub.docker.com/_/php/ (php, php:7.1-alpine, php:7-alpine, php:alpine, php:5.6-alpine, 5-alpine итд) * https://hub.docker.com/r/matriphe/alpine-php/ (matriphe/alpine-php:fpm, matriphe/alpine-php:cli, matriphe/alpine-php:fpm7) <50 MB * https://hub.docker.com/_/redis/ (redis:alpine) ~5 MB + redis * https://hub.docker.com/r/stefobark/sphinxdocker/ (stefobark/sphinxdocker) * https://hub.docker.com/_/nginx/ (nginx:alpine) ~5 MB + nginx * https://hub.docker.com/_/memcached/ - (memcached:alpine) ~5 MB + memcached ==== Готовые сборки ==== * https://hub.docker.com/r/matriphe/alpine-nginx/ (matriphe/alpine-nginx) * https://github.com/kost/docker-alpine (kost/docker-alpine) * https://hub.docker.com/r/leanlabs/npm-builder/ (leanlabs/npm-builder) * https://hub.docker.com/r/imega/composer/ (imega/composer) 43 MB * https://hub.docker.com/r/leanlabs/kanban/ (leanlabs/kanban) - Аналог Trello ==== Создание образа ==== <code bash> $ docker build -t image-name . </code> * Где . папка, где расположен Dockerfile * container-name - название создаваемого контейнера ==== Вывод списка образов ==== <code bash> $ docker images </code> ==== Запуск образа ==== <code bash> $ docker run -d -p 80:80 -t image-name $ docker run -d --publish 8080:80 -t image-name </code> * 8080 - Порт хост машины * 80 - Порт контейнера * -i - откроет интерактивную оболочку контейнера (лучше не использова, а подключаться с помощью docker exec) * -t - название запускаемого контейнера ===== Пример управления контейнером из другого контейнера ===== <code bash>$ docker run -v /var/run/docker.sock:/var/run/docker.sock \ -v $(which docker):/bin/docker \ -ti nachine_name</code> ===== Пространства ===== Применяется для монтирования пространств из внешних источников. К примеру virtualbox * https://docs.docker.com/engine/extend/plugins_volume/ ===== Сетевые драйверы ===== * https://docs.docker.com/engine/extend/plugins_network/ ===== Логирование ===== * https://docs.docker.com/engine/admin/logging/overview/ ====== Рецепты ====== * https://github.com/gusnips/vagrant-yii2 * https://github.com/trntv/yii2-starter-kit * https://github.com/highestgoodlikewater/yii2-appliance-docker-vagrant * https://github.com/acorncom/yii2-advanced-with-vagrant ====== Проблемы и их решения ====== ===== Circular import between fpm and nginx ===== Возникает при циклическом связывании контейнеров (2-ух сторонее связывание) В качестве решенияпроблемы, на данный момент, можно воспользоваться прокси сервером/контейнером docker-grand-ambassador <code yaml> 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" </code> ===== ERROR: Couldn't connect to Docker daemon - you might need to rundocker-machine start default` ===== скорее всего вам потребуется сделать следующее: <code bash>$ docker-machine create --driver=xhyve dev --xhyve-experimental-nfs-share</code> ====== Компоненты ====== * [[https://docs.docker.com/|Docker]] * [[https://docs.docker.com/compose/|docker-compose]] - Компановщик контейнеров * [[https://docs.docker.com/machine/|docker-machine]] - Это инструмент, позволяющий управлять удалёнными хостами Docker с локального компьютера. * [[https://www.docker.com/products/docker-toolbox|Docker Toolbox]] - Комплект необходимых программ для Windows или MacOs (Внимание!!! ставит VirtualBox ) * [[https://www.weave.works/products/weave-scope/|Weave Scope]] - Это очень удобный и наглядный сервис для мониторинга Docker контейнеров. * [[https://github.com/google/cadvisor|cAdvisor]] - Система мониторинга за контейнерами ====== Документация / Статьи ====== * [[https://habrahabr.ru/post/277699/|о технологии]] * https://habrahabr.ru/post/253877/ :!: * https://habrahabr.ru/post/309556/ :!: * http://ru.stackoverflow.com/questions/tagged/docker-compose * https://habrahabr.ru/post/263083/ * https://blog.amartynov.ru/docker-mysql/ * http://onedev.net/post/579 * https://dou.ua/lenta/articles/vagrant/ * https://ast.rocks/blog/docker-create-container * https://xakep.ru/2015/06/04/docker-faq/ * http://dotsandbrackets.com/quick-intro-to-docker-compose-ru/ * https://toster.ru/q/200627 * http://devacademy.ru/posts/ustanovka-i-ispol-zovaniie-docker-compose-na-ubuntu-14-04/ * https://ast.rocks/blog/docker-orchestration * https://docs.docker.com/docker-for-mac/#uninstall-or-reset ====== Другие системы виртуализации ====== {{topic>[virtual]}} СохранитьПросмотрРазличияОтменить Сводка изменений Примечание: редактируя эту страницу, вы соглашаетесь на использование своего вклада на условиях следующей лицензии: CC0 1.0 Universal