# DevOps

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

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

  ```javascript
  docker ps
  ```
* Именованные вольюмы:  

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

  ```javascript
  docker stop <container>
  ```

  /

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

  ```javascript
  docker exec -it <container> sh
  ```

  (или

  ```javascript
  bash
  ```

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

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

    ```javascript
    docker run --rm -it <container> sh
    ```

    или

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

    (в зависимости от вутреннего устройства образа)
  * Если надо пробросить в контейнер по пути

    ```javascript
    /v
    ```

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

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

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

  ```javascript
  docker-compose up -d
  ```

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

  ```javascript
  docker-compose.yml
  ```

  )
* Забрать файл из именованного вольюма на хост:
  * Если есть работающий контейнер, в который смонтирован нужный вольюм:

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

       ```javascript
       docker inspect <container>
       ```
    2. docker cp <path_in_container>:<container> <extracted_path>
  * Если нельзя рассчитывать на контейнеры:

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

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

      ```javascript
      docker run --rm -iv <volume>:/v busybox sh -c 'cat /v/<path>' > <extracted_file>
      ```
* Заложить файл в именованный вольюм:
  * Один файл через stdio:  

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

    ```javascript
    docker cp <path_on_host> <container>:<path_in_container>
    ```
* Правильное обращение с логами:
  * Настроить [journald logging driver](https://docs.docker.com/config/containers/logging/journald/) (это спасёт от переполнения диска логами, так как у дефолтного драйвера нет ротации).
  * Читать старые логи

    ```javascript
    sudo journalctl -ru docker
    ```
  * Смотреть стрим
    * Всех контейнеров

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

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

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

---

**Documents**

- [О нас](https://lore.hackem.cc/s/main/doc/o-nas-QY4JnnQznQ)
- [Проекты](https://lore.hackem.cc/s/main/doc/proekty-Dui8Tsngs3)
- [Donate](https://lore.hackem.cc/s/main/doc/donate-F24cOiaMOW)
- [Оборудование спейса](https://lore.hackem.cc/s/main/doc/oborudovanie-spejsa-anMybBFat1)
- [Интернет-провайдеры Еревана](https://lore.hackem.cc/s/main/doc/internet-provajdery-erevana-bOQ36Lkh5q)
- [Всякое разное](https://lore.hackem.cc/s/main/doc/vsyakoe-raznoe-2nLdUtbhBz)
- [Поваренная Книга](https://lore.hackem.cc/s/main/doc/povarennaya-kniga-WJ9G0aZNzz)