Docker
Разделы
Полезные ссылки
Get Docker for UbuntuPost-installation steps for Linux
Compose file reference v2 | v3
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/
- В Dockerfile должны присутствовать
ENTRYPOINT
илиCMD
или обе ENTRYPOINT
задается для контейнеров, которые используются как исполнительные программы (executable).CMD
определяется как аргументы по умолчанию для для исполнительной программы (по п. 2)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
Дополнительные метки (labels)
Докер по умолчанию складирует логи в файл
/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"}, ...}
Отправляем логи в Loki
Устанавливаем плагин от Grafana
docker plugin install grafana/loki-docker-driver:3.3.2-amd64 --alias loki --grant-all-permissions
Если возникает ошибка
Если возникает ошибка типа error: dial unix /run/docker/plugins...loki.sock: connect: no such file or directory
, то возможно в вашей команде установки плагина, взятой из документации, прописано arm64
вместо amd64
.
Плагин должен активироваться автоматически.
Создаем или корректируем файл */etc/docker/daemon.json*
{ "debug": true, "log-driver": "loki", "log-opts": { "loki-url": "http://username:secret@127.0.0.1:3100/loki/api/v1/push", "loki-batch-size": "400" } }
Перезапускаем docker
sudo systemctl daemon-reload sudo systemctl restart docker.service
Если что-то пойдет не так с отправкой логов в Loki, docker будет ругаться в syslog
sudo tail -f /var/log/syslog
Recipes
Link Containers
Допустим у нас БД запускается в одном контейнере, а приложение запускается в другом.
По-умолчанию оба контейнера работают в одной сети 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 шаблон для создания контейнеров, состоящий из "слоев" или "уровней". Реестр - хранилище образов. Контейнер - это процесс, работающий в изолированном окружении (в окружении образа)