Docker - andyceo/documentation GitHub Wiki

Установка Docker на Ubuntu

Подробно установка описана на официальной странице Get Docker CE for Ubuntu.

Также можно установить через Ansible с помощью роли andyceo.docker, которая следует лучшим практикам, описанным в официальной документации.

Удаление Docker полностью

Если нода в кластере Swarm:

sudo docker swarm leave

Потом удаляем Docker:

sudo apt purge docker-ce

Подчищаем папки Docker:

sudo rm -rf /var/lib/docker /etc/docker

Основные команды

  1. Создание образа (image) из Dockerfile:

     sudo docker image build -t andyceo/your_container_name .
    
  2. Если создание образа закончилось неудачно, файловую систему в контейнере можно посмотреть, запустив контейнер на основе последнего удачного образа (docker создает промежуточный образ каждый раз, когда выполняет инструкции в Dockerfile), см. раздел Манипуляции с файловой системой образа и контейнера:

     sudo docker container run --rm -it <id_of_the_last_success_container> bash -il
    
  3. Показать активные контейнеры:

     sudo docker container ps
    
  4. Показать все контейнеры:

     sudo docker container ps -a
    
  5. Показать все остановленные контейнеры:

     sudo docker container ps -a -f status=exited
    
  6. Показать образы:

     sudo docker image ls
    
  7. Запустить контейнер на основе образа andyceo/your_container_name, пробросить порт 80 в контейнере на порт 8082 на хосте и освободить терминал (-d):

     sudo docker container run -d -p 8082:80 -t -i --name dokuwiki andyceo/your_container_name
    
  8. Выполнить команду в работающем контейнере:

     sudo docker container exec -ti dokuwiki bash -il
    
  9. Посмотреть внешние томы (volumes) контейнера с именем example

     sudo docker container inspect --format "{{ .Mounts }}" example
    

    Все volumes для которых не указан путь расположения на хосте (левая часть /host/path/to/data:/container/to/data) хранятся в директории /var/lib/docker/volumes/<хэш volume>/_data/. Таким образом, можно просто исследовав все директории в /var/lib/docker/volumes/ и найти необходимый.

  10. Найти неиспользуемые (зависшие, dangled, orphaned) volumes:

     sudo docker volume ls -f dangling=true
    
  11. Удалить неиспользуемые volumes:

     sudo docker volume rm $(sudo docker volume ls -qf dangling=true)
    

    подробнее про управление данными в контейнере: https://docs.docker.com/engine/userguide/dockervolumes/

  12. Посмотреть логи контейнера, последние 10 строк (--tail 10) и следить за новыми (-f):

     sudo docker container logs -f --tail 10 containername
    

    Найти файл где хранятся логи:

     sudo docker container inspect --format='{{.LogPath}}' containername
    

    Записать логи в отдельные два файла (нормальный вывод и вывод ошибок):

     sudo docker container logs containername > /tmp/stdout.log 2>/tmp/stderr.log
    

    Записать логи контейнера в один файл, без разделения:

     sudo docker container logs containername >& /tmp/stdoutandstderr.log
    

    См. how to redirect docker logs to a single file?

  13. Остановить контейнер:

     sudo docker container stop dokuwiki
    
  14. Удалить остановленный контейнер:

     sudo docker container rm dokuwiki
    
  15. Остановить и удалить контейнер:

     sudo docker container rm -f dokuwiki
    
  16. Посмотреть все остановленные контейнеры

     sudo docker container ps -f status=exited
    
  17. Удалить все остановленные контейнеры

     sudo docker container rm $(sudo docker ps -q -f status=exited)
    
  18. Удалить образ:

     sudo docker image rm dokuwiki
    
  19. Удалить старые, неиспользуемые образы

     sudo docker image rm -f $(sudo docker images | grep "<none>" | awk "{print \$3}")
    
  20. Более дружелюбный docker container ps (без переноса строк)

     sudo docker container ps -q | xargs sudo docker container inspect --format '{{printf "%.12s\t%s" .Id .Config.Cmd}}'
    

    или

     sudo docker container ps | less -S
    
  21. Остановить/удалить все контейнеры:

     sudo docker container stop $(sudo docker ps -q)
     sudo docker container rm $(sudo docker ps -q)
    

    Ключ –q или –quiet заставляет команду ps возвращать только идентификаторы контейнеров

    Команда stop по умолчанию посылает сигнал SIGTERM корневому процессу контейнера (PID=1), и если процесс не завершается по таймауту (10 секунд по умолчанию), посылается сигнал SIGKILL. Можно контролировать таймаут:

     sudo docker container stop --time=30 foo
    

    Если вы хотите правильно останавливать контейнеры (разные приложения требуют разных сигналов для корректной остановки), можно почитать Gracefully Stopping Docker Containers

  22. Посмотреть логи демона Docker в Ubuntu:

     sudo sudo journalctl -fu docker.service
    

    В старых Ubuntu без systemd:

     sudo tail -f /var/log/upstart/docker.log
    

    Подробнее и для других операционных систем можно глянуть эту страницу: Where is the Docker daemon log?

  23. Посмотреть список процессов в контейнере:

     sudo docker container top CONTAINER_NAME
    

    Также, можно выяснить, в каком из контейнеров выполняется процесс с id = 21030:

     for i in `sudo docker container ps -q`; do echo $i && sudo docker container top $i | grep 21030 -C 10 ; done
    
  24. Поиграться с последним образом системы Alpine в интерактивном режиме, а потом сразу же удалить контейнер:

     docker container run --rm -it alpine /bin/sh
    

    Отсоединиться от контейнера, не прекращая его работу: Ctrl-P Ctrl-Q. Для экспериментов с предустановленным Python 3:

     docker container run --rm -it python:3.6.0-alpine /bin/sh
    

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

