Знакомство с 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 и автоматизация

You can leave a response, or trackback from your own site.

Leave a Reply