Docker (Русский)

From ArchWiki
Revision as of 17:16, 9 March 2019 by Vivanova (talk | contribs) (Translated Invalid cross-device link in kernel 4.19.1)
Jump to navigation Jump to search

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

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

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

Установка

Установите docker, доступный в официальных репозиториях. Для i686 установите docker-gitAUR из AUR. Затем включите и запустите службу docker.service и проверьте ее работу:

 # docker info

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

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

# gpasswd -a user docker
Важно: Любой, кто добавлен в группу docker, имеет права, эквивалентные правам суперпользователя. Больше информации здесь и здесь.
Примечание: По состоянию на linux 4.15.0-1 vsyscalls, которые требуются определенными программами в контейнерах (такими как apt-get), по умолчанию отключены в конфигурации ядра. Чтобы включить их снова, добавьтеvsyscall=emulate kernel parameter. Больше информации в FS#57336.

Настройка

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

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

Storage driver

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

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

Чтобы увидеть текущий драйвер хранилища, запустите # docker info | head, современная установка Docker уже должна использовать overlay2 по умолчанию.

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

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

После этого restart докер.

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

Remote API

Чтобы открыть Remote API для порта 4243, используйте:

# /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

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

/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 snippet со следующим содержимым:

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

Proxies

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

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

/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 base/archlinux
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 snippet для 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

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

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 missing in docker with Linux-ck

In newer versions of Linux-ck (some experienced with 4.19, 4.20 seems general), a change to the MuQSS was made that disables the CONFIG_CGROUP_CPUACCT option from the kernel, which makes some usage of docker (run or build) to produce the following error:

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

This error does not seems to affect the docker daemon, just containers. Read more on Linux-ck#CPUACCT missing in docker.

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

Сборка образа i686

Для архитектуры i686, мы не можем использовать образ x86_64, полученный с помощью следующей команды:

# docker pull base/archlinux

Образ ArchLinux

Вместо этого, посетите реестр base/archlinux и перейдите по ссылке mkimage-arch.sh для скачивания mkimage-arch.sh и mkimage-arch-pacman.conf. Затем сделайте скрипт исполняемым:

$ chmod +x mkimage-arch.sh

и выполните следущее:

# LC_ALL=C ./mkimage-arch.sh # LC_ALL=C потому что скрипт парсит вывод консоли

Скрипт проверит наличие необходимых утилит. В случае их отсутствия будет предложено их установить.

$ docker run -t -i --rm archlinux /bin/bash # для запуска

Для медленных сетевых подключений и/или на слабых машинах можно увеличить тайм-аут сборки:

$ sed -i 's/timeout 60/timeout 120/' mkimage-arch.sh

Образ Debian

Собрать образ Debian можно с помощью debootstrap из AUR:

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

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