Docker - заметки

Преимущества docker

  1. Всегда ставится новейшая или нужная версия.

  2. Экономия ресурсов. RAM, CPU, диск используются только в момент запуска контейнера. Можно что-то выполнить и сразу выйти - ресурсы сразу освобождаются (serverless). Образ контейнера минимален - там нет ничего лишнего. Оптимизирован профессионально под сервис.

  3. Можно создавать свои образы и размещать их на hub.docker.com и даже сертифицировать. Также можно создать свое хранилище образов.

  4. Docker-way - все сервисы хранить в отдельных контейнерах и настраивать взаимодействие между ними - микросервисная архитектура. Все собирается "по кирпичикам".

  5. Минималистичность при использовании диска, реализованная по принципам git. В ФС хранятся только изменения файлов относительно базового образа и их история.

  6. Можно совместно использовать некоторые службы различными потребителями - например Mysql СУБД для нескольких сайтов. Удобство в том, что все связанное с Mysql обслуживается только в одном контейнере!

  7. Использование единых настроек рабочей среды посредством экспорта файла переменных окружения внутрь всех рабочих контейнеров.

  8. Docker-compose позволяет в пакетном режиме создавать и управлять группами контейнеров, используя единую YAML-конфигурацию в рамках проекта (оркестрация).

  9. Сервисы понимают друг друга "по имени", которое прописано в docker-compose.yaml, что существенно упрощает настройку взаимодействия.

  10. Проще по сравнению с kubernetes.

Основные команды:

# Просмотр всех контейнеров
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@gkomega.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"
# Пример оркестрации - создаются два связанных контейнера, 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

docker-compose up --build -d
#