company_banner

Как сэкономить на покупке ноутбука: Docker Remote API via TLS

  • Tutorial
Совсем недавно я решился на покупку личного ноутбука. Разработка open-source проекта (приложение для Flipper) и смена места работы вынудили меня больше не использовать рабочий ноутбук для личных целей. И тут уже жалко было отдавать стоимость поддержанной Hyndai Solaris за ноутбук (на работе у меня топовая конфигурация 16" MacBook).



Поэтому решено было поумерить свой пыл и взять нищебродский самый дешевый MacBook Air 13" за 80 тысяч рублей. Однако, на mac Docker сжирает непомерное количество ресурсов, поэтому после покупки пришлось думать как же решить эту проблему. Сразу же пришла идея вынести Docker Engine куда-нибудь в онлайн. Сказано — сделано.

Настройка сервера


Установка Docker Engine на сервер


Накладные расходы docker на Linux минимальны. Docker на Mac работает на виртуальной машине Linux, когда как на Linux напрямую использует ядро хост-системы. Подробнее об этом можете почитать тут.

Так как нам важен маленький пинг, имеет смысл приобрести хостинг в Москве, но большой разницы нет.

Итого: Linux, Москва, характеристики зависят от ваших потребностей.
На ruvds.com как раз есть недорогой готовый тариф для этого. Также на ruvds.com есть возможность заказать сетап сразу с Docker CE на борту. Мелочь, а приятно.

Ищите пароль и логин в веб-интерфейсе своего хостинга и подключайтесь.



Дальше устанавливайте Docker. Отличная инструкция есть тут, ниже кратко приведу команды из неё (если у вас вдруг нет sudo, не забудьте установить его apt-get install sudo из под su):

sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

Проверим работу docker:

docker run hello-world


Генерация ключей


Для начала нужно сгенерировать SSL ключи. Можно пойти по легкому и по сложному пути. Инструкция по сложному пути (каноническому) представлена в документации Docker. Но добрые люди запихнули все это в контейнер <10mb.

Давайте создадим для начала папки, куда будем складировать все. Папки могут быть любыми. В первой (/etc/docker/ssl) хранятся секретные ключи, во второй (~/.docker) ключи для доступа.

sudo mkdir -p /etc/docker/ssl
mkdir -p ~/.docker

Для начала создадим клиентские и CA сертификаты в локальной папке

docker run --rm -v ~/.docker:/certs \
    paulczar/omgwtfssl

Создадим серверные сертификаты, используя CA, сгенерированный выше. Укажите там через запятую те IP, через которые будете получать доступ к серверу. В нашем случае не забудьте указать там IP вашего сервера!

sudo cp ~/.docker/ca.pem /etc/docker/ssl/ca.pem
chown -R $USER ~/.docker
docker run --rm -v /etc/docker/ssl:/server \
    -v ~/.docker:/certs \
    -e SSL_IP=127.0.0.1,172.17.8.101,YOUR_IP \
    -e SSL_DNS=docker.local -e SSL_KEY=/server/key.pem \
    -e SSL_CERT=/server/cert.pem paulczar/omgwtfssl

Настраиваем docker daemon


Основная задача на данном этапе — пропихнуть при запуске docker аргументы командной строки с нужными нам параметрами. Как вы это сделаете не суть важно, на Ubuntu можно это сделать так:

1. Редактируем файл /etc/default/docker вашим любимым редактором

nano /etc/default/docker

И добавляем в конец переменную `DOCKER_OPTS`. Не забудьте вставить туда свой внешний IP


DOCKER_OPTS="-H=YOUR_IP:2376 -H unix:///var/run/docker.sock --tlsverify --tlscacert=/etc/docker/ssl/ca.pem --tlscert=/etc/docker/ssl/cert.pem --tlskey=/etc/docker/ssl/key.pem"

2. Добавляем аргументы на запуск сервиса. На Ubuntu файлик с параметрами запуска это /lib/systemd/system/docker.service. Добавляем строчку в подсекцию [Service]:

EnvironmentFile=/etc/default/docker

И меняем команду запуска рядышком:

ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS

Да, пункт 1 был не обязательный, аргументы команды можно было вставить и сюда, но их достаточно много и неудобно иметь большую команду для запуска в файле сервиса.

3. Перезагружаем демона

sudo systemctl daemon-reload
sudo systemctl restart docker

4. Проверьте в логах демона что все работает:

journalctl -u docker.service -f


5. Попробуем подключиться через tls:

export DOCKER_HOST=tcp://YOUR_IP:2376
export DOCKER_TLS_VERIFY=1
export DOCKER_CERT_PATH=~/.docker
docker info


Работает!

Настройка на клиенте


Прежде чем начать настраивать клиенты вам необходимо скачать папку с сертификатами на свой компьютер. Вы можете сделать это любым удобным способом. Например, через `scp`:

На удаленной машине:

mkdir /tmp/cert-for-docker && cp -v ~/.docker/{ca,cert,key}.pem /tmp/cert-for-docker

На локальной машине:

scp -r root@YOUR_IP:/tmp/cert-for-docker ~/.docker

Далее используйте эту папку для настройки клиента docker.

Mac OS CLI


Тут настройка сводится к тому что нужно прописать переменные в вашей среде и все будет работать. Однако встает вопрос: «Откуда взять голый клиент? Нам же не нужен официальный тяжеловесный клиент под 2Гб, который поставляется вместе с Docker Engine?»

Решение есть! Современный Docker уже давно поделили на клиентскую и серверную часть. Можно скачать отдельные binary клиента, собранные под macos. Официальная инструкция тут, но я приведу тут краткую выжимку:

1. Качаем последние или соответствующие вашему серверу (можно вытащить командой docker info) бинари по ссылке и распаковываем
2. Копируем бинарь в папку /usr/local/bin/ чтобы работало глобально:
sudo cp docker/docker /usr/local/bin/

3. Прописываем в ~/.bashrc или ~/.zshrc необходимые переменные окружения. Не забудьте вставить свой IP и путь к папке с сертификатам:
export DOCKER_HOST=tcp://YOUR_IP:2376
export DOCKER_CERT_PATH=PATH_TO_CERT
export DOCKER_TLS_VERIFY=1

4. Перезагружаем компьютер (шоб наверняка), проверяем:

docker info
docker run hello-world


Красота!

Jetbrains IDEs (PyCharm, IDEA, Android Studio e.t.c)


Студии Jetbrains из коробки поддерживают docker via tls. Находится эта настройка в Preference->Build, Execution, Deployment->Docker->+. Вам нужно выбрать TCP socket и ввести там свои данные. Однако есть подвох.


Если все сделать как задумано, то вылезет ошибка:
Error response from daemon: Client sent an HTTP request to an HTTPS server.
errors pretty printing info
Или
Cannot connect: Status 400: Client sent an HTTP request to an HTTPS server
Нужно явно прописывать нашей студии что протокол мы используем https:
YOUR_IP:2376
После все должно работать отлично.

Бонус (Portainer)


Чтобы эфективно отслеживать запущенные и уже отработанные контейнеры, я поставил на этот сервер Portainer. Ставится он в две строки:

docker volume create portainer_data
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

После этого на YOUR_IP:9000 будет висеть красивый веб-интерфейс и можно видеть запущенные и убитые контейнеры. Помните как мы запускали hello-world? Он тут и его можно прямо из интерфейса почистить.


Сам Portainer можно подключать к любой машине с Docker и управлять docker-контейнерами всех ваших машин из одного места. Метрика (Grafana+Prometheus+Алерты) ставиться также легко двумя командами (не забудьте установить git и docker-compose):

git clone https://github.com/stefanprodan/dockprom && cd dockprom
ADMIN_USER=admin ADMIN_PASSWORD=admin docker-compose up -d




Только вот для Storage нужно поменять sum(node_filesystem_free_bytes{fstype="aufs"}) на sum(node_filesystem_free_bytes{fstype="ext4"})



Заключение


Когда я покупал ноутбук, я не тешил себя надеждой, что мне его хватит под любые задачи, тем более что мне его хватит на Java/Android-разработку. Но я был приятно удивлен, до сих пор все мои проекты, личные и просто open-source летают в IDE. Однако я понимал, что при всей моей любви к этой пишущей машинке, Docker она не вывезет. Я был очень рад настроив один раз на удаленном сервере docker. В процессе разработки абсолютно незаметно что сервер не локальный. Ограничений каких-то не чувствую, всеравно Docker и раньше без интернета запускать было мало смысла. В общем, я очень доволен. -1 причина покупать мощный и тяжелый ноутбук.

К тому же, оверхед Docker на линукс минимальный, поэтому можно взять машину за 240 рублей в месяц у RuVDS в РФ (а со скидкой по промокоду HABR -10% и того меньше) и не беспокоиться за пинг и влияние серверных приложений на UI. Плюсом идет внешний IP (возможность показывать клиентам и держать dev-песок), приватный VPN и надежность высочайшего класса. В целом, я доволен.

Ресурсы:





RUVDS.com
VDS/VPS-хостинг. Скидка 10% по коду HABR

Комментарии 37

    +18
    А не проще было взять ноут другого производителя? Или тут уже будет сложнее аргументировать брать у вас VDS?
      +13
      Я думаю, что тут банально привычка к экосистеме. Когда человек пользуется маком, то уже не хочет использовать ничего другого.
      Например, я линуксойд, и если чего-то нет под linux, то для меня этого просто нет. Я не играю в игры, которых нет под линукс. Как бы это странно не звучало.
        0
        Хм, но Android IDE так же работает под линукс и там к тому же будет нативный и работающий докер примерно по той же цене.
          +1
          Линукс не Мак, я просто привёл пример.
          –3
          можно было купить что нибудь в 2-3 раза дешевле и мощнее и накатить хакинтош
            +2
            Моя практика показывайт, что это выходит на круг дороже.
              –4
              ну или какой нить другой юникс подобную систему. Например линукс. Все равно прогеры не вылазят с вима и терминала.
          –1
          Если есть возможность без последствий работать на windows, то это прекрасное решение.
          Но для линукс… если брать печатную машинку, скорее всего проблем не будет. Однако, если хочется хорошего железа, выбор сильно сужается, так как производители очень и очень не любят линукс. По крайней мере в цепочке купил ноут — накатил последнюю убунту может появиться третье звено, которое может принести неудобств больше, чем разница в стоимости с маком, помноженная на политическую неприязнь к apple.
          Из частых проблем — отвалившийся wifi, bluetooth или функциональные кнопки. И не смейте думать о том, чтобы настроить battery save mode, в котором она не будет заряжаться выше 80 % или быть уверенным, что время работы от батарейки точно будет сопоставимо с таковым в оконной ОС. Тяжелее может прийтись тем, кто захочет подключить внешний дисплей и внезапно обнаружит, что драйвера от огромной зеленой корпорации или не менее огромной красной вообще то без прелюдий не дружат с вашим любимым дистрибутивом. А прелюдиями заниматься надо вам. И не факт, что вы справитесь, вы ведь не хотите тратить десятки и сотни часов на изучение архитектуры линукс и работы конкретных технологий? А иногда может возникнуть ощущение, что это самое простое решение проблемы. И вообще писать софт самому под себя для уникальной задачи не так сложно. Решения есть, однако ж я не говорил что это не возможно. Просто выбирать путь вам) И выбор не так прост, как может показаться.

          П.с. Давно люблю линукс однако уже серьезно думаю пересесть на мак, ибо некоторые плюсы уж слишком жирные
            +3
            Однако путь может быть не так тяжёл, как вы описали. Тут многое зависит от производителя вашего железа — если он желает сэкономить, то подсунет фиговый wi-fi адаптер, как в моем случае, и драйвера на него будут одинаково плохо работать что на линуксе, что на винде. Я столкнулся с таким и решил проблему просто заменив адаптер в моем ноутбуке на более надежный. С красным производителем видеодрайверов как-то не было проблем, само все работает. Оперативка, SSD, новая батарея и wi-fi адаптер за 600 руб, пожалуй единственное что я вложил в свой ноутбук. Итого, затраты за 6 лет составили ~37к руб. Ну и нет необходимости докер в облаке крутить, оно и на локали норм летает, вместе с PyCharm.

            Безусловно есть неудобства, связанные с линуксом, для меня в первую очередь это низкое качество бесплатного ПО, но есть платные альтернативы либо онлайн-решения.
            За более чем 10 лет работы с линуксом, мне не приходилось связываться с изучением архитектуры линукса. Возникающие вопросы как-то и без этого решались.

            А сама статья полезная, может когда-нибудь пригодится.
              +1
              только зачем менять вай фай адаптеры, когда можно купить работающий из коробки ноут? Я же не говорю, что работать невозможно. Просто вместо продуктивной деятельности нужно покопаться в системе, разобраться как работает, заказать новый вай фай адаптер или перепробовать 5 версий драйверов, различные параметры загрузки, версии ядра, чтобы получить полноценную функциональность. Если не быть готовым к этому, работа может превратиться в мазохизм.

              И даже весьма хорошие производители (асус вроде как не сильнее остальных экономит на железе) вполне могут создать ноутбук, непригодный к полноценному использованию в линукс. Единственное, что могу посоветовать — выбирать более линукс-ориентированных производителей, если это возможно — lenovo, dell и тп., а также не брать новейшие модели, пока не появится хоть какой либо фидбек о новой платформе или выбранной модели.

              И поверьте, проблема с ПО в линукс — детский пустяк по сравнению с несовместимостью железа.

              За более чем 10 лет работы с линуксом, мне не приходилось связываться с изучением архитектуры линукса. Возникающие вопросы как-то и без этого решались.

              Но это всего лишь систематическая ошибка выжившего и никак не может являться аргументом. Мне вот приходилось сталкиваться с различными проблемами на 4 моделях 3 производителей. При этом вполне есть беспроблемные модели, которые, к сожалению или недоступны, редки или просто не подходят по каким-либо параметрам.
              +4
              Ноутбуки Lenovo ThinkCenter и DELL Latitude сертифицируются для работы с Ubuntu и как следствие со всеми производными. Тут список совместимых моделей. Проблема уже давно не стоит так остро. Было бы желание.
              0

              Привык к macbook, лучшее сочетание времени работы+UX+nix-экспериенс

              +7
              Мдя, глядя на такие суммы, понимаешь, почему капитализация надкусанного яблока составляет триллиард евро-сша.
                0
                А еще есть курс рубля.
                +14

                docker прекрасно работает и через ssh, вся настройка ограничивается установкой переменной окружения


                DOCKER_HOST=ssh://server

                Очень удобно использовать в одну строку, если нужно запускать докер на разных серверах


                % DOCKER_HOST=ssh://server1 docker ps
                % DOCKER_HOST=ssh://server2 docker ps
                  0
                  Более того, прекрасный VSCode умеет работать в удаленном docker контейнере, опять же если указать вышеупомянутую переменную.
                  DOCKER_HOST=ssh://server1 code

                  Нужно лишь чтобы на вышей машине работал ssh-agent (keychain например).
                    0
                    +1
                    Есть только одна особенность с docker-compose. Он использует много соединений, приходится менять конфигурацию sshd.
                    +8
                    И казалось бы — при чём тут экономия на ноутбуке?
                      0

                      Тренд же старый тонкий клиент. Теперь Макбуки)

                      +2
                      Последний апдейт на Docker решает вашу проблему. github.com/docker/roadmap/issues/12#issuecomment-663163280. У меня Macbook Air 2018 и про жужжание вентиляторов я забыл.
                        +8
                        Автор, а как быть с синхронизацией файлов проекта и сервера в таких ide, как jetbrains? Особенно, если у фреймворка много файлового кеша?
                          0
                          Сам пользуюсь подобной схемой. Все связано именно с плохой работой Docker в Mac, особенно всё что связано с файловой системой. Хотел одно время назад написать статью как настроить тако окружение, хотя может это не секрет на самом деле. Если кратко, то Synching синхронизирует файлы, ssh port binding для пробрасывания портов во все стороны кому как надо, локальный nginx грузит статику локально, остальное грузит с порта из ssh.
                          +6

                          У меня такой мак, как на картинке. От части и в том числе, что много виртуализации, в том числе и докер.
                          В части докера были и локальные и параллель-драйверные и докер-машинные и внешние как у вас решения. Все это круто, но внешние пробросы не решают вопрос мапинга локальной папки. А это для меня крайне важно.
                          А по части экосистемы — да, сильно привязываешься. Хотя бы к тачпаду, которого нет ни у одного другого производителя. Но это уже отдельных холливар.
                          На десерт: рувдс тестил раза три и все три раза уходил. Сильные просадки в разное время. Хорошо помогает график поведения на заббиксе.
                          Деньги приятные у них, но даже с худшим латенси у хецнера и теми же деньгами, выбираю стабильное, прогнозируемое поведение.

                            0
                            Абсолютно за если компания дает топовую конфигурация железа, ибо она говорит тебе — чувак ты со мной ни в чем не будешь нуждаться.
                            Но для личных целей зачем? На работе тоже мак — но работая с серверами понимаешь что единая среда намного важнее красивого яблока на крышке. Для личных проектов и целей пользую убунту, просто там нативно работает все что мне необходимо. Докер там это просто изолированный процесс, да есть оверхед — но линукс не пытается крутить отдельную виртуалку для этого.
                              +1
                              я не знаю, где вы маки покупаете, но для меня стоимость мака очевидно ниже обычного ноута с аналогичным конфигом. А учитывая гарантию и качественное исполнение — то и безальтернативный выбор рисуется. Остальные ноуты в чем-то косячат — имел возможность сравнивать с Lenovo Thinkpad X1 — как рабочий ноут огонь, все завел под Manjaro. Но нет экосистемы, хреновый звук и тачпад.
                                0
                                С одной стороны, есть такое дело, если смотреть цены на топовые ноуты Dell/Lenovo/Microsoft. А с другой стороны, пожив на Dell XPS с 4k сенсорным экраном и тонкими рамками, как-то не хочется смотреть в сторону Apple.
                                Современное поколение XPS 9500 с точки зрения размеров и экрана круче Macbook 16, и стоит дешевле. Тачпады на виндовых ноутбуках тоже бывают хорошими. А вот тот факт, что под MacOS можно круто жесты настроить с BetterTouchTool, а на windows ничего похожего нет — это факт.
                                P.S. Сменил Windows на Mac и вернулся обратно.
                                0
                                У меня для единой среды linux под virtual box на маке. :)
                                +2
                                А для чего такие сложности с настройкой? Для этих целей существует docker-machine с драйвером generic, который настроит сервер и клиент одной командой:
                                docker-machine create -d generic --generic-ip-address {ip-address} {docker-vm-name}

                                На сервере даже докер руками ставить не надо, docker-machine сам всё установит, нужен докер только на клиенте.

                                Как я помню, докер из brew ставится без зависимостей, только сам бинарь, что позволяет, опять же, убрать ручной труд.

                                Получается статью можно было сжать до нескольких строк:
                                Покупаем VPS
                                Устанавливаем докер на Мак:
                                brew install docker docker-machine

                                и запускаем настройку связи с сервером
                                docker-machine create -d generic --generic-ip-address {ip-address} {docker-vm-name}


                                P.S. Если docker-vm-name назвать как default то это машина будет использоваться по умолчанию.
                                  0

                                  Спасибо! Это как раз то что хотел. Я не смог этого найти когда искал решение своей проблемы :(


                                  В любом случае спасибо вам за комментарий, будущее поколение и я вам очень благодарны: )

                                    0

                                    Хотя вот на чистом Mac book и на чистой ubuntu эта команда выдает гордую строчку


                                    Error creating machine: Error running provisioning: error installing docker:

                                    и просто закрывается

                                      0

                                      Оно делает один в один что в статье только плохим скриптом. В любом случае полезно знать как работает изнутри чтобы уметь решать ошибки

                                      –4
                                      Привет!
                                      А вам слабо предложить за пять баксов в месяц аренду виртуалки с MacOS?
                                        –1
                                        пришлось думать как же решить эту проблему


                                        Не хочу показаться богохульником, а как насчет «не пользоваться Docker» ну или AWS?
                                          0

                                          Ну и куда этот промокод применять? Сняли тупо полную сумму.

                                            0
                                            Уже написал вам в личку, сейчас всё вернём на место.
                                            +1
                                            В конфигурации особенно нужен 8TB SSD, Radeon Pro 5600M и Final Cut. Особенно для разработки на Java/Android.
                                              0

                                              Сейчас у меня без Final Cut и SSD всего терабайт, очевидно пример гиперболизирован.

                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                            Самое читаемое