Difference between revisions of "Docker (Русский)"

From ArchWiki
Jump to navigation Jump to search
(Started to synchronize Docker article, translation of Installation chapter. English Revision 561761)
(flagged broken section links (interactive))
Tag: wiki-scripts
 
(44 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
[[Category:Virtualization (Русский)]]
 
[[Category:Virtualization (Русский)]]
 +
[[Category:Sandboxing (Русский)]]
 
[[Category:Русский]]
 
[[Category:Русский]]
 
[[en:Docker]]
 
[[en:Docker]]
Line 8: Line 9:
 
{{Related|systemd-nspawn}}
 
{{Related|systemd-nspawn}}
 
{{Related|Linux Containers}}
 
{{Related|Linux Containers}}
{{Related|Lxc-systemd}}
 
 
{{Related|Vagrant}}
 
{{Related|Vagrant}}
 
{{Related articles end}}
 
{{Related articles end}}
 
{{Unmaintained (Русский)}}
 
{{Unmaintained (Русский)}}
  
[http://www.docker.io Docker] — это утилита для упаковки, загрузки и запуска любых приложений через легковесный контейнер.
+
[[Wikipedia:ru:Docker|Docker]] — утилита для упаковки, загрузки и запуска любых приложений в легковесных контейнерах.
  
 
== Установка ==
 
== Установка ==
  
[[Установите]] {{Pkg|docker}}, доступный в [[Official repositories (Русский)|официальных репозиториях]]. Для i686 установите {{Aur|docker-git}} из [[AUR (Русский)|AUR]]. Затем [[включите]] и [[запустите]] службу {{ic|docker.service}} и проверьте ее работу:
+
[[Установите]] пакет {{Pkg|docker}} или {{Aur|docker-git}}, версию для разработки. Затем [[включите]] и [[запустите]] службу {{ic|docker.service}} и проверьте ее работу:
  
 
   # docker info
 
   # docker info
  
Обратите внимание, что запуск службы Docker может завершиться сбоем, если у вас есть активное VPN-соединение из-за конфликтов IP между VPN и сетевым мостом и оверлейной сетью Docker. Если это так, попробуйте отключить VPN перед запуском службы Docker. Вы можете переподключить VPN сразу после этого. [https://stackoverflow.com/questions/45692255/how-make-openvpn-work-with-docker Вы также можете попытаться разрешить конфликт сетей.]
+
Обратите внимание, что запуск службы Docker может завершиться сбоем, если имеется активное VPN-соединение. Это происходит из-за IP-конфликтов между сетевыми мостами и оверлейными сетями VPN и Docker. Если это так, попробуйте отключить VPN перед запуском службы Docker. Вы можете переподключить VPN сразу после этого. [https://stackoverflow.com/questions/45692255/how-make-openvpn-work-with-docker Вы также можете попытаться разрешить конфликт сетей.]
  
Если вы хотите иметь возможность запускать docker как обычный пользователь, добавьте его в {{ic|docker}} [[user group]] и перелогиньтесь:
+
Если требуется запуск Docker от имени обычного пользователя, добавьте его в [[Users and groups (Русский)#Управление группами|группу пользователей]] {{ic|docker}}:
  
 
  # gpasswd -a ''user'' docker
 
  # gpasswd -a ''user'' docker
  
{{Warning (Русский)|Любой, кто добавлен в группу {{ic|docker}}, имеет права, эквивалентные правам суперпользователя. Больше информации [https://github.com/docker/docker/issues/9976 здесь] и [https://docs.docker.com/engine/security/security/ здесь].}}
+
{{Warning (Русский)|Каждый пользователь в группе {{ic|docker}} имеет права, равноценные правам суперпользователя. Больше информации [https://github.com/docker/docker/issues/9976 здесь] и [https://docs.docker.com/engine/security/security/ здесь].}}
  
{{Note (Русский)|По состоянию на {{Pkg|linux}} 4.15.0-1 ''vsyscalls'', которые требуются определенными программами в контейнерах (такими как ''apt-get''), по умолчанию отключены в конфигурации ядра. Чтобы включить их снова, добавьте{{ic|1=vsyscall=emulate}} [[kernel parameter]]. Больше информации в {{bug|57336}}.}}
+
== Настройка ==
 +
 
 +
=== Драйвер хранения ===
 +
 
 +
Драйвер хранения Docker (storage driver или graph driver) значительно влияет на производительность. Его задача — эффективно хранить слои образов контейнеров, то есть когда несколько образов совместно используют слой, только один слой использует дисковое пространство. Совместимая опция `devicemapper` предлагает неоптимальную производительность, которая просто ужасна на вращающихся дисках. Кроме того, `devicemapper` не рекомендуется использовать в промышленной среде.
 +
 
 +
Поскольку Arch Linux поставляется с новыми ядрами Linux, нет смысла использовать опцию совместимости. Хороший, современный выбор — {{ic|overlay2}}.
 +
 
 +
Выполните {{ic|# docker info {{!}} grep -i storage}}, чтобы увидеть текущий драйвер хранилища. Новые установки Docker уже должны использовать {{ic|overlay2}} по умолчанию.
 +
 
 +
Отредактируйте файл {{ic|/etc/docker/daemon.json}} (создайте его, если он не существует), чтобы изменить драйвер хранения:
 +
{{hc|/etc/docker/daemon.json|2=
 +
{
 +
  "storage-driver": "overlay2"
 +
}
 +
 
 +
}}
 +
 
 +
После чего [[перезапустите]] Docker.
 +
 
 +
Дополнительную информацию о доступных опциях можно найти в [https://docs.docker.com/engine/userguide/storagedriver/selectadriver/ руководстве пользователя]. Также см. [https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file документацию dockerd] для получения информации о параметрах {{ic|daemon.json}}.
 +
 
 +
=== Remote API ===
 +
 
 +
Используйте следующую команду, чтобы вручную открыть порт {{ic|4243}} для Remote API:
 +
 
 +
# /usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock
 +
 
 +
{{ic|-H tcp://0.0.0.0:4243}} — часть для открытия Remote API.
 +
 
 +
{{ic|-H unix:///var/run/docker.sock}} — часть для доступа к хост-машине через терминал.
 +
 
 +
==== Remote API с systemd ====
 +
 
 +
Чтобы запустить Remote API с помощью демона Docker, создайте [[Drop-in сниппет]] со следующим содержимым:
 +
 
 +
{{hc|/etc/systemd/system/docker.service.d/override.conf|2=
 +
[Service]
 +
ExecStart=
 +
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock
 +
}}
 +
 
 +
=== Конфигурация сокета демона ===
 +
 
 +
Демон ''docker'' по умолчанию прослушивает [[Wikipedia:ru:Сокет домена Unix|Unix-сокет]]. Чтобы прослушивать определённый порт, создайте [[Drop-in сниппет]] со следующим содержимым:
 +
 
 +
{{hc|/etc/systemd/system/docker.socket.d/socket.conf|2=
 +
[Socket]
 +
ListenStream=0.0.0.0:2375
 +
}}
 +
 
 +
=== Прокси ===
 +
 
 +
==== Конфигурация прокси ====
 +
 
 +
Создайте [[Drop-in сниппет]] со следующим содержанием:
 +
 
 +
{{hc|/etc/systemd/system/docker.service.d/proxy.conf|2=
 +
[Service]
 +
Environment="HTTP_PROXY=192.168.1.1:8080"
 +
Environment="HTTPS_PROXY=192.168.1.1:8080"
 +
}}
 +
 
 +
{{Note (Русский)|Предполагается, что прокси-сервер имеет адрес {{ic|192.168.1.1}}, не используйте {{ic|127.0.0.1}}.}}
 +
 
 +
Убедитесь, что конфигурация была загружена:
 +
 
 +
{{hc|# systemctl show docker --property Environment|2=
 +
Environment=HTTP_PROXY=192.168.1.1:8080 HTTPS_PROXY=192.168.1.1:8080
 +
}}
 +
 
 +
==== Конфигурация контейнера ====
  
== Настройка ==
+
Настройки в файле {{ic|docker.service}} не применяются к контейнерам. Для этого необходимо задать переменные {{ic|ENV}} в {{ic|Dockerfile}} следующим образом:
 +
 
 +
FROM archlinux/base
 +
ENV http_proxy="<nowiki>http://192.168.1.1:3128</nowiki>"
 +
ENV https_proxy="<nowiki>https://192.168.1.1:3128</nowiki>"
 +
 
 +
[https://docs.docker.com/engine/reference/builder/#env Docker] предоставляет подробную информацию о конфигурации с помощью {{ic|ENV}} в Dockerfile.
 +
 
 +
=== Конфигурация DNS ===
 +
По умолчанию docker создаёт {{ic|resolv.conf}} в контейнере с {{ic|/etc/resolv.conf}} на хост-машине, отфильтровывая локальные адреса (например, {{ic|127.0.0.1}}).  Если это приводит к пустому файлу, тогда используются  [https://developers.google.com/speed/public-dns/ Google DNS серверы]. Если вы используете службу типа [[dnsmasq]] для предоставления разрешения имен, вам может потребоваться добавить запись в {{ic|/etc/resolv.conf}} для сетевого интерфейса докера, чтобы она не отфильтровывалась.
  
{{Translateme (Русский)|Не похоже, что http_proxy работает.}}
+
=== Запуск Docker с сетью, заданной вручную, в systemd-networkd ===
  
Отредактируйте {{ic|/etc/systemd/system/docker.service}}, где {{ic|http_proxy}} — ваш прокси сервер, {{ic|-g <path>}} — директория docker (по умолчанию {{ic|/var/cache/docker}}).
+
Если вы вручную конфигурируете свою сеть, используя [[systemd-networkd]] версии '''220 или выше''', контейнеры, которые вы запускаете с помощью Docker, могут не иметь доступа к вашей сети.
 +
Начиная с версии 220, параметр переадресации для данной сети ({{ic|net.ipv4.conf.<Interface>.forwarding}}) по умолчанию равен {{ic|off}}. Этот параметр запрещает переадресацию IP. Он также конфликтует с Docker, который включает параметр {{ic|net.ipv4.conf.all.forwarding}} внутри контейнера.
  
[Service]
+
Обходной путь — отредактировать файл {{ic|<interface>.network}} в {{ic|/etc/systemd/network/}}, добавив {{ic|1=IPForward=kernel}} на хосте Docker:
Environment="http_proxy=192.168.1.1:3128"
 
ExecStart=
 
ExecStart=/usr/bin/docker -d -g /var/yourDockerDir
 
  
{{Note (Русский)|Предполагается, что адрес используемого прокси-сервера {{ic|192.168.1.1}}; не используйте {{ic|127.0.0.1}}.}}
+
{{hc|/etc/systemd/network/<interface>.network|2=
 +
[Network]
 +
...
 +
IPForward=kernel
 +
...}}
  
По умолчанию, демон docker принимает запросы на [[Wikipedia:ru:Unix domain socket|доменном сокете Unix]]. Если вы хотите, чтобы запросы принимались на сетевом порту, отредактируйте {{ic|/etc/systemd/system/docker.socket}}, где {{ic|ListenStream}} — сетевой адрес сокета:
+
Эта конфигурация разрешает переадресацию IP из контейнера, как и ожидалось.
  
[Socket]
+
=== Расположение образов ===
ListenStream=0.0.0.0:2375
 
  
== Docker 0.9.0 — 1.2.x и LXC ==
+
По умолчанию Docker образы расположены в {{ic|/var/lib/docker}}. Они могут быть перемещены в другие разделы.
 +
Во-первых, [[остановите]] {{ic|docker.service}}.
  
Начиная с версии 0.9.0, Docker предоставляет новый способ запуска контейнеров без необходимости в LXC, называемый ''libcontainer''.
+
Если вы запустили Docker образы, вам необходимо убедиться, что они полностью размонтированы. После этого вы можете переместить изображения из {{ic|/var/lib/docker}} в целевой путь.
  
LXC может быть удален в ближайшем будущем, однако таким образом вы не сможете использовать {{ic|lxc-attach}} с контейнерами, управляемыми Docker 0.9.0+ по умолчанию ([https://github.com/docker/docker/pull/5797 запрос 5797]). Для этого потребуется запускать службу Docker с параметром {{ic|-e lxc}}.
+
Затем добавьте [[Drop-in сниппет]] для {{ic|docker.service}}, добавив параметр {{ic|--data-root}} в {{ic|ExecStart}}:
  
Вы можете создать файл с именем {{ic|lxc.conf}} в {{ic|/etc/systemd/system/docker.service.d/}} со следующим содержимым:
+
{{hc|/etc/systemd/system/docker.service.d/docker-storage.conf|2=
 +
[Service]
 +
ExecStart=
 +
ExecStart=/usr/bin/dockerd --data-root=''/path/to/new/location/docker'' -H fd://}}
  
  [Service]
+
=== Небезопасные реестры ===
ExecStart=
 
ExecStart=/usr/bin/docker -d -e lxc
 
  
== Skype ==
+
Если вы решите использовать самозаверенный сертификат для своего личного реестра, Docker откажется использовать его, пока вы не заявите, что доверяете ему.
 +
Добавьте  [[Drop-in snippet]] для {{ic|docker.service}}, добавив {{ic|--insecure-registry}} параметр в {{ic|dockerd}}:
 +
{{hc|/etc/systemd/system/docker.service.d/override.conf|2=
 +
[Service]
 +
ExecStart=
 +
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry my.registry.name:5000
 +
}}
  
Смотрите [[Skype#Docker]]{{Broken section link}}.
+
== Образы ==
  
== Сборка образа i686 ==
+
=== Arch Linux ===
Для архитектуры i686, мы '''не''' можем использовать образ x86_64, полученный с помощью следующей команды:
 
  
# docker pull base/archlinux
+
Следующая команда выгружает [https://hub.docker.com/r/archlinux/base/ archlinux/base] x86_64 образ. Это урезанная версия ядра Arch без сети и т.д.
  
=== Образ ArchLinux ===
+
# docker pull archlinux/base
  
Вместо этого, посетите [https://registry.hub.docker.com/u/base/archlinux/ реестр base/archlinux] и перейдите по ссылке {{ic|mkimage-arch.sh}} для скачивания {{ic|mkimage-arch.sh}} и {{ic|mkimage-arch-pacman.conf}}. Затем сделайте скрипт исполняемым:
+
Смотрите также [https://github.com/archlinux/archlinux-docker/blob/master/README.md README.md].
  
$ chmod +x mkimage-arch.sh
+
Для полноценного образа Arch, клонируйте репозиторий и создайте свой собственный образ.
  
и выполните следущее:
+
$ git clone https://github.com/archlinux/archlinux-docker.git
  
# LC_ALL=C ./mkimage-arch.sh # LC_ALL=C потому что скрипт парсит вывод консоли
+
Отредактируйте файл {{ic|packages}} так, чтобы он содержал только «base». Затем запустите:
  
Скрипт проверит наличие необходимых утилит. В случае их отсутствия будет предложено их установить.
+
# make docker-image
  
$ docker run -t -i --rm archlinux /bin/bash # для запуска
+
=== Debian ===
  
Для медленных сетевых подключений и/или на слабых машинах можно увеличить тайм-аут сборки:
+
Следующая команда выгружает [https://hub.docker.com/r/_/debian/ debian] x86_64 образ.
  
  $ sed -i 's/timeout 60/timeout 120/' mkimage-arch.sh
+
  # docker pull debian
  
=== Образ Debian ===
+
==== Создание образа вручную ====
  
Собрать образ Debian можно с помощью {{Pkg|debootstrap}} из [[AUR (Русский)|AUR]]:
+
Создайте образ Debian с {{Pkg|debootstrap}}:
  
  $ mkdir wheezy-chroot
+
  # mkdir jessie-chroot
  # debootstrap wheezy ./wheezy-chroot http://http.debian.net/debian/
+
  # debootstrap jessie ./jessie-chroot http://http.debian.net/debian/
  $ cd wheezy-chroot
+
  # cd jessie-chroot
 
  # tar cpf - . | docker import - debian
 
  # tar cpf - . | docker import - debian
  $ docker run -t -i --rm debian /bin/bash
+
  # docker run -t -i --rm debian /bin/bash
 +
 
 +
== Удаление Docker и образов ==
 +
 
 +
Если вы хотите полностью удалить Docker, вам следует выполнить следующие шаги:
 +
 
 +
{{Note (Русский)|Не копируйте бездумно эти команды, не убедившись, что вы знаете, что делаете.}}
 +
 
 +
Выдать список работающих контейнеров:
 +
 
 +
# docker ps
 +
 
 +
Выдать список всех контейнеров, запущенных на хосте для удаления:
 +
 
 +
# docker ps -a
 +
 
 +
Остановить работающий контейнер:
 +
 
 +
# docker stop <CONTAINER ID>
 +
 
 +
Выполнить команду kill для всё ещё работающих контейнеров:
 +
 
 +
# docker kill <CONTAINER ID>
 +
 
 +
Удалить все контейнеры, перечисленные по ID:
 +
 
 +
# docker rm <CONTAINER ID>
 +
 
 +
Выдать список всех образов Docker:
 +
 
 +
# docker images
 +
 
 +
Удалить все образы Docker по ID:
 +
 
 +
# docker rmi <IMAGE ID>
 +
 
 +
Удалить все данные Docker (очистить каталог):
 +
 
 +
{{Accuracy |После команды # rm -R /var/lib/docker останутся тома btrfs удалённых контейнеров}}
 +
 
 +
# rm -R /var/lib/docker
 +
 
 +
== Полезные советы ==
 +
 
 +
Чтобы получить IP адрес контейнера, выполните:
 +
 
 +
{{hc|<nowiki>$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container-name OR id> </nowiki>|
 +
172.17.0.37}}
 +
 
 +
Для каждого работающего контейнера имя и соответствующий IP-адрес могут быть перечислены для использования в {{ic|/etc/hosts}}:
 +
 
 +
{{bc|#!/usr/bin/env sh
 +
<nowiki>for ID in $(docker ps -q | awk '{print $1}'); do
 +
    IP=$(docker inspect --format="{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" "$ID")
 +
    NAME=$(docker ps | grep "$ID" | awk '{print $NF}')
 +
    printf "%s %s\n" "$IP" "$NAME"
 +
done</nowiki>}}
 +
 
 +
== Запуск Docker-контейнеров с ускорением на графических процессорах NVIDIA  ==
 +
 
 +
{{Translateme (Русский)|Необходимо закончить перевод данного раздела.}}
 +
 
 +
=== С помощью NVIDIA Container Toolkit (рекомендовано) ===
 +
 
 +
Начиная с версии 19.03, графические процессоры NVIDIA поддерживаются в качестве устройств Docker. [https://github.com/NVIDIA/nvidia-docker NVIDIA Container Toolkit] является рекомендованным способом запуска контейнеров, использующих графические процессоры NVIDIA.
 +
 
 +
Установите пакет {{aur|nvidia-container-toolkit}}. Далее, перезапустите [[restart]] docker. Теперь вы можете запускать контейнеры Docker, использующие графические процессоры NVIDIA, с помощью параметра {{ic|--gpus}}:
 +
 
 +
# docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
 +
 
 +
Укажите, сколько графических процессоров разрешено в контейнере:
 +
 
 +
# docker run --gpus 2 nvidia/cuda:9.0-base nvidia-smi
 +
 
 +
Укажите, какие GPU следует использовать:
 +
 
 +
# docker run --gpus '"device=1,2"' nvidia/cuda:9.0-base nvidia-smi
 +
 
 +
или
 +
 
 +
# docker run --gpus '"device=UUID-ABCDEF,1"' nvidia/cuda:9.0-base nvidia-smi
 +
 
 +
Укажите capability (graphics, compute, ...) для контейнера (хотя это редко, если вообще когда либо используется таким образом):
 +
 
 +
# docker run --gpus all,capabilities=utility nvidia/cuda:9.0-base nvidia-smi
 +
 
 +
Для получения дополнительной информации читайте тут [https://github.com/NVIDIA/nvidia-docker/blob/master/README.md README.md] и тут [https://github.com/NVIDIA/nvidia-docker/wiki Wiki].
 +
 
 +
=== С помощью NVIDIA Container Runtime ===
 +
 
 +
Установите пакет {{aur|nvidia-container-runtime}}. Затем, внесите библиотеку среды выполнения NVIDIA, внеся следующее в конфигурационный файл {{ic|/etc/docker/daemon.json}}
 +
 
 +
{{hc|/etc/docker/daemon.json|2=
 +
{
 +
  "runtimes": {
 +
    "nvidia": {
 +
      "path": "/usr/bin/nvidia-container-runtime",
 +
      "runtimeArgs": []
 +
    }
 +
  }
 +
}
 +
}}
 +
 
 +
и перезапустите [[restart]] docker.
 +
 
 +
Библиотека среды выполнения также может быть добавлена к ''dockerd'' как параметр командной строки:
 +
 
 +
# /usr/bin/dockerd --add-runtime=nvidia=/usr/bin/nvidia-container-runtime
 +
 
 +
После этого контейнеры с ускорением на графических процессорах могут быть запущены с помощью команды:
 +
 
 +
# docker run --runtime=nvidia nvidia/cuda:9.0-base nvidia-smi
 +
 
 +
или (требуется  Docker версии 19.03 или выше):
 +
 
 +
# docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
 +
 
 +
Читайте также [https://github.com/NVIDIA/nvidia-container-runtime/blob/master/README.md README.md].
 +
 
 +
=== С помощью nvidia-docker (устарело) ===
 +
 
 +
[https://nvidia.github.io/nvidia-docker/ nvidia-docker] is a wrapper around NVIDIA Container Runtime which registers the NVIDIA runtime by default and provides the ''nvidia-docker'' command.
 +
 
 +
To use nvidia-docker, install the {{aur|nvidia-docker}} package and then [[restart]] docker. Containers with NVIDIA GPU support can then be run using any of the following methods:
 +
 
 +
# docker run --runtime=nvidia nvidia/cuda:9.0-base nvidia-smi
 +
 
 +
# nvidia-docker run nvidia/cuda:9.0-base nvidia-smi
 +
 
 +
or (required Docker version 19.03 or higher)
 +
 
 +
# docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
 +
 
 +
{{Note|nvidia-docker is a legacy method for running NVIDIA GPU accelerated containers used prior to Docker 19.03 and has been deprecated. If you are using Docker version 19.03 or higher, it is recommended to use [[#With NVIDIA Container Toolkit (recommended)|NVIDIA Container Toolkit]]{{Broken section link}} instead.}}
 +
 
 +
== Устранение неполадок ==
 +
 
 +
=== docker0 Bridge не получает IP адреса/нет доступа к Интернету в контейнерах ===
 +
 
 +
Docker сам включает переадресацию IP, но по умолчанию [[systemd-networkd]] переопределяет соответствующую настройку sysctl. Установите {{ic|1=IPForward=yes}} в настройках сети. Подробнее читайте в [[Internet sharing#Enable packet forwarding]].
 +
 
 +
{{Note (Русский)|Вам может понадобится выполнить [[restart]] {{ic|docker.service}} каждый раз, когда Вы выполняете [[restart]] {{ic|systemd-networkd.service}} или {{ic|iptables.service}}}}
 +
 
 +
=== Слишком низкое значение количества процессов/потоков по умолчанию  ===
 +
 
 +
Если вы столкнетесь с сообщениями об ошибках, похожими на следующие:
 +
 
 +
# e.g. Java
 +
java.lang.OutOfMemoryError: unable to create new native thread
 +
# e.g. C, bash, ...
 +
fork failed: Resource temporarily unavailable
 +
 
 +
тогда вам может потребоваться настроить количество процессов, разрешенных systemd. Значени по умолчанию 500 (смотрите {{ic|system.conf}}), что довольно мало для запуска нескольких Docker контейнеров. [[Edit]] {{ic|docker.service}} со следующим фрагментом:
 +
 
 +
{{hc|# systemctl edit docker.service|2=
 +
[Service]
 +
TasksMax=infinity
 +
}}
 +
 
 +
=== Ошибка инициализации графического драйвера: devmapper ===
 +
 
 +
Если ''systemctl'' не запускает Docker и выдает ошибку::
 +
 
 +
Error starting daemon: error initializing graphdriver: devmapper: Device docker-8:2-915035-pool is not a thin pool
 +
 
 +
Попробуйте выполнить следующие действия, чтобы устранить ошибку. Остановите службу, сделайте резервную копию {{ic|/var/lib/docker/}} (если это необходимо), удалите содержимое {{ic|/var/lib/docker/}}, и попробуйте запустить службу. Смотрите  [https://github.com/docker/docker/issues/21304 описание проблемы на GitHub] для более детальной информации.
 +
 
 +
=== Failed to create some/path/to/file: No space left on device ===
 +
 
 +
Если вы получаете сообщение об ошибке, подобное этому:
 +
 
 +
ERROR: Failed to create some/path/to/file: No space left on device
 +
 
 +
При создании или исполнении Docker образа, даже если у вас достаточно свободного места на диске, убедитесь, что:
 +
 
 +
* [[Tmpfs]] отключен или имеет достаточно памяти. Docker может пытаться записать файлы в {{ic|/tmp}} но терпит неудачу из-за ограничений в использовании памяти, а не дискового пространства.
 +
* Если вы используете [[XFS]], Вы можете удалить опцию  монтирования {{ic|noquota}} из соответствующих записей в {{ic|/etc/fstab}} (обычно, где находятся {{ic|/tmp}} и/или {{ic|/var/lib/docker}}). Для получения дополнительной информации обратитесь к [[Disk quota]], особенно, если вы планируете использовать и изменить размер {{ic|overlay2}} Docker хранилища.
 +
* Варианты установки монтирования квоты XFS ({{ic|uquota}}, {{ic|gquota}}, {{ic|prjquota}}, и т.д.) выдают ошибку при перемонтировании файловой системы.
 +
Чтобы включить квоту для корневой файловой системы, параметр монтирования должен быть передан  как [[kernel parameter]] {{ic|1=rootflags=}}. Впоследствии его не следует указывать среди параметров монтирования в {{ic|/etc/fstab}} для корневой файловой системы ({{ic|/}}).
 +
 
 +
{{Note (Русский)|Есть некоторые отличия XFS Quota по сравнению со стандартом Linux [[Disk quota]], [http://inai.de/linux/adm_quota] рекомендуется к прочтению.}}
 +
 
 +
=== Неверная ссылка между устройствами в ядре 4.19.1 ===
 +
 
 +
Если команды типа '' dpkg '' не запускаются в Docker, например:
 +
 
 +
dpkg: error: error creating new backup file '/var/lib/dpkg/status-old': Invalid cross-device link
 +
 
 +
Либо добавьте {{ic|1=overlay.metacopy=N}} [[kernel parameter]] или поставьте версию 4.18.x, в которой [https://github.com/docker/for-linux/issues/480 эта проблема ] решена. Больше информации в [https://bbs.archlinux.org/viewtopic.php?id=241866 Arch forum].
 +
 
 +
=== Отсутствие CPUACCT в docker с Linux-ck ===
 +
 
 +
В новых версиях [[Linux-ck (Русский)]] ([https://aur.archlinux.org/packages/linux-ck#comment-677316 замечено] в версиях 4.19 и 4.20), было сделано изменение в MuQSS, отключающее опцию {{ic|CONFIG_CGROUP_CPUACCT}} в ядре, что вызывает следующую ошибку при использовании некоторых команд docker ({{ic|run}} или {{ic|build}}):
 +
 
 +
{{hc|$ docker run --rm hello-world|docker: Error response from daemon: unable to find "cpuacct" in controller set: unknown.}}
 +
 
 +
Похоже, что эта ошибка не влияет на демон docker, а только на контейнеры. См. раздел [[Linux-ck#CPUACCT missing in docker]]{{Broken section link}} для получения более подробной информации.
 +
 
 +
=== Docker-machine не может создать виртуальные машины с драйвером virtualbox ===
 +
 
 +
Если docker-machine не может создать виртуальные машины с драйвером virtualbox и отображает следующую ошибку:
 +
 
 +
VBoxManage: error: VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory
 +
 
 +
Перезагрузите virtualbox из командной строки с помощью команды {{ic|vboxreload}}.
 +
 
 +
== Docker 0.9.0 — 1.2.x и LXC ==
 +
 
 +
Начиная с версии 0.9.0, Docker предоставляет новый способ запуска контейнеров без необходимости в LXC, называемый ''libcontainer''.
 +
 
 +
LXC может быть удален в ближайшем будущем, однако таким образом вы не сможете использовать {{ic|lxc-attach}} с контейнерами, управляемыми Docker 0.9.0+ по умолчанию ([https://github.com/docker/docker/pull/5797 запрос 5797]). Для этого потребуется запускать службу Docker с параметром {{ic|-e lxc}}.
 +
 
 +
Вы можете создать файл с именем {{ic|lxc.conf}} в {{ic|/etc/systemd/system/docker.service.d/}} со следующим содержимым:
 +
 
 +
[Service]
 +
ExecStart=
 +
ExecStart=/usr/bin/docker -d -e lxc
  
 
== Смотрите также ==
 
== Смотрите также ==
  
* [https://docs.docker.com/installation/archlinux/ Arch Linux на docs.docker.com]
+
* [https://www.docker.com Официальный сайт]
* [https://linuxhint.com/arch-linux-docker-tutorial/ Arch Linux Docker Tutorial на linuxhint.com]
+
* [https://docs.docker.com/engine/installation/linux/archlinux/ Arch Linux на docs.docker.com]
 +
* [https://opensource.com/business/14/7/docker-security-selinux Are Docker containers really secure?] — opensource.com
 +
* [https://awesome-docker.netlify.com/ Awesome Docker]

Latest revision as of 22:22, 8 December 2019

Tango-preferences-desktop-locale.pngЭта страница нуждается в сопроводителеTango-preferences-desktop-locale.png

Статья не гарантирует актуальность информации. Помогите русскоязычному сообществу поддержкой подобных страниц. См. Команда переводчиков ArchWiki

Docker — утилита для упаковки, загрузки и запуска любых приложений в легковесных контейнерах.

Contents

Установка

Установите пакет docker или docker-gitAUR, версию для разработки. Затем включите и запустите службу docker.service и проверьте ее работу:

 # docker info

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

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

# gpasswd -a user docker
Важно: Каждый пользователь в группе docker имеет права, равноценные правам суперпользователя. Больше информации здесь и здесь.

Настройка

Драйвер хранения

Драйвер хранения Docker (storage driver или graph driver) значительно влияет на производительность. Его задача — эффективно хранить слои образов контейнеров, то есть когда несколько образов совместно используют слой, только один слой использует дисковое пространство. Совместимая опция `devicemapper` предлагает неоптимальную производительность, которая просто ужасна на вращающихся дисках. Кроме того, `devicemapper` не рекомендуется использовать в промышленной среде.

Поскольку Arch Linux поставляется с новыми ядрами Linux, нет смысла использовать опцию совместимости. Хороший, современный выбор — overlay2.

Выполните # docker info | grep -i storage, чтобы увидеть текущий драйвер хранилища. Новые установки Docker уже должны использовать overlay2 по умолчанию.

Отредактируйте файл /etc/docker/daemon.json (создайте его, если он не существует), чтобы изменить драйвер хранения:

/etc/docker/daemon.json
{
  "storage-driver": "overlay2"
}

После чего перезапустите Docker.

Дополнительную информацию о доступных опциях можно найти в руководстве пользователя. Также см. документацию dockerd для получения информации о параметрах daemon.json.

Remote API

Используйте следующую команду, чтобы вручную открыть порт 4243 для Remote API:

# /usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock

-H tcp://0.0.0.0:4243 — часть для открытия Remote API.

-H unix:///var/run/docker.sock — часть для доступа к хост-машине через терминал.

Remote API с systemd

Чтобы запустить Remote API с помощью демона Docker, создайте Drop-in сниппет со следующим содержимым:

/etc/systemd/system/docker.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock

Конфигурация сокета демона

Демон docker по умолчанию прослушивает Unix-сокет. Чтобы прослушивать определённый порт, создайте Drop-in сниппет со следующим содержимым:

/etc/systemd/system/docker.socket.d/socket.conf
[Socket]
ListenStream=0.0.0.0:2375

Прокси

Конфигурация прокси

Создайте Drop-in сниппет со следующим содержанием:

/etc/systemd/system/docker.service.d/proxy.conf
[Service]
Environment="HTTP_PROXY=192.168.1.1:8080"
Environment="HTTPS_PROXY=192.168.1.1:8080"
Примечание: Предполагается, что прокси-сервер имеет адрес 192.168.1.1, не используйте 127.0.0.1.

Убедитесь, что конфигурация была загружена:

# systemctl show docker --property Environment
Environment=HTTP_PROXY=192.168.1.1:8080 HTTPS_PROXY=192.168.1.1:8080

Конфигурация контейнера

Настройки в файле docker.service не применяются к контейнерам. Для этого необходимо задать переменные ENV в Dockerfile следующим образом:

FROM archlinux/base
ENV http_proxy="http://192.168.1.1:3128"
ENV https_proxy="https://192.168.1.1:3128"

Docker предоставляет подробную информацию о конфигурации с помощью ENV в Dockerfile.

Конфигурация DNS

По умолчанию docker создаёт resolv.conf в контейнере с /etc/resolv.conf на хост-машине, отфильтровывая локальные адреса (например, 127.0.0.1). Если это приводит к пустому файлу, тогда используются Google DNS серверы. Если вы используете службу типа dnsmasq для предоставления разрешения имен, вам может потребоваться добавить запись в /etc/resolv.conf для сетевого интерфейса докера, чтобы она не отфильтровывалась.

Запуск Docker с сетью, заданной вручную, в systemd-networkd

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

Обходной путь — отредактировать файл <interface>.network в /etc/systemd/network/, добавив IPForward=kernel на хосте Docker:

/etc/systemd/network/<interface>.network
[Network]
...
IPForward=kernel
...

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

Расположение образов

По умолчанию Docker образы расположены в /var/lib/docker. Они могут быть перемещены в другие разделы. Во-первых, остановите docker.service.

Если вы запустили Docker образы, вам необходимо убедиться, что они полностью размонтированы. После этого вы можете переместить изображения из /var/lib/docker в целевой путь.

Затем добавьте Drop-in сниппет для docker.service, добавив параметр --data-root в ExecStart:

/etc/systemd/system/docker.service.d/docker-storage.conf
[Service]
ExecStart= 
ExecStart=/usr/bin/dockerd --data-root=/path/to/new/location/docker -H fd://

Небезопасные реестры

Если вы решите использовать самозаверенный сертификат для своего личного реестра, Docker откажется использовать его, пока вы не заявите, что доверяете ему. Добавьте Drop-in snippet для docker.service, добавив --insecure-registry параметр в dockerd:

/etc/systemd/system/docker.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry my.registry.name:5000

Образы

Arch Linux

Следующая команда выгружает archlinux/base x86_64 образ. Это урезанная версия ядра Arch без сети и т.д.

# docker pull archlinux/base

Смотрите также README.md.

Для полноценного образа Arch, клонируйте репозиторий и создайте свой собственный образ.

$ git clone https://github.com/archlinux/archlinux-docker.git

Отредактируйте файл packages так, чтобы он содержал только «base». Затем запустите:

# make docker-image

Debian

Следующая команда выгружает debian x86_64 образ.

# docker pull debian

Создание образа вручную

Создайте образ Debian с debootstrap:

# mkdir jessie-chroot
# debootstrap jessie ./jessie-chroot http://http.debian.net/debian/
# cd jessie-chroot
# tar cpf - . | docker import - debian
# docker run -t -i --rm debian /bin/bash

Удаление Docker и образов

Если вы хотите полностью удалить Docker, вам следует выполнить следующие шаги:

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

Выдать список работающих контейнеров:

# docker ps

Выдать список всех контейнеров, запущенных на хосте для удаления:

# docker ps -a

Остановить работающий контейнер:

# docker stop <CONTAINER ID>

Выполнить команду kill для всё ещё работающих контейнеров:

# docker kill <CONTAINER ID>

Удалить все контейнеры, перечисленные по ID:

# docker rm <CONTAINER ID>

Выдать список всех образов Docker:

# docker images

Удалить все образы Docker по ID:

# docker rmi <IMAGE ID>

Удалить все данные Docker (очистить каталог):

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Reason: После команды # rm -R /var/lib/docker останутся тома btrfs удалённых контейнеров (Discuss in Talk:Docker (Русский)#)
# rm -R /var/lib/docker

Полезные советы

Чтобы получить IP адрес контейнера, выполните:

$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container-name OR id> 
172.17.0.37

Для каждого работающего контейнера имя и соответствующий IP-адрес могут быть перечислены для использования в /etc/hosts:

#!/usr/bin/env sh
for ID in $(docker ps -q | awk '{print $1}'); do
    IP=$(docker inspect --format="{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" "$ID")
    NAME=$(docker ps | grep "$ID" | awk '{print $NF}')
    printf "%s %s\n" "$IP" "$NAME"
done

Запуск Docker-контейнеров с ускорением на графических процессорах NVIDIA

Tango-preferences-desktop-locale.pngЭта статья или раздел нуждается в переводеTango-preferences-desktop-locale.png

Примечания: Необходимо закончить перевод данного раздела. (обсуждение: Talk:Docker (Русский)#)

С помощью NVIDIA Container Toolkit (рекомендовано)

Начиная с версии 19.03, графические процессоры NVIDIA поддерживаются в качестве устройств Docker. NVIDIA Container Toolkit является рекомендованным способом запуска контейнеров, использующих графические процессоры NVIDIA.

Установите пакет nvidia-container-toolkitAUR. Далее, перезапустите restart docker. Теперь вы можете запускать контейнеры Docker, использующие графические процессоры NVIDIA, с помощью параметра --gpus:

# docker run --gpus all nvidia/cuda:9.0-base nvidia-smi

Укажите, сколько графических процессоров разрешено в контейнере:

# docker run --gpus 2 nvidia/cuda:9.0-base nvidia-smi

Укажите, какие GPU следует использовать:

# docker run --gpus '"device=1,2"' nvidia/cuda:9.0-base nvidia-smi

или

# docker run --gpus '"device=UUID-ABCDEF,1"' nvidia/cuda:9.0-base nvidia-smi

Укажите capability (graphics, compute, ...) для контейнера (хотя это редко, если вообще когда либо используется таким образом):

# docker run --gpus all,capabilities=utility nvidia/cuda:9.0-base nvidia-smi

Для получения дополнительной информации читайте тут README.md и тут Wiki.

С помощью NVIDIA Container Runtime

Установите пакет nvidia-container-runtimeAUR. Затем, внесите библиотеку среды выполнения NVIDIA, внеся следующее в конфигурационный файл /etc/docker/daemon.json

/etc/docker/daemon.json
{
  "runtimes": {
    "nvidia": {
      "path": "/usr/bin/nvidia-container-runtime",
      "runtimeArgs": []
    }
  }
}

и перезапустите restart docker.

Библиотека среды выполнения также может быть добавлена к dockerd как параметр командной строки:

# /usr/bin/dockerd --add-runtime=nvidia=/usr/bin/nvidia-container-runtime

После этого контейнеры с ускорением на графических процессорах могут быть запущены с помощью команды:

# docker run --runtime=nvidia nvidia/cuda:9.0-base nvidia-smi

или (требуется Docker версии 19.03 или выше):

# docker run --gpus all nvidia/cuda:9.0-base nvidia-smi

Читайте также README.md.

С помощью nvidia-docker (устарело)

nvidia-docker is a wrapper around NVIDIA Container Runtime which registers the NVIDIA runtime by default and provides the nvidia-docker command.

To use nvidia-docker, install the nvidia-dockerAUR package and then restart docker. Containers with NVIDIA GPU support can then be run using any of the following methods:

# docker run --runtime=nvidia nvidia/cuda:9.0-base nvidia-smi
# nvidia-docker run nvidia/cuda:9.0-base nvidia-smi

or (required Docker version 19.03 or higher)

# docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
Note: nvidia-docker is a legacy method for running NVIDIA GPU accelerated containers used prior to Docker 19.03 and has been deprecated. If you are using Docker version 19.03 or higher, it is recommended to use NVIDIA Container Toolkit[broken link: invalid section] instead.

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

docker0 Bridge не получает IP адреса/нет доступа к Интернету в контейнерах

Docker сам включает переадресацию IP, но по умолчанию systemd-networkd переопределяет соответствующую настройку sysctl. Установите IPForward=yes в настройках сети. Подробнее читайте в Internet sharing#Enable packet forwarding.

Примечание: Вам может понадобится выполнить restart docker.service каждый раз, когда Вы выполняете restart systemd-networkd.service или iptables.service

Слишком низкое значение количества процессов/потоков по умолчанию

Если вы столкнетесь с сообщениями об ошибках, похожими на следующие:

# e.g. Java
java.lang.OutOfMemoryError: unable to create new native thread
# e.g. C, bash, ...
fork failed: Resource temporarily unavailable

тогда вам может потребоваться настроить количество процессов, разрешенных systemd. Значени по умолчанию 500 (смотрите system.conf), что довольно мало для запуска нескольких Docker контейнеров. Edit docker.service со следующим фрагментом:

# systemctl edit docker.service
[Service]
TasksMax=infinity

Ошибка инициализации графического драйвера: devmapper

Если systemctl не запускает Docker и выдает ошибку::

Error starting daemon: error initializing graphdriver: devmapper: Device docker-8:2-915035-pool is not a thin pool

Попробуйте выполнить следующие действия, чтобы устранить ошибку. Остановите службу, сделайте резервную копию /var/lib/docker/ (если это необходимо), удалите содержимое /var/lib/docker/, и попробуйте запустить службу. Смотрите описание проблемы на GitHub для более детальной информации.

Failed to create some/path/to/file: No space left on device

Если вы получаете сообщение об ошибке, подобное этому:

ERROR: Failed to create some/path/to/file: No space left on device

При создании или исполнении Docker образа, даже если у вас достаточно свободного места на диске, убедитесь, что:

  • Tmpfs отключен или имеет достаточно памяти. Docker может пытаться записать файлы в /tmp но терпит неудачу из-за ограничений в использовании памяти, а не дискового пространства.
  • Если вы используете XFS, Вы можете удалить опцию монтирования noquota из соответствующих записей в /etc/fstab (обычно, где находятся /tmp и/или /var/lib/docker). Для получения дополнительной информации обратитесь к Disk quota, особенно, если вы планируете использовать и изменить размер overlay2 Docker хранилища.
  • Варианты установки монтирования квоты XFS (uquota, gquota, prjquota, и т.д.) выдают ошибку при перемонтировании файловой системы.

Чтобы включить квоту для корневой файловой системы, параметр монтирования должен быть передан как kernel parameter rootflags=. Впоследствии его не следует указывать среди параметров монтирования в /etc/fstab для корневой файловой системы (/).

Примечание: Есть некоторые отличия XFS Quota по сравнению со стандартом Linux Disk quota, [1] рекомендуется к прочтению.

Неверная ссылка между устройствами в ядре 4.19.1

Если команды типа dpkg не запускаются в Docker, например:

dpkg: error: error creating new backup file '/var/lib/dpkg/status-old': Invalid cross-device link

Либо добавьте overlay.metacopy=N kernel parameter или поставьте версию 4.18.x, в которой эта проблема решена. Больше информации в Arch forum.

Отсутствие CPUACCT в docker с Linux-ck

В новых версиях Linux-ck (Русский) (замечено в версиях 4.19 и 4.20), было сделано изменение в MuQSS, отключающее опцию CONFIG_CGROUP_CPUACCT в ядре, что вызывает следующую ошибку при использовании некоторых команд docker (run или build):

$ docker run --rm hello-world
docker: Error response from daemon: unable to find "cpuacct" in controller set: unknown.

Похоже, что эта ошибка не влияет на демон docker, а только на контейнеры. См. раздел Linux-ck#CPUACCT missing in docker[broken link: invalid section] для получения более подробной информации.

Docker-machine не может создать виртуальные машины с драйвером virtualbox

Если docker-machine не может создать виртуальные машины с драйвером virtualbox и отображает следующую ошибку:

VBoxManage: error: VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory

Перезагрузите virtualbox из командной строки с помощью команды vboxreload.

Docker 0.9.0 — 1.2.x и LXC

Начиная с версии 0.9.0, Docker предоставляет новый способ запуска контейнеров без необходимости в LXC, называемый libcontainer.

LXC может быть удален в ближайшем будущем, однако таким образом вы не сможете использовать lxc-attach с контейнерами, управляемыми Docker 0.9.0+ по умолчанию (запрос 5797). Для этого потребуется запускать службу Docker с параметром -e lxc.

Вы можете создать файл с именем lxc.conf в /etc/systemd/system/docker.service.d/ со следующим содержимым:

[Service]
ExecStart=
ExecStart=/usr/bin/docker -d -e lxc

Смотрите также