Как сделать docker доступным в WSL 1

  1. У нас есть docker for windows. он работает из windows
  2. У нас есть WSL1 с ubuntu 18.4 (вообще версия не так важна)
  3. Как их подружить?

Цепочка непроста.

Включаем порт 2375

  1. В трее выбираем в Docker for Windows → Settings → General → Expose daemon on tcp://localhost:2375 without tls (включаем. Варианта с 2376 и tls я пока не нашел)
  2. После перезапуска проверяем что порт открыт telnet localhost 2375 если отобразилось черное окно - всё ок и можно пропустить следующий пункт.

Меняем настройки диапазона динамических портов в IPv4

  1. проверяем командами стартовые значения динамических диапазонов портов в 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 .

  2. Меняем для ipv4/tcp значение на корректное

    netsh int ipv4 set dynamic tcp start=49152 num=16384
    

    если с ipv6/tcp диапазон так же начинается с 1025 (у меня такого не было) - решение аналогичное

  3. Перезагружаемся

  4. Перепроверяем что порт 2375 открылся

Устанавливаем клиенты docker в WSL

  1. docker потребуется только клиент. Есть ли версия свежее можно проверить по первой ссылке в скрипте. в bash WSL последовательно выполняем:

    1
    2
    3
    4
    5
    6
    7
    8
    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
    
  2. Теперь у нас есть docker. полная установка не имеет смысла потому что daemon не работоспособен в WSL

  3. Устанавливаем docker-compose:

    1
    2
    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
    
  4. ставим lazydocker (это не обязательно, но мне нравится этот клиент):

    1
    curl https://raw.githubusercontent.com/zverev-iv/lazydocker-home-bin-installer/master/install_update_linux.sh | bash
    
  5. так же можем добавить docker-machine если есть необходимость:

    1
    2
    3
    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/
    
  6. Клиенты есть, но им еще не к чему присоединиться

Прописываем host для docker клиентов

  1. выполняем, что бы переменная прописывалась во всех последующих сессиях

    1
    echo "export DOCKER_HOST=tcp://localhost:2375" >> ~/.bashrc && source ~/.bashrc
    
  2. Закрываем текущую сессию WSL и открываем новую.

  3. PROFIT! теперь у нас и из windows и из WSL - одинаковая доступность к службе Docker for Windows. Проверим ( и в windows и в WSL команда одинаковая):

    1
    docker system info
    

    Информация о системе должна быть одинаковой.

P.S.> Скрипты написаны в разных стилях, каюсь. Красивый вариант финального скрипта выложу позже.