Да започна с едно малко пояснение – предполагам, че има къде къде по-лесен начин да се направи това, което ще опиша, но някак си не успях да го намеря за цяла вечер ровене.
Реших, че ми е време да се хвана и да разуча това чудо на модерната виртуализация, наречено Docker – идеята му е семпло гениална. Лесно е за управление и изобщо е прекрасно, за всеки, на който му се налага да деплойва някакви неща. Докер създава userspace контейнер, който е изолиран от системата, но върви в нея (знам, знам … не е съвсем точно, но аз така го схващам). Идеята е че всяка машина е отделена от средата, а средата вижда само това, което администратора иска.
Разбира се, аз искам да разпъна Docker обект на сървъра, на който се помещава този блог, както и f-bg. Прекрасно. Но този сървър има IPTables правила … а Doker не се съобразява много много с тях.
Постановката – искам да разпъна GitLab Docker контейнер. Искам GitLab-а да е достъпен чрез HTTP_PROXY пуснато на Aapache-a който си върви на сървъра. И в никакъв момент не искам разни излишни портове да ми се мотаят отворени.
По принцип всички контейнери в Docker са изолирани и администратора решава кои портове да „публикува“ за достъп, като ги закачи за портове на сървъра. Проблем – порт 80 на сървъра вече бива прослушван от Apache. Значи ще подкарам Docker на порт 10080 – голямо, кръгло, съвсем не употребено число.
Командата е
docker run --detach \ --hostname gitlab.anavaro.com \ --publish 10443:443 --publish 10080:80 --publish 10022:22 \ --name gitlab \ --restart always \ --volume /srv/gitlab/config:/etc/gitlab \ --volume /srv/gitlab/logs:/var/log/gitlab \ --volume /srv/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest
Очакван резултат след инсталацията – да мога да отворя http://localhost:10080 …
Получен резултат – Penis Abas Crustom. Нищо не се отваря! Ама изобщо …
Покрай ровенето за информация относно липсващото рутиране, намерих, че Docker има хубавата опция за стартиране – –iptables=false , която спира всички фокуси на Docker с IPTables … или поне всички така си мислим (защото някой трябва да направи Docker да уважава IPTables). Но проблема не беше в тази опция (макар, че е задължителна ако имате custom firewall, като моя милост.
След известно чудене, маене и експерименти във виртуална среда се усетих, че firewall-а ми е allow exclusively … тост – първо отхвърлям всички пакети, после приемам определените … Следователно виртуалния мрежов интерфейс на Doker дори не се рутира:
За това добавих следното към firewall-а:
iptables -A FORWARD -i docker0 -o lo -j ACCEPT iptables -A INPUT -i docker0 -j ACCEPT
Както за всеки друг интерфейс – трябва да има някакво рутиране.
След основните правила добавям:
iptables -A INPUT -p tcp -i lo -s 127.0.0.1/8 --dport 10022 -m conntrack --ctstate NEW -j ACCEPT iptables -A INPUT -p tcp -i lo -s 127.0.0.1/8 --dport 10080 -m conntrack --ctstate NEW -j ACCEPT
Забележете всички малки защитни нещица, които съм наслагал: само от loopback, само от 127.0.0.1/8 … Е не се притеснявайте – не работят. Docker не ги уважава.
До тук добре. Отварянето на http://localhost:10080 ме отвежда до началната страница на GitLab … Време е за следващия тест. Отварям друга машина във мрежата и се опитвам да се свържа с машината на която върви Docker на порт 10080 …
Очакван резултат – Нищо да не се отвори.
Получен резултат – КУР! GitLab се отваря …
Забелязахте ли колко пъти споменавам, че Docker не се съобразява с IPTables? Еми не се – с горната команда за стартиране на GitLab контейнера се започва да слуша на всички интерфейси. Майка му!
Но решението се оказва просто – караме Docker да се закачи за специфично IP малка промяна на командата:
docker run --detach \ --hostname gitlab.anavaro.com \ --publish 127.0.0.1:10080:80 \ --publish 127.0.0.1:10022:22 \ --name gitlab \ --restart always \ --volume /srv/gitlab/config:/etc/gitlab \ --volume /srv/gitlab/logs:/var/log/gitlab \ --volume /srv/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest
Забележете, че съм махнал 443 – HTTPS порта. Това е защото ще използваме HTTPS на Apache HTTP PROXY-то … като го разпъна довечера.
Надявам се да съм бил полезен на някого, ако се сблъсква с такива проблеми. И много се надявам Docker да си оправят IPTables поддръжката …
Ваш,
Lucifer
Вашият коментар