Docker (Русский)
Docker — это утилита для упаковки, загрузки и запуска любых приложений через легковесный контейнер.
Contents
- 1 Установка
- 2 Настройка
- 3 Образы
- 4 Удаление Docker и образов
- 5 Полезные советы
- 6 Устранение неполадок
- 6.1 docker0 Bridge не получает IP адреса/нет доступа к Интернету в контейнерах
- 6.2 Слишком низкое значение количества процессов/потоков по умолчанию
- 6.3 Ошибка инициализации графического драйвера: devmapper
- 6.4 Failed to create some/path/to/file: No space left on device
- 6.5 Неверная ссылка между устройствами в ядре 4.19.1
- 6.6 Отсутствие CPUACCT в docker с Linux-ck
- 7 Docker 0.9.0 — 1.2.x и LXC
- 8 Смотрите также
Установка
Установите 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
Настройка
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"
Убедитесь, что конфигурация была загружена:
# 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 (очистить каталог):
# 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.
Слишком низкое значение количества процессов/потоков по умолчанию
Если вы столкнетесь с сообщениями об ошибках, похожими на следующие:
# 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 (some experienced кажется общей проблемой в версиях 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 отсутствует в 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