Docker

Official site

Docker Docs

Docker Hub

Разделы

Images

Docker Remote

Docker Troubleshooting

Полезные ссылки

Get Docker for UbuntuPost-installation steps for Linux

Install Docker Compose

Docker CLI

Dockerfile reference

Dockerfile best practies

Compose file reference v2 | v3

Docker Nginx Proxy

DRY - интерактивная утилита для управления Docker

Доменные имена с валидным SSL для локальных Docker-контейнеровУдаление образов, контейнеров и томовENTRYPOINT vs CMD: назад к основам

Commands

# --- Проверка корректности установки Docker
docker run hello-world

# --- Отображение низкоуровневой информации об объектах Docker
docker inspect [OPTIONS] NAME|ID [NAME|ID...]

# --- Удаление всех остановленных контейнеров
docker rm $(docker ps -a -q)

# --- парсинг лога
docker logs container_name 2>&1 | grep "xxx" 

# Удаление образа или образов
## Удаление образа с none-именем
docker rmi $(docker images | grep "^<none>" | awk '{print $3}')
## Удаление образа с none-именем или none-меткой
docker rmi $(docker images | grep "<none>" | awk '{print $3}')
## Удаление образов и слоев
docker rmi $(docker images -f dangling=true -q)
## Задача crontab для ежедневного удаления остановленных контейнеров и  none образов
@daily docker rm $(docker ps -a -q)
@daily docker rmi $(docker images | grep "<none>" | awk '{print $3}')

# Удаление ВСЕХ образов. ВЫПОЛНЯТЬ С ОСТОРОЖНОСТЬЮ
docker rmi -f $(docker images -aq)
# Очистка дискового пространства:
# удаляются остановленные контейнеры и тома
docker system prune -a --volumes

# === ИНСПЕКТИРОВАНИЕ ===
# --- Просмотр журнала контейнера из файла
docker inspect --format='{{.LogPath}}' containername
# --- смонтированные тома
docker inspect peer1.org1.com  | jq .[0].Mounts
# --- просмотр entrypoint и cmd образа
docker inspect -f '{{.Config.Entrypoint}}' image-name-or-id
docker inspect -f '{{.Config.Cmd}}' image-name-or-id

# Принудительное пересоздание контейнера
docker-compose up -d --force-recreate SERVICE_NAME

# Запуска контейнера в окружении localhost
# можно соединяться изнутри контейнера к портам localhost
docker run --network="host" ...

# --- Запуск bash с заменой entrypoint
docker run --rm -it --entrypoint 'bin/bash' IMAGENAME

# --- Установка параметра restart для запущенного контейнера
docker update --restart=always <container>

# --- Переименование контейнера
docker rename my_container my_new_container

# --- check Docker image for vulnerabilites
docker run --rm \
  -e DOCKER_IMAGE=eclipse-temurin:11.0.15_10-jdk-alpine \
  registry.gitlab.com/security-products/container-scanning:5 \
  gtcs scan

docker ps --size --format=.ID
docker ps --size --format "{{.ID}}"
docker ps --size --format "{{.Names}}"
docker ps --size --format "{{.Names}} {{ .Size }}"
docker ps --size --format "{{.Names}}\t{{.Size}}"
docker ps --size --format "{{.Names}}\t\t\t{{.Size}}"
docker ps --size --format "{{.Names}}\t\t\t{{.Size}}" | grep moe-sobranie
docker ps --size --format "{{.Names}}\t\t{{.Size}}\t{{.RunningFor}}" | grep moe-sobranie
docker ps --size --format "{{.Names}}\t\t{{.Size}}\t{{.CreatedAt}}" | grep moe-sobranie
docker ps
docker ps --size --format "{{.Names}}\t\t{{.Size}}\t{{.Status}}" | grep moe-sobranie

Dockerfile

ENTRYPOINT vs CMD

https://docs.docker.com/engine/reference/builder/#entrypoint https://habr.com/ru/company/southbridge/blog/329138/

  1. В Dockerfile должны присутствовать ENTRYPOINT или CMD или обе
  2. ENTRYPOINT задается для контейнеров, которые используются как исполнительные программы (executable).
  3. CMD определяется как аргументы по умолчанию для для исполнительной программы (по п. 2)
  4. CMD может переопределяться при запуске контейнера