Манипуляции с файловой системой образа и контейнера

  1. Если создание образа закончилось неудачно, файловую систему в контейнере можно посмотреть, запустив контейнер на основе последнего удачного образа (docker создает промежуточный образ каждый раз, когда выполняет инструкции в Dockerfile):

     sudo docker container run --rm -it <id_of_the_last_success_container> bash -il
    
  2. Скопировать файл из контейнера на хост-систему:

     sudo docker container cp <containerId>:/file/path/within/container /host/path/target
    
  3. Скопировать файл из хост-системы в контейнер:

     sudo docker container cp /host/path/target <containerId>:/file/path/within/container
    
  4. Создать из сушествующего контейнера другой контейнер, в котором запустить нужную команду (полезно, когда ваш контейнер постоянно останавливается, и не возможности выполнить docker attach):

     sudo docker container commit CONTAINER_ID temporary_image
     sudo docker container run -it temporary_image /bin/bash
    
  5. Для дополнительных манипуляций с файловой системой контейнера, которые нужно выполнить ДО его запуска, последовательность действий обычно такая:

    1. Создаем контейнер: sudo docker container create -ti image_name:tag --name container_name /bin/bash
    2. Выполним нужные действия над файловой системой контейнера: sudo docker container start container_name /bin/bash

Ссылки:

Проксирование почты из контейнера на хост-систему

В контейнере, как правило, не установлен MTA. Поэтому для отправки писем нужно подсоединяться по протоколу SMTP на какой-либо MTA, как правило, на MTA хостовой системы. Для этого этот MTA на хостовой системе нужно настроить на прием соединений с подсети Docker. Например для Postfix - параметр mynetworks:

sudo nano /etc/postfix/main.cf

mynetworks = 127.0.0.0/8 172.17.0.0/16 10.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

Отлаживать почтовый сервер можно, просматривая его логи:

sudo tail -f /var/log/mail.log

В приложении внутри контейнера, нужно настроить отсылку писем через SMTP-протокол. Пример для Gitlab, файл :

gitlab_rails['gitlab_email_from'] = '[email protected]'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "example.com"
gitlab_rails['smtp_port'] = 25
gitlab_ci['gitlab_ci_email_from'] = '[email protected]'

И запустить переконфигурацию Gitlab:

gitlab-ctl reconfigure

Выполняем команды Docker удаленно через сеть (Docker Remote API)

  1. Сначала, пробросим сокет по http:

     socat unix-connect:/var/run/docker.sock TCP4-LISTEN:5555
    
  2. Затем с другого компьютера, выполним запрос по http:

     curl -X GET http://10.1.20.115:5555/containers/json
    

Ссылки:

Веб-интерфейс для Docker

Быстрый старт:

docker container run -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock --name dockerui kevan/dockerui:0.10.1

Также, можно настроить прокси веб-сервер, чтобы проксировать запросы с какого-либо поддомена данного сервера на этот контейнер. Т.к. в этом UI нет авторизации вообще, то в целях безопасности нужно настроить nginx на этот хост с HTTP Basic Auth, а также в файерволе запретить входящие соединения на порт 9000 со всех ip-адресов, кроме 127.0.0.1. Вот пример конфигурации для роли andyceo.nginx:

'dockerui':
  enabled: yes
  listen:
    - '*:443'
  root: /var/www
  name: dockerui.example.com
  auth:
    root: 123qwe
  nginx:
    locations:
      main:
        pattern: '/'
        includes:
          - main
        location: |
          proxy_pass http://127.0.0.1:9000;
          proxy_http_version 1.1;
          proxy_set_header Connection "";

Можно установить в виде докер-контейнера из образа kevan/dockerui, с помощью Ansible-роли andyceo.docker: Ansible Docker config, Proxy Nginx virtual host configuration.

Используем файловую систему BTRFS вместе с Docker

Использование cron в контейнере на базе alpine

Если у вас есть файл с заданиями cron на хост-системе:

docker run -it --rm -v tasks.cron:/tasks.cron alpine:3.5 sh -c “crontab /tasks.cron && crond -f -L /dev/stdout”

Использование cron полностью в командной строке:

docker run -it --rm alpine sh -c echo "30 2 */2 * * your_command_goes_here" | crontab - && crond -f -L /dev/stdout

Подробнее см. источник: Running cron in Docker the Easy Way

⚠️ **GitHub.com Fallback** ⚠️