В этом разделе содержится опциональная процедура настройки хостов Linux для лучшей работы с Docker.

Управление Docker из под пользователя без права root.

Демон Docker привязывается к сокету Unix вместо порта TCP. По умолчанию этот сокет Unix принадлежит пользователю root, и другие пользователи могут получить к нему доступ только с помощью sudo. Демон Docker всегда запускается от имени пользователя root.

Если вы не хотите преобразовывать команду docker с sudo, создайте группу Unix под названием docker и добавьте к ней пользователей. Когда запускается демон Docker, он создает Unix сокет, доступный членам группы docker.

Предупреждение

Группа docker предоставляет привилегии, эквивалентные пользователю root. Подробнее о том, как это влияет на безопасность вашей системы, см. в разделе Атаки из вне на демона Docker.

Примечание:

Чтобы запустить Docker без привилегий root, см. раздел Запуск демона Docker от имени пользователя, не являющегося root-пользователем (режим Rootless).

Чтобы создать группу docker и добавить своего пользователя:

  1. Создайте группу docker.

     $ sudo groupadd docker
  2. Добавьте своего пользователя в группу docker.
    $ sudo groupadd docker
  3. Выйдите из системы и снова войдите, чтобы членство в группе было переоценено.

    При тестировании на виртуальной машине может потребоваться перезапуск виртуальной машины, чтобы изменения вступили в силу.

    В настольной среде Linux, такой как X Windows, полностью выйдите из сеанса, а затем снова войдите в систему.

    В Linux вы также можете выполнить следующую команду для активации изменений в группах:

    $ newgrp docker 
  4. Убедитесь, что вы можете запускать команды docker без sudo.
    $ docker run hello-world

    Эта команда загружает тестовый образ и запускает его в контейнере. Когда контейнер запускается, он печатает сообщение и выходит.

    Если вы изначально запускали команды Docker CLI с помощью sudo до добавления пользователя в группу docker, вы можете увидеть следующую ошибку, которая указывает на то, что каталог ~/.docker/ был создан с неправильными разрешениями из-за команд sudo.

    WARNING: Error loading config file: /home/user/.docker/config.json -
    stat /home/user/.docker/config.json: permission denied
    Чтобы решить эту проблему, либо удалите каталог ~/.docker/ (он будет создан автоматически, но все пользовательские настройки будут потеряны), либо измените его права и разрешения с помощью следующих команд:
     $ sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
    
     $ sudo chmod g+rwx "$HOME/.docker" -R

Настройка Docker для запуска при загрузке.

Большинство последних дистрибутивов Linux (RHEL, CentOS, Fedora, Debian, Ubuntu 16.04 и выше) используют systemd для управления тем, какие службы запускаются при загрузке системы. В Debian и Ubuntu служба Docker по умолчанию настроена на запуск при загрузке. Чтобы автоматически запустить Docker и Containerd при загрузке для других дистрибутивов, используйте следующие команды:

$ sudo systemctl enable docker.service

$ sudo systemctl enable containerd.service

Чтобы отключить это поведение, используйте вместо этого disable.

$ sudo systemctl disable docker.service

$ sudo systemctl disable containerd.service

Если необходимо добавить прокси-сервер HTTP, задать другой каталог или раздел для файлов среды выполнения Docker или выполнить другие настройки, см. раздел Настройка параметров демона Docker в системе.

Использование другого механизма хранения.

Информацию о различных механизмах хранения см. в разделе Драйверы хранения. Механизм хранения данных по умолчанию и список поддерживаемых механизмов хранения данных зависят от дистрибутива Linux вашего хоста и доступных драйверов ядра.

Настройка драйвера журнала по умолчанию.

Docker предоставляет возможность сбора и просмотра данных журнала из всех контейнеров, работающих на узле, через ряд драйверов журнала. Драйвер журнала по умолчанию, json-file, пишет данные журнала в JSON-форматированные файлы на файловой системе хоста. Со временем эти файлы журнала расширяются, что приводит к потенциальному истощению ресурсов диска.

Чтобы облегчить такие проблемы, либо настройте драйвер журнала json-file для включения вращения журнала, либо используйте альтернативный драйвер журнала , например, драйвер журнала "локальный", который выполняет ротацию журнала по умолчанию, либо используйте драйвер журнала, который отправляет журналы удаленному агрегатору.

Настройка того, где демон Docker слушает соединения.

По умолчанию, демон Docker слушает соединения на сокету UNIX для того, чтобы принимать запросы от локальных клиентов. Докер может принимать запросы удаленных хостов, настроив его на прослушивание IP-адреса и порта, а также сокет UNIX. Более подробную информацию о настройке можно найти в разделе "Привязать докер к другому хосту/порту или Unix-сокету" статьи Docker CLI Reference.

Защитите свое соединение.

Прежде чем настраивать Docker на прием соединений с удаленных узлов, крайне важно понять последствия открытия docker для сети с точки зрения безопасности. Если не предпринять меры по защите соединения, удаленные пользователи, не являющиеся root-пользователями, могут получить root-доступ на хосте. Для получения дополнительной информации о том, как использовать сертификаты TLS для защиты этого соединения, ознакомьтесь с этой статьей о том, как защитить сокет Docker.daemon.

Настройка Docker на прием удаленных соединений может быть выполнена с помощью файла docker.service systemd unit для дистрибутивов Linux, использующих systemd, таких как последние версии RedHat, CentOS, Ubuntu и SLES, или с помощью файла daemon.json, который рекомендуется для дистрибутивов Linux, не использующих systemd.

systemd против daemon.json

Настройка Docker для прослушивания соединений с использованием файла unit systemd и файла daemon.json вызывает конфликт, который препятствует запуску Docker.

Настройка удаленного доступа с помощью файла unit systemd.

  1. Используйте команду  sudo systemctl edit docker.service, чтобы открыть файл переопределения для docker.service в текстовом редакторе.

  2. Добавьте или измените следующие строки, подставив свои собственные значения.

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375

     

  3. Сохраните файл.
  4. Перезагрузите конфигурацию systemctl.
    $ sudo systemctl daemon-reload
  5. Перезапустите Docker.
    $ sudo systemctl restart docker.service
  6. Проверьте, было ли изменение выполнено, просмотрев вывод netstat, чтобы убедиться, что dockerd прослушивает настроенный порт.
    $ sudo netstat -lntp | grep dockerd
    
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    

Настройка удаленного доступа с помощью daemon.json.

  1. Установите массив hosts в файле /etc/docker/daemon.json для подключения к сокету UNIX и IP-адресу следующим образом:

    {
      "hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]
    }
  2. Перезапустите Docker.
  3. Проверьте, было ли изменение выполнено, просмотрев вывод netstat, чтобы убедиться, что dockerd прослушивает настроенный порт.
    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd

Включение IPv6 на демоне Docker.

Чтобы включить IPv6 на демоне Docker, см. раздел Включение поддержки IPv6..

Устранение неполадок.

Совместимость ядра.

Докер не может работать правильно, если ядро старше версии 3.10 или если у него отсутствуют некоторые модули. Для проверки совместимости ядра можно загрузить и запустить скрипт check-config.sh.

$ curl https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh > check-config.sh

$ bash ./check-config.sh

Скрипт работает только на Linux, а не macOS.

Cannot connect to the Docker daemon

Если вы видите ошибку, например, следующую, клиент Docker может быть настроен на подключение к демону Docker на другом узле, и этот хост может быть недоступен.

Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?

 

Чтобы увидеть, с какими узлами клиент настроен подключиться, проверьте значение переменной DOCKER_HOST в окружении.

$ env | grep DOCKER_HOST

Если эта команда возвращает значение, клиент Docker настроен на подключение к демону Docker, запущенному на этом хосте. Если это значение не установлено, клиент Docker будет подключаться к демону Docker, запущенному на локальном хосте. Если он установлен ошибочно, используйте следующую команду для его удаления:

$ unset DOCKER_HOST

Вам может потребоваться изменить свое окружение в таких файлах, как ~/.bashrc или ~/.profile, чтобы переменная DOCKER_HOST не устанавливалась ошибочно.

Если DOCKER_HOST установлен как положено, убедитесь, что демон Docker запущен на удаленном хосте и что брандмауэр или перебои в сети не мешают подключению.

Проблемы с переадресацией IP-адресов.

Если вы вручную настраиваете сеть с помощью systemd-network с systemd версии 219 или выше, контейнеры Docker могут не получить доступ к вашей сети. Начиная с версии systemd 220, параметр переадресации для данной сети (net.ipv4.conf.<interface>.forwarding) по умолчанию имеет значение off. Эта настройка предотвращает переадресацию IP-адресов. Это также противоречит поведению Docker по включению параметра net.ipv4.conf.all.forwarding в контейнерах.

Чтобы обойти эту проблему на RHEL, CentOS или Fedora, отредактируйте файл <interface>.network в /usr/lib/systemd/network/ на вашем хосте Docker (например: /usr/lib/systemd/network/80-container-host0.network) и добавьте следующий блок в раздел [Network].

[Network]
...
IPForward=kernel
# OR
IPForward=true

 

Эта конфигурация позволяет IP-переадресацию из контейнера, как и ожидалось.

Распознатель DNS, найденный в файле resolv.conf, и контейнеры не могут его использовать

В системах Linux, использующих графический интерфейс, часто работает сетевой менеджер, который использует экземпляр dnsmasq, работающий на шлейфовом адресе, таком как 127.0.0.1 или 127.0.1.1 для кэширования DNS-запросов, и добавляет эту запись в /etc/resolv.conf. Служба dnsmasq ускоряет поиск DNS, а также предоставляет услуги DHCP. Эта конфигурация не работает в контейнере Docker, который имеет собственное сетевое пространство имен, поскольку контейнер Docker разрешает адреса loopback, такие как 127.0.0.1, в себя, и очень маловероятно, что он запускает DNS-сервер на своем собственном адресе loopback.

Если Docker обнаруживает, что ни один из DNS-серверов, указанных в файле /etc/resolv.conf, не является полностью функциональным DNS-сервером, появляется следующее предупреждение, и Docker использует для разрешения DNS общедоступные DNS-серверы, предоставленные Google по адресам 8.8.8.8 и 8.8.4.4.

WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers
can't use it. Using default external servers : [8.8.8.8 8.8.4.4]

Если вы видите это предупреждение, сначала проверьте, используете ли вы dnsmasq:

$ ps aux |grep dnsmasq

Если вашему контейнеру необходимо разрешать хосты, которые находятся внутри вашей сети, публичные серверы имен не подходят. У вас есть два варианта:

  • Вы можете указать DNS-сервер, который будет использовать Docker, или
  • Вы можете отключить dnsmasq в NetworkManager. Если вы сделаете это, NetworkManager добавит ваш настоящий DNS-сервер имен в /etc/resolv.conf, но вы потеряете возможные преимущества dnsmasq.

Вам нужно использовать только один из этих методов.

Указание DNS-серверов для Docker.

По умолчанию файл конфигурации расположен в /etc/docker/daemon.json. Вы можете изменить расположение конфигурационного файла с помощью флага демона --config-file. В документации ниже предполагается, что файл конфигурации расположен по адресу /etc/docker/daemon.json.

  1. Создайте или отредактируйте файл конфигурации демона Docker, по умолчанию это файл /etc/docker/daemon.json, который управляет конфигурацией демона Docker.

    $ sudo nano /etc/docker/daemon.json
  2. Добавьте ключ dns с одним или несколькими IP-адресами в качестве значений. Если файл имеет существующее содержимое, вам нужно добавить или отредактировать только строку dns.
    {
      "dns": ["8.8.8.8", "8.8.4.4"]
    }

    Если ваш внутренний DNS-сервер не может разрешать общедоступные IP-адреса, включите хотя бы один DNS-сервер, который может это делать, чтобы вы могли подключиться к Docker Hub и чтобы ваши контейнеры могли разрешать имена интернет-доменов.

    Сохраните и закройте файл.

  3. Перезапустите демон Docker.
    $ sudo service docker restart
  4. Убедитесь, что Docker может разрешать внешние IP-адреса, попробовав извлечь образ:
    $ docker pull hello-world
  5. При необходимости проверьте, что контейнеры Docker могут разрешить внутреннее имя хоста путем пинга.
    $ docker run --rm -it alpine ping -c4 <my_internal_host>
    
    
    PING google.com (192.168.1.2): 56 data bytes
    64 bytes from 192.168.1.2: seq=0 ttl=41 time=7.597 ms
    64 bytes from 192.168.1.2: seq=1 ttl=41 time=7.635 ms
    64 bytes from 192.168.1.2: seq=2 ttl=41 time=7.660 ms
    64 bytes from 192.168.1.2: seq=3 ttl=41 time=7.677 ms
    

Отключение dnsmasq

Ubuntu

Если вы предпочитаете не менять конфигурацию демона Docker для использования определенного IP-адреса, следуйте этим инструкциям, чтобы отключить dnsmasq в NetworkManager.

  1. Отредактируйте файл /etc/NetworkManager/NetworkManager.conf.

  2. Закомментируйте строку dns=dnsmasq, добавив символ # в начало строки.

    # dns=dnsmasq
    Save and close the file.

     

  3. Перезапустите NetworkManager и Docker. В качестве альтернативы можно перезагрузить систему.
    $ sudo systemctl restart network-manager
    
    $ sudo systemctl restart docker
RHEL, CentOS, или Fedora

Чтобы отключить dnsmasq в RHEL, CentOS или Fedora:

  1. Отключите службу dnsmasq:

    $ sudo systemctl stop dnsmasq
    
    $ sudo systemctl disable dnsmasq

     

  2. Настройте DNS-серверы вручную, используя документацию Red Hat.

Разрешите доступ к удаленному API через брандмауэр.

Если вы используете брандмауэр на том же узле, где запущен Docker, и хотите получить доступ к Docker Remote API с другого узла, а удаленный доступ включен, вам необходимо настроить брандмауэр на разрешение входящих соединений на порт Docker, который по умолчанию равен 2376, если включен шифрованный транспорт TLS, или 2375 в противном случае.

Двумя распространенными демонами брандмауэра являются UFW (Uncomplicated Firewall) (часто используется для систем Ubuntu) и firewalld (часто используется для систем на базе RPM). Обратитесь к документации по вашей ОС и брандмауэру, но следующая информация может помочь вам начать работу. Эти опции достаточно свободны, и вы можете захотеть использовать другую конфигурацию, которая больше блокирует вашу систему.

  • UFW: Установите DEFAULT_FORWARD_POLICY="ACCEPT" в вашей конфигурации.

  • firewalld: Добавьте в свою политику правила, аналогичные следующим (одно для входящих запросов и одно для исходящих). Убедитесь в правильности имен интерфейсов и цепочек.

    <direct>
      [ <rule ipv="ipv6" table="filter" chain="FORWARD_direct" priority="0"> -i zt0 -j ACCEPT </rule> ]
      [ <rule ipv="ipv6" table="filter" chain="FORWARD_direct" priority="0"> -o zt0 -j ACCEPT </rule> ]
    </direct>
    
    

Ваше ядро не поддерживает возможности ограничения свопа cgroup

На хостах Ubuntu или Debian при работе с образом вы можете увидеть сообщения, похожие на следующие.

WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.

Это предупреждение не возникает на системах на базе RPM, которые включают эти возможности по умолчанию.

Если вам не нужны эти возможности, вы можете проигнорировать предупреждение. Вы можете включить эти возможности на Ubuntu или Debian, следуя этим инструкциям. Учет памяти и подкачки влечет за собой накладные расходы в размере около 1% от общего объема доступной памяти и снижение общей производительности на 10%, даже если Docker не запущен.

  1. Войдите на хост Ubuntu или Debian как пользователь с привилегиями sudo.

  2. Отредактируйте файл /etc/default/grub. Добавьте или отредактируйте строку GRUB_CMDLINE_LINUX, чтобы добавить следующие две пары ключ-значение:

    GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
    Сохраните и закройте файл.
  3. Обновите GRUB.
    $ sudo update-grub

    Если ваш файл конфигурации GRUB имеет неправильный синтаксис, возникает ошибка. В этом случае повторите шаги 2 и 3.

    Изменения вступают в силу после перезагрузки системы.

Следующие шаги

  • Ознакомьтесь с учебными модулями Начало работы , чтобы узнать, как создать образ и запустить его как контейнерное приложение.
  • Просмотрите темы раздела Разработка с помощью Docker, чтобы узнать, как создавать новые приложения с помощью Docker.