Docker API

https://docs.docker.com/engine/api/

# --- get containers list
curl -s --unix-socket /var/run/docker.sock http://localhost/containers/a72a50ba0c90/json
curl -s --unix-socket /var/run/docker.sock http://localhost/containers/fa765e9b9fb1/json
curl -s --unix-socket /var/run/docker.sock http://localhost/containers/a3dfe5026f27/json | jq
# --- inspect container by id
#     CONTAINER_ID is a hostname inside a container or HOSTNAME environment variable
curl -s --unix-socket /var/run/docker.sock http://localhost/containers/CONTAINER_ID/json

Docker Logs

Service Labels in Log

Докер по умолчанию складирует логи в файл /var/lib/docker/containers/<container_id>/<container_id>-json.log

Для того, чтобы в логи записывались метки (labels) контейнера, которые указываются в команде docker run или в docker-compose.yml необходимо прописать эти метки в конфигурацию демона.

  • Если планируется фильтровать логи с использованием fluent-bit , то могут возникнуть проблемы с ключевыми полями, содержащие точки, напр: example.com=foo - ключевое поле содержит точку
# docker-compose.yml
services:
  service_name:
    # ...
    labels:
      - 'com.example=foo'
// /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "labels": "com.example"
  }
}

Перезапускаем systemd-демон

sudo systemctl daemon-reload
sudo systemctl restart docker.service

Смотрим логи

// /var/lib/docker/containers/<container_id>/<container_id>-json.log
{"log":"...", "attrs":{"com.example":"foo"}, ...}

Recipes

Допустим у нас БД запускается в одном контейнере, а приложение запускается в другом.

По-умолчанию оба контейнера работают в одной сети docker0 c IP 172.17.0.X

ifconfig docker0

поэтому взаимодействие может быть построено по IP-адресам.

Однако, правильный подход предполагает связь по символическому имени, например. имени контейнера. Для того, чтобы контейнер БД был доступен в контейнере приложения по имени, необходимо при запуске контейнера приложения использовать опцию --link ANOTHER_CONTAINER_NAME. Это имя будет прописано в файл /etc/hosts и будет доступным.

docker run --name gosplan --rm -it --link my_another_container my_container bash
/home/app/gosplan> ping postgres_gosplan

Для того, чтобы не задавать явно имя контейнера в файле config/database.yml, можно воспользоваться переменной окружения:

production:
  <<: *default
  host: <%= ENV["POSTGRES_HOST"]
  port: <%= ENV["POSTGRES_PORT"]
  username: ...

Re-install docker

переустановка докера

sudo apt-get purge docker-engine
sudo apt-get autoremove --purge docker-engine
sudo rm -rf /var/lib/docker # This deletes all images, containers, and volumes
sudo reboot
sudo apt-get install docker-ce

About Docker

https://habr.com/ru/post/353238/

Docker - это открытая платформа для разработки, доставки и эксплуатации приложений. С помощью docker вы можете отделить ваше приложение от вашей инфраструктуры и обращаться с инфраструктурой как управляемым приложением. Docker позволяет запускать практически любое приложение, безопасно изолированное в контейнере. Безопасная изоляция позволяет вам запускать на одном хосте много контейнеров одновременно. Легковесная природа контейнера, который запускается без дополнительной нагрузки гипервизора, позволяет вам добиваться больше от вашего железа.

Docker использует архитектуру клиент-сервер. Docker клиент общается с демоном Docker, который берет на себя тяжесть создания, запуска, распределения ваших контейнеров. Оба, клиент и сервер могут работать на одной системе, вы можете подключить клиент к удаленному демону docker. Клиент и сервер общаются через сокет или через RESTful API.

Docker - это три компонента: образ, контейнер и реестр. Образ - это read-only шаблон для создания контейнеров, состоящий из "слоев" или "уровней". Реестр - хранилище образов. Контейнер - это процесс, работающий в изолированном окружении (в окружении образа)