
В данной статье я рассмотрю сетевой аспект использования 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 |
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 контейнера в этом примере) |
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 |
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, который по умолчанию в контейнере не поддерживается |
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 |
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 |
curl http://100.100.0.34/test.html
и в выводе наблюдаем текст странички.
На стороне OS можно запустить:
и проконтролировать получение пакетов. Нас интересует пакет с содержимым «GET /test.html»
В примере я запускал запрос к OS (Origin Server) контейнеру.
Цепочка взаимодействия:
host<->proxy container <-> server container
Разумеется, можно задействовать 3 контейнера:
client container<->proxy container <-> server container
Следующая статья про Docker:
Docker Hub и автоматизация
[sc:social_networks ]
Related Posts
Docker Hub и автоматизацияЗатрагивая тему использования Docker невозможно не коснуться использования Docker Hub и Dockerfiles. В этой заметке…
И снова про dockerИ снова про docker Вы хотите иметь возможность развернуть свое программное обеспечение в любой системе?…
-