Как сделать docker доступным в WSL 1
- У нас есть docker for windows. он работает из windows
- У нас есть WSL1 с ubuntu 18.4 (вообще версия не так важна)
- Как их подружить?
Цепочка непроста.
Включаем порт 2375
- В трее выбираем в Docker for Windows → Settings → General → Expose daemon on tcp://localhost:2375 without tls (включаем. Варианта с 2376 и tls я пока не нашел)
- После перезапуска проверяем что порт открыт
telnet localhost 2375
если отобразилось черное окно - всё ок и можно пропустить следующий пункт.
Меняем настройки диапазона динамических портов в IPv4
-
проверяем командами стартовые значения динамических диапазонов портов в Windows (нужен CMD c правами администратора):
netsh int ipv4 show dynamicport tcp netsh int ipv6 show dynamicport tcp netsh int ipv4 show dynamicport udp netsh int ipv6 show dynamicport udp
Скорее всего во всех случаях кроме 1-го вы получите значение 49152. Оно верное. В моём случае оно было равно 1025. Детали проблемы можно найти здесь: https://support.microsoft.com/en-ca/help/929851/the-default-dynamic-port-range-for-tcp-ip-has-changed-in-windows-vista .
-
Меняем для ipv4/tcp значение на корректное
netsh int ipv4 set dynamic tcp start=49152 num=16384
если с ipv6/tcp диапазон так же начинается с 1025 (у меня такого не было) - решение аналогичное
-
Перезагружаемся
-
Перепроверяем что порт 2375 открылся
Устанавливаем клиенты docker в WSL
-
docker потребуется только клиент. Есть ли версия свежее можно проверить по первой ссылке в скрипте. в bash WSL последовательно выполняем:
export docker_url=https://download.docker.com/linux/static/stable/x86_64 export docker_version=19.03.5 curl -Lo docker-$docker_version.tgz $docker_url/docker-$docker_version.tgz tar -xzvf docker-$docker_version.tgz docker/docker mkdir -p ~/bin mv docker/docker ~/bin rmdir docker rm docker-$docker_version.tgz
-
Теперь у нас есть docker. полная установка не имеет смысла потому что daemon не работоспособен в WSL
-
Устанавливаем docker-compose:
curl -L https://github.com/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o ~/bin/docker-compose chmod +x ~/bin/docker-compose
-
ставим lazydocker (это не обязательно, но мне нравится этот клиент):
curl https://raw.githubusercontent.com/zverev-iv/lazydocker-home-bin-installer/master/install_update_linux.sh | bash
-
так же можем добавить docker-machine если есть необходимость:
curl -L https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && chmod +x /tmp/docker-machine && mv /tmp/docker-machine ~/bin/
-
Клиенты есть, но им еще не к чему присоединиться
Прописываем host для docker клиентов
-
выполняем, что бы переменная прописывалась во всех последующих сессиях
echo "export DOCKER_HOST=tcp://localhost:2375" >> ~/.bashrc && source ~/.bashrc
-
Закрываем текущую сессию WSL и открываем новую.
-
PROFIT! теперь у нас и из windows и из WSL - одинаковая доступность к службе Docker for Windows. Проверим ( и в windows и в WSL команда одинаковая):
docker system info
Информация о системе должна быть одинаковой.
P.S.> Скрипты написаны в разных стилях, каюсь. Красивый вариант финального скрипта выложу позже.