Знакомство с Docker в RedHat 7

В данной статье я рассмотрю сетевой аспект использования 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
При использование докера данное конфигурирование произойдет автоматически. А теперь команды для настройки каждой роли.
docker
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 и автоматизация [sc:social_networks ]
You can leave a response, or trackback from your own site.

Leave a Reply