DevOps

Как поддерживать штуки в контейнерах

  • Запущенные контейнеры:

    docker ps
  • Именованные вольюмы:

    docker volume ls
  • Остановить/возобновить работу контейнера (гибернация-ish):

    docker stop <container>

    /

    docker start <container>
  • Зайти внутрь работающего (в фоне) контейнера:

    docker exec -it <container> sh

    (или

    bash

    , если он там есть)

  • Создать новый (временный) контейнер из образа и подключить к нему консоль:

    docker run --rm -it <container>
    • Если сразу запускается приложение, а надо зайти в консоль:

      docker run --rm -it <container> sh

      или

      docker run --rm -it --entrypoint sh <container>

      (в зависимости от вутреннего устройства образа)

    • Если надо пробросить в контейнер по пути

      /v

      именованный вольюм (или абсолютный путь с хоста):

      docker run --rm -itv <volume_or_path>:/v <container> sh
    • Если надо пробросить HTTP порт 80 из контейнера на хост (в порт 8080 хоста):

      docker run --rm -itp 8080:80 <container>
  • Создать контейнер из образа со всеми необходимыми переменными и настройками, и после запуска оставить его работать в фоне:

    docker-compose up -d

    (из папки, в которой есть файл

    docker-compose.yml

    )

  • Забрать файл из именованного вольюма на хост:

    • Если есть работающий контейнер, в который смонтирован нужный вольюм:

      1. Узнать куда смонтирован вольюм:

        docker inspect <container>
      2. docker cp <path_in_container>:<container> <extracted_path>

    • Если нельзя рассчитывать на контейнеры:

      proxy=$(docker run --rm -dv <volume>:/v busybox sleep 900)
      docker cp $proxy:/v <extracted_path>
      docker rm --force $proxy

      Copy

      • Если надо извлечь один файл в одну команду, можно сделать это через stdio:

        docker run --rm -iv <volume>:/v busybox sh -c 'cat /v/<path>' > <extracted_file>
  • Заложить файл в именованный вольюм:

    • Один файл через stdio:

      cat <file_on_host> | docker run --rm -iv <volume>:/v busybox sh -c 'cat > /v/<path>'
    • Любой путь при работающем контейнере:

      docker cp <path_on_host> <container>:<path_in_container>
  • Правильное обращение с логами:

    • Настроить journald logging driver (это спасёт от переполнения диска логами, так как у дефолтного драйвера нет ротации).

    • Читать старые логи

      sudo journalctl -ru docker
    • Смотреть стрим

      • Всех контейнеров

        sudo journalctl -fu docker
      • Одного контейнера

        docker logs --tail=20 --follow <container>

Если тут не рассмотрен какой-то важный сценарий, обращайтесь к Химуре.