<<TableOfContents()>>
= Docker =
[[https://www.docker.com/|Official site|class=" moin-https"]]
[[https://docs.docker.com|Docker Docs|class=" moin-https"]]
[[https://hub.docker.com/|Docker Hub|class=" moin-https"]]
== Разделы ==
[[devops/docker/images|Images]]
[[https://moin.onrails.ru/DockerRemote|Удаленное управление|class=" moin-https"]]
[[https://moin.onrails.ru/Устранение%20неисправностей%20Docker|Устранение неисправностей|class=" moin-https"]]
== Полезные ссылки ==
[[https://docs.docker.com/engine/installation/linux/ubuntu/|Get Docker for Ubuntu|class=" moin-https"]][[https://docs.docker.com/engine/installation/linux/linux-postinstall/|Post-installation steps for Linux|class=" moin-https"]]
[[https://docs.docker.com/compose/install/|Install Docker Compose|class=" moin-https"]]
[[https://docs.docker.com/engine/reference/commandline/cli/|Docker CLI|class=" moin-https"]]
[[https://docs.docker.com/engine/reference/builder/|Dockerfile reference|class=" moin-https"]]
[[https://docs.docker.com/develop/develop-images/dockerfile_best-practices/|Dockerfile best practies|class=" moin-https"]]
[[https://docs.docker.com/compose/compose-file/compose-file-v2/|Compose file reference v2 |class=" moin-https"]] | [[https://docs.docker.com/compose/compose-file/compose-file-v3/|v3|class=" moin-https"]]
[[https://github.com/jwilder/nginx-proxy|Docker Nginx Proxy|class=" moin-https"]]
'''[[https://github.com/moncho/dry|DRY - интерактивная утилита для управления Docker|class=" moin-https"]]'''
[[https://habr.com/ru/post/439806/|Доменные имена с валидным SSL для локальных Docker-контейнеров|class=" moin-https"]][[https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes|Удаление образов, контейнеров и томов|class=" moin-https"]][[https://habr.com/ru/company/southbridge/blog/329138/|ENTRYPOINT vs CMD: назад к основам|class=" moin-https"]]
== Commands ==
{{{#!highlight bash
# Проверка корректности установки Docker
docker run hello-world
# Отображение низкоуровневой информации об объектах Docker
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
# Удаление всех остановленных контейнеров
docker rm $(docker ps -a -q)
# Удаление образа или образов
## Удаление образа с 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 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` или обе
1. `ENTRYPOINT` задается для контейнеров, которые используются как исполнительные программы (executable).
1. `CMD` определяется как аргументы по умолчанию для для исполнительной программы (по п. 2)
1. `CMD` может переопределяться при запуске контейнера
{{https://clck.ru/sGbKW|entrypoint vs cmd}}
== Docker API ==
https://docs.docker.com/engine/api/
{{{#!highlight bash
# --- 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` - ключевое поле содержит точку
{{{#!highlight yaml
# docker-compose.yml
services:
service_name:
# ...
labels:
- 'com.example=foo'
}}}
{{{#!highlight json
// /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"labels": "com.example"
}
}
}}}
Перезапускаем systemd-демон
{{{#!highlight bash
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 ==
=== Link Containers ===
Допустим у нас БД запускается в одном контейнере, а приложение запускается в другом.
По-умолчанию оба контейнера работают в одной сети ''docker0'' c IP 172.17.0.X
{{{
ifconfig docker0
}}}
поэтому взаимодействие может быть построено по IP-адресам.
Однако, правильный подход предполагает связь по символическому имени, например. имени контейнера. Для того, чтобы контейнер БД был доступен в контейнере приложения по имени, необходимо при запуске контейнера приложения использовать опцию `--link ANOTHER_CONTAINER_NAME`. Это имя будет прописано в файл ''/etc/hosts'' и будет доступным.
{{{#!highlight bash
docker run --name gosplan --rm -it --link postgres_gosplan gosplan bash
/home/app/gosplan> ping postgres_gosplan
}}}
Для того, чтобы не задавать явно имя контейнера в файле ''config/database.yml'', можно воспользоваться переменной окружения:
{{{#!highlight yaml
production:
<<: *default
host: <%= ENV["POSTGRES_HOST"]
port: <%= ENV["POSTGRES_PORT"]
username: ...
}}}
=== Re-install docker ===
переустановка докера
{{{#!highlight bash
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 шаблон для создания контейнеров, состоящий из "слоев" или "уровней".
Реестр - хранилище образов.
Контейнер - это процесс, работающий в изолированном окружении (в окружении образа)