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.

Установка

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

Запускаем создание:

docker-compose up --build -d