Поэтому решено было поумерить свой пыл и взять
Настройка сервера
Установка 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 и надежность высочайшего класса. В целом, я доволен.
Ресурсы:
- Статья 2016 года по настройке для CoreOS
- Docker Remote API без шифрования
- Сайт Docker и все ресурсы, на которых были указаны ссылки в самой статье
AxisPod
А не проще было взять ноут другого производителя? Или тут уже будет сложнее аргументировать брать у вас VDS?
dlinyj
Я думаю, что тут банально привычка к экосистеме. Когда человек пользуется маком, то уже не хочет использовать ничего другого.
Например, я линуксойд, и если чего-то нет под linux, то для меня этого просто нет. Я не играю в игры, которых нет под линукс. Как бы это странно не звучало.
AndreySu
Хм, но Android IDE так же работает под линукс и там к тому же будет нативный и работающий докер примерно по той же цене.
dlinyj
Линукс не Мак, я просто привёл пример.
EgorKurier
можно было купить что нибудь в 2-3 раза дешевле и мощнее и накатить хакинтош
oldadmin Автор
Моя практика показывайт, что это выходит на круг дороже.
EgorKurier
ну или какой нить другой юникс подобную систему. Например линукс. Все равно прогеры не вылазят с вима и терминала.
x67
Если есть возможность без последствий работать на windows, то это прекрасное решение.
Но для линукс… если брать печатную машинку, скорее всего проблем не будет. Однако, если хочется хорошего железа, выбор сильно сужается, так как производители очень и очень не любят линукс. По крайней мере в цепочке купил ноут — накатил последнюю убунту может появиться третье звено, которое может принести неудобств больше, чем разница в стоимости с маком, помноженная на политическую неприязнь к apple.
Из частых проблем — отвалившийся wifi, bluetooth или функциональные кнопки. И не смейте думать о том, чтобы настроить battery save mode, в котором она не будет заряжаться выше 80 % или быть уверенным, что время работы от батарейки точно будет сопоставимо с таковым в оконной ОС. Тяжелее может прийтись тем, кто захочет подключить внешний дисплей и внезапно обнаружит, что драйвера от огромной зеленой корпорации или не менее огромной красной вообще то без прелюдий не дружат с вашим любимым дистрибутивом. А прелюдиями заниматься надо вам. И не факт, что вы справитесь, вы ведь не хотите тратить десятки и сотни часов на изучение архитектуры линукс и работы конкретных технологий? А иногда может возникнуть ощущение, что это самое простое решение проблемы. И вообще писать софт самому под себя для уникальной задачи не так сложно. Решения есть, однако ж я не говорил что это не возможно. Просто выбирать путь вам) И выбор не так прост, как может показаться.
П.с. Давно люблю линукс однако уже серьезно думаю пересесть на мак, ибо некоторые плюсы уж слишком жирные
cthtuf
Однако путь может быть не так тяжёл, как вы описали. Тут многое зависит от производителя вашего железа — если он желает сэкономить, то подсунет фиговый wi-fi адаптер, как в моем случае, и драйвера на него будут одинаково плохо работать что на линуксе, что на винде. Я столкнулся с таким и решил проблему просто заменив адаптер в моем ноутбуке на более надежный. С красным производителем видеодрайверов как-то не было проблем, само все работает. Оперативка, SSD, новая батарея и wi-fi адаптер за 600 руб, пожалуй единственное что я вложил в свой ноутбук. Итого, затраты за 6 лет составили ~37к руб. Ну и нет необходимости докер в облаке крутить, оно и на локали норм летает, вместе с PyCharm.
Безусловно есть неудобства, связанные с линуксом, для меня в первую очередь это низкое качество бесплатного ПО, но есть платные альтернативы либо онлайн-решения.
За более чем 10 лет работы с линуксом, мне не приходилось связываться с изучением архитектуры линукса. Возникающие вопросы как-то и без этого решались.
А сама статья полезная, может когда-нибудь пригодится.
x67
только зачем менять вай фай адаптеры, когда можно купить работающий из коробки ноут? Я же не говорю, что работать невозможно. Просто вместо продуктивной деятельности нужно покопаться в системе, разобраться как работает, заказать новый вай фай адаптер или перепробовать 5 версий драйверов, различные параметры загрузки, версии ядра, чтобы получить полноценную функциональность. Если не быть готовым к этому, работа может превратиться в мазохизм.
И даже весьма хорошие производители (асус вроде как не сильнее остальных экономит на железе) вполне могут создать ноутбук, непригодный к полноценному использованию в линукс. Единственное, что могу посоветовать — выбирать более линукс-ориентированных производителей, если это возможно — lenovo, dell и тп., а также не брать новейшие модели, пока не появится хоть какой либо фидбек о новой платформе или выбранной модели.
И поверьте, проблема с ПО в линукс — детский пустяк по сравнению с несовместимостью железа.
Но это всего лишь систематическая ошибка выжившего и никак не может являться аргументом. Мне вот приходилось сталкиваться с различными проблемами на 4 моделях 3 производителей. При этом вполне есть беспроблемные модели, которые, к сожалению или недоступны, редки или просто не подходят по каким-либо параметрам.
the_cat_vasiliy
Ноутбуки Lenovo ThinkCenter и DELL Latitude сертифицируются для работы с Ubuntu и как следствие со всеми производными. Тут список совместимых моделей. Проблема уже давно не стоит так остро. Было бы желание.
LionZXY
Привык к macbook, лучшее сочетание времени работы+UX+nix-экспериенс