Docker - заметки
Преимущества docker
- Всегда ставится новейшая или нужная версия.
- Экономия ресурсов. RAM, CPU, диск используются только в момент запуска контейнера. Можно что-то выполнить и сразу выйти - ресурсы сразу освобождаются (serverless). Образ контейнера минимален - там нет ничего лишнего. Оптимизирован профессионально под сервис.
- Можно создавать свои образы и размещать их на hub.docker.com и даже сертифицировать. Также можно создать свое хранилище образов.
- Docker-way - все сервисы хранить в отдельных контейнерах и настраивать взаимодействие между ними - микросервисная архитектура. Все собирается “по кирпичикам”.
- Минималистичность при использовании диска, реализованная по принципам git. В ФС хранятся только изменения файлов относительно базового образа и их история.
- Можно совместно использовать некоторые службы различными потребителями - например Mysql СУБД для нескольких сайтов. Удобство в том, что все связанное с Mysql обслуживается только в одном контейнере!
- Использование единых настроек рабочей среды посредством экспорта файла переменных окружения внутрь всех рабочих контейнеров.
- Docker-compose позволяет в пакетном режиме создавать и управлять группами контейнеров, используя единую YAML-конфигурацию в рамках проекта (оркестрация).
- Сервисы понимают друг друга “по имени”, которое прописано в docker-compose.yaml, что существенно упрощает настройку взаимодействия.
- Проще по сравнению с kubernetes.
Установка
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
sudo apt install docker.io docker-compose swarm
docker version
docker info
Основные команды
# Просмотр всех контейнеров
docker ps -a
# Просмотр зарущенных контейнеров
docker ps
# Запуск контейнера с пробросом порта на гостевую машину
docker run -p 8080:80 nginx
# Запуск контейнера на образе nginx в интерактивном режиме и выполнение в нем нужной команды.
docker run -it nginx who
# Запуск нужной версии ПО
docker run -it php:7.1-cli
# Уничтожить контейнер
docker kill <container_id>
# Посмотреть лог контейнера в реальном времени
docker logs -f <container_id>
# Выполнить команду в запущенном контейнере
docker exec <container_id> netstat -tulpn
# Посмотреть статистику использования ресурсов
docker stats
# Зафиксировать изменения контейнера
docker commit <container_id>
# Опубликовать (обновить) образ контейнера в своем репозитории
docker pull myreg:port/ovt/neutron
# Трансляция локального каталога во внутренний
docker run -p 8080:80 -v ~/www/index.php:/var/www/html nginx
# Зайти внутрь контейнера
docker exec -it <container_id> bash
# Запуск контейнера с установкой переменных окружения
docker run -e "PATH=$PATH:/app" nginx
docker run --env-file=.env nginx
Построить собственный клон контейнера
mkdir php74_sil; cd php74_sil
cat Dockerfile <<< EOF
FROM php:7.4-cli
MAINTAINER Omega DSA <dsa@omega.ru>
RUN apt-get update && apt-get -y install net-tools iproute2
COPY . /var/www/html
WORKDIR /var/www/html
EOF
docker build -t "php74_sil:php-for-webdev"
Пример оркестрации
Cоздаются два связанных контейнера, nginx не стартует, если php не создан (depends_on)
cat docker-compose.yaml
version: '3'
services:
nginx:
build: ./nginx
ports:
- "8080:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/conf.d:/etc/nginx/conf.d
- ./app:/app
depends_on:
- php
php:
build: ./php
volumes:
- ./app:/app
Запускаем создание: