Difference between revisions of "Docker (Русский)"
(translated →CPUACCT missing in docker with Linux-ck) |
(→С помощью NVIDIA Container Runtime: synchronization and translation) |
||
(14 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|Vagrant}} | {{Related|Vagrant}} | ||
{{Related articles end}} | {{Related articles end}} | ||
{{Unmaintained (Русский)}} | {{Unmaintained (Русский)}} | ||
− | [ | + | [[Wikipedia:ru:Docker|Docker]] — утилита для упаковки, загрузки и запуска любых приложений в легковесных контейнерах. |
== Установка == | == Установка == | ||
− | [[Установите]] {{Pkg|docker}} | + | [[Установите]] пакет {{Pkg|docker}} или {{Aur|docker-git}}, версию для разработки. Затем [[включите]] и [[запустите]] службу {{ic|docker.service}} и проверьте ее работу: |
# docker info | # docker info | ||
− | Обратите внимание, что запуск службы Docker может завершиться сбоем, если | + | Обратите внимание, что запуск службы Docker может завершиться сбоем, если имеется активное VPN-соединение. Это происходит из-за IP-конфликтов между сетевыми мостами и оверлейными сетями VPN и Docker. Если это так, попробуйте отключить VPN перед запуском службы Docker. Вы можете переподключить VPN сразу после этого. [https://stackoverflow.com/questions/45692255/how-make-openvpn-work-with-docker Вы также можете попытаться разрешить конфликт сетей.] |
− | Если | + | Если требуется запуск Docker от имени обычного пользователя, добавьте его в [[Users and groups (Русский)#Управление группами|группу пользователей]] {{ic|docker}}: |
# gpasswd -a ''user'' docker | # gpasswd -a ''user'' docker | ||
− | {{Warning (Русский)| | + | {{Warning (Русский)|Каждый пользователь в группе {{ic|docker}} имеет права, равноценные правам суперпользователя. Больше информации [https://github.com/docker/docker/issues/9976 здесь] и [https://docs.docker.com/engine/security/security/ здесь].}} |
− | |||
− | |||
== Настройка == | == Настройка == | ||
− | + | === Драйвер хранения === | |
− | |||
− | === | ||
− | Docker storage driver | + | Драйвер хранения Docker (storage driver или graph driver) значительно влияет на производительность. Его задача — эффективно хранить слои образов контейнеров, то есть когда несколько образов совместно используют слой, только один слой использует дисковое пространство. Совместимая опция `devicemapper` предлагает неоптимальную производительность, которая просто ужасна на вращающихся дисках. Кроме того, `devicemapper` не рекомендуется использовать в промышленной среде. |
− | Поскольку Arch | + | Поскольку 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= | {{hc|/etc/docker/daemon.json|2= | ||
{ | { | ||
Line 51: | Line 47: | ||
}} | }} | ||
− | После | + | После чего [[перезапустите]] 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 === | === Remote API === | ||
− | + | Используйте следующую команду, чтобы вручную открыть порт {{ic|4243}} для Remote API: | |
# /usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock | # /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 tcp://0.0.0.0:4243}} — часть для открытия Remote API. |
− | {{ic|-H unix:///var/run/docker.sock}} часть для доступа к хост-машине через терминал. | + | {{ic|-H unix:///var/run/docker.sock}} — часть для доступа к хост-машине через терминал. |
==== Remote API с systemd ==== | ==== Remote API с systemd ==== | ||
− | Чтобы запустить | + | Чтобы запустить Remote API с помощью демона Docker, создайте [[Drop-in сниппет]] со следующим содержимым: |
{{hc|/etc/systemd/system/docker.service.d/override.conf|2= | {{hc|/etc/systemd/system/docker.service.d/override.conf|2= | ||
Line 78: | Line 73: | ||
=== Конфигурация сокета демона === | === Конфигурация сокета демона === | ||
− | Демон docker по умолчанию прослушивает [[Wikipedia:Unix | + | Демон ''docker'' по умолчанию прослушивает [[Wikipedia:ru:Сокет домена Unix|Unix-сокет]]. Чтобы прослушивать определённый порт, создайте [[Drop-in сниппет]] со следующим содержимым: |
{{hc|/etc/systemd/system/docker.socket.d/socket.conf|2= | {{hc|/etc/systemd/system/docker.socket.d/socket.conf|2= | ||
Line 85: | Line 80: | ||
}} | }} | ||
− | === | + | === Прокси === |
− | ==== Конфигурация | + | |
+ | ==== Конфигурация прокси ==== | ||
+ | |||
+ | Создайте [[Drop-in сниппет]] со следующим содержанием: | ||
− | |||
{{hc|/etc/systemd/system/docker.service.d/proxy.conf|2= | {{hc|/etc/systemd/system/docker.service.d/proxy.conf|2= | ||
[Service] | [Service] | ||
Line 95: | Line 92: | ||
}} | }} | ||
− | {{Note (Русский)| | + | {{Note (Русский)|Предполагается, что прокси-сервер имеет адрес {{ic|192.168.1.1}}, не используйте {{ic|127.0.0.1}}.}} |
Убедитесь, что конфигурация была загружена: | Убедитесь, что конфигурация была загружена: | ||
Line 102: | Line 99: | ||
Environment=HTTP_PROXY=192.168.1.1:8080 HTTPS_PROXY=192.168.1.1:8080 | Environment=HTTP_PROXY=192.168.1.1:8080 HTTPS_PROXY=192.168.1.1:8080 | ||
}} | }} | ||
+ | |||
==== Конфигурация контейнера ==== | ==== Конфигурация контейнера ==== | ||
− | Настройки в файле {{ic|docker.service}} не | + | Настройки в файле {{ic|docker.service}} не применяются к контейнерам. Для этого необходимо задать переменные {{ic|ENV}} в {{ic|Dockerfile}} следующим образом: |
− | FROM base | + | FROM archlinux/base |
ENV http_proxy="<nowiki>http://192.168.1.1:3128</nowiki>" | ENV http_proxy="<nowiki>http://192.168.1.1:3128</nowiki>" | ||
ENV https_proxy="<nowiki>https://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] предоставляет подробную информацию о конфигурации | + | [https://docs.docker.com/engine/reference/builder/#env Docker] предоставляет подробную информацию о конфигурации с помощью {{ic|ENV}} в Dockerfile. |
=== Конфигурация DNS === | === Конфигурация DNS === | ||
Line 120: | Line 118: | ||
Начиная с версии 220, параметр переадресации для данной сети ({{ic|net.ipv4.conf.<Interface>.forwarding}}) по умолчанию равен {{ic|off}}. Этот параметр запрещает переадресацию IP. Он также конфликтует с Docker, который включает параметр {{ic|net.ipv4.conf.all.forwarding}} внутри контейнера. | Начиная с версии 220, параметр переадресации для данной сети ({{ic|net.ipv4.conf.<Interface>.forwarding}}) по умолчанию равен {{ic|off}}. Этот параметр запрещает переадресацию IP. Он также конфликтует с Docker, который включает параметр {{ic|net.ipv4.conf.all.forwarding}} внутри контейнера. | ||
− | Обходной путь | + | Обходной путь — отредактировать файл {{ic|<interface>.network}} в {{ic|/etc/systemd/network/}}, добавив {{ic|1=IPForward=kernel}} на хосте Docker: |
{{hc|/etc/systemd/network/<interface>.network|2= | {{hc|/etc/systemd/network/<interface>.network|2= | ||
Line 137: | Line 135: | ||
Если вы запустили Docker образы, вам необходимо убедиться, что они полностью размонтированы. После этого вы можете переместить изображения из {{ic|/var/lib/docker}} в целевой путь. | Если вы запустили Docker образы, вам необходимо убедиться, что они полностью размонтированы. После этого вы можете переместить изображения из {{ic|/var/lib/docker}} в целевой путь. | ||
− | Затем добавьте [[Drop-in | + | Затем добавьте [[Drop-in сниппет]] для {{ic|docker.service}}, добавив параметр {{ic|--data-root}} в {{ic|ExecStart}}: |
{{hc|/etc/systemd/system/docker.service.d/docker-storage.conf|2= | {{hc|/etc/systemd/system/docker.service.d/docker-storage.conf|2= | ||
Line 155: | Line 153: | ||
== Образы == | == Образы == | ||
+ | |||
=== Arch Linux === | === Arch Linux === | ||
+ | |||
Следующая команда выгружает [https://hub.docker.com/r/archlinux/base/ archlinux/base] x86_64 образ. Это урезанная версия ядра Arch без сети и т.д. | Следующая команда выгружает [https://hub.docker.com/r/archlinux/base/ archlinux/base] x86_64 образ. Это урезанная версия ядра Arch без сети и т.д. | ||
Line 171: | Line 171: | ||
=== Debian === | === Debian === | ||
+ | |||
Следующая команда выгружает [https://hub.docker.com/r/_/debian/ debian] x86_64 образ. | Следующая команда выгружает [https://hub.docker.com/r/_/debian/ debian] x86_64 образ. | ||
Line 176: | Line 177: | ||
==== Создание образа вручную ==== | ==== Создание образа вручную ==== | ||
+ | |||
Создайте образ Debian с {{Pkg|debootstrap}}: | Создайте образ Debian с {{Pkg|debootstrap}}: | ||
Line 239: | Line 241: | ||
printf "%s %s\n" "$IP" "$NAME" | printf "%s %s\n" "$IP" "$NAME" | ||
done</nowiki>}} | 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]] instead.}} | ||
== Устранение неполадок == | == Устранение неполадок == | ||
+ | |||
=== docker0 Bridge не получает IP адреса/нет доступа к Интернету в контейнерах === | === docker0 Bridge не получает IP адреса/нет доступа к Интернету в контейнерах === | ||
Line 296: | Line 376: | ||
=== Отсутствие CPUACCT в docker с Linux-ck === | === Отсутствие CPUACCT в docker с Linux-ck === | ||
− | В новых версиях [[Linux-ck]] ([https://aur.archlinux.org/packages/linux-ck#comment-677316 | + | В новых версиях [[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.}} | {{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]] для получения более подробной информации. | |
+ | |||
+ | === 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 == | == Docker 0.9.0 — 1.2.x и LXC == | ||
Line 316: | Line 404: | ||
== Смотрите также == | == Смотрите также == | ||
− | * [https://www.docker.com | + | * [https://www.docker.com Официальный сайт] |
* [https://docs.docker.com/engine/installation/linux/archlinux/ Arch Linux на docs.docker.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:// | + | * [https://awesome-docker.netlify.com/ Awesome Docker] |
Latest revision as of 19:52, 22 November 2019
Docker — утилита для упаковки, загрузки и запуска любых приложений в легковесных контейнерах.
Contents
- 1 Установка
- 2 Настройка
- 3 Образы
- 4 Удаление Docker и образов
- 5 Полезные советы
- 6 Запуск Docker-контейнеров с ускорением на графических процессорах NVIDIA
- 7 Устранение неполадок
- 7.1 docker0 Bridge не получает IP адреса/нет доступа к Интернету в контейнерах
- 7.2 Слишком низкое значение количества процессов/потоков по умолчанию
- 7.3 Ошибка инициализации графического драйвера: devmapper
- 7.4 Failed to create some/path/to/file: No space left on device
- 7.5 Неверная ссылка между устройствами в ядре 4.19.1
- 7.6 Отсутствие CPUACCT в docker с Linux-ck
- 7.7 Docker-machine не может создать виртуальные машины с драйвером virtualbox
- 8 Docker 0.9.0 — 1.2.x и LXC
- 9 Смотрите также
Установка
Установите пакет docker или docker-gitAUR, версию для разработки. Затем включите и запустите службу docker.service
и проверьте ее работу:
# docker info
Обратите внимание, что запуск службы Docker может завершиться сбоем, если имеется активное VPN-соединение. Это происходит из-за IP-конфликтов между сетевыми мостами и оверлейными сетями VPN и Docker. Если это так, попробуйте отключить VPN перед запуском службы Docker. Вы можете переподключить VPN сразу после этого. Вы также можете попытаться разрешить конфликт сетей.
Если требуется запуск Docker от имени обычного пользователя, добавьте его в группу пользователей docker
:
# gpasswd -a user 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"
Убедитесь, что конфигурация была загружена:
# 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 (очистить каталог):
# 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
С помощью 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
Устранение неполадок
docker0 Bridge не получает IP адреса/нет доступа к Интернету в контейнерах
Docker сам включает переадресацию IP, но по умолчанию systemd-networkd переопределяет соответствующую настройку sysctl. Установите IPForward=yes
в настройках сети. Подробнее читайте в Internet sharing#Enable packet forwarding.
Слишком низкое значение количества процессов/потоков по умолчанию
Если вы столкнетесь с сообщениями об ошибках, похожими на следующие:
# 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
для корневой файловой системы (/
).
Неверная ссылка между устройствами в ядре 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 для получения более подробной информации.
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