В данной статье я рассмотрю сетевой аспект использования Docker: как настроить полную прозрачность (full transparency) на одном компьютере — это было невозможно в RedHat 6. Теперь вместо трех серверов мы обойдемся двумя-тремя контейнерами.
Подобные настройки были возможны при использовании OpenStack, он поддерживает сетевые пространства имен (network namespaces) и поэтому на единственной машине можно имитировать клиент/прокси/сервер, каждый в своем пространстве имен.
При старте Докера создается виртуальный сетевой интерфейс docker0. Он выбирает случайным образом адрес и подсеть из частного (private) диапазона (из незанятых). Docker0 – это виртуальный мост (virtual Ethernet bridge), он автоматически перенаправляет пакеты пакеты между другими сетевыми интерфейсами, которые приписаны к нему. Это позволяет контейнерам общаться друг с другом и с машиной, на которой они запущены.
Когда Докер создает контейнер, он создает пару интерфейсов, которые по сути являются концами канала (pipe). Пакет, посланный с одного «конца», будет получен на другом «конце» с указанием eth0 в контейнере и уникальным именем veth в пространстве имен.
Т.е. при использовании OpenStack это было так:
ip link add eth0 type veth peer name vethx |
При использование докера данное конфигурирование произойдет автоматически.
А теперь команды для настройки каждой роли.
HOST
yum install docker docker pull centos docker images //to check its stored ok //запустите контейнер как привелегированный пользователь (privileged user) и с отображением host:container, //которое позволит копировать файлы между контейнером и хостом docker run –privileged -i -t –rm -v /spare:/spare centos /bin/bash (запустить два раза – 2 контейнера в этом примере) |
PROXY CONTAINER
yum install net-tools //ifconfig yum install wireshark set up the TPROXY rules as normal strace –f ./simple-tcp-proxy 0.0.0.0 3128 //далее будет показано, как с такими настройками принимается запрос ifconfig –a //запомните IP адрес – в данном случае это 100.100.100.33 |
SERVER CONTAINER
yum install net-tools yum install wireshark yum install httpd route add 100.100.42.1 gw 100.100.100.33 /usr/sbin/httpd -k start //замечание. Я пробовал задействовать apachectl, но там есть сложности с использованием systemctl/init, который по умолчанию в контейнере не поддерживается |
HOST (снова)
route add 100.100.0.34 gw 100.100.100.33 docker commit 23cdd87acbe amg-centos //сохранить изменения в контейнере (-рах) <pre lang="shell"> [root@myhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE amg-centos latest 345ac567 11 hours ago 565.8 MB |
Выполняем команду на стороне хоста:
curl http://100.100.0.34/test.html |
и в выводе наблюдаем текст странички.
На стороне OS можно запустить:
tshark port 80 |
и проконтролировать получение пакетов. Нас интересует пакет с содержимым «GET /test.html»
В примере я запускал запрос к OS (Origin Server) контейнеру.
Цепочка взаимодействия:
host<->proxy container <-> server container
Разумеется, можно задействовать 3 контейнера:
client container<->proxy container <-> server container
Следующая статья про Docker: Docker Hub и автоматизация