от Lucifer

25660808075_f19d02bae1_o

Да започна с едно малко пояснение – предполагам, че има къде къде по-лесен начин да се направи това, което ще опиша, но някак си не успях да го намеря за цяла вечер ровене.

Реших, че ми е време да се хвана и да разуча това чудо на модерната виртуализация, наречено 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

Вашият коментар

This site uses Akismet to reduce spam. Learn how your comment data is processed.