Тестовая система с использованием Docker в RH7

Эта заметка объяснит, как можно использовать Docker для тестирования связки клиент/прокси/сервер на одной единственной машине с RedHat 7. Для этого не требуется 3 сервера, нужен только один с 2 или 3 контейнерами. На одной машине будут и клиент, и прокси, и сервер. Когда докер стартует, он создает виртуальный интерфейс docker0 (см. схему). При этом выбирается случайным образом незанятые на хост-машине адрес и подсеть из частного диапазона.
dock_str
docker0 - это виртуальный Ethernet мост, который автоматически переправляет пакеты между другими другими сетевыми интерфейсами подключенными к нему. Это позволяет контейнерам общаться друг с другом и хост-машиной. Основы 1. Образы докера Образы позволяют создавать контейнеры. 2. Реестры докера Реестры содержат образы 3. Контейнеры докера Являются аналогами папок - контейнер содержит все нужное для запуска приложения. - каждый контейнер создается из образа. - контейнер можно запустить, остановить, переместить, удалить. - у контейнера может истечь срок действия (контейнер может "заэкспариться"). Установка докера 1. Устанавливаем RH7. 2. устанавливаем RH7 версию докера.
cd /etc/yum.repos.d
vi docker.repo
добавляем строки:
[docker-main-repo]
name=Docker ${repo} Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
после этого выполняем:
yum install docker
=======================================
Installing : docker-1.2.0-1.8.el7.x86_64                                                                                                                                                                 
  Verifying  : docker-1.2.0-1.8.el7.x86_64                                                                                                                                                                 
 
Installed:
  docker.x86_64 0:1.2.0-1.8.el7
Полезная документация: steps 3. Проверьте, что докер установился корректно, выполнив команду:
# docker info
 
The system information should appear: 
Containers: 6
 Running: 0
 Paused: 0
 Stopped: 6
Images: 2
Server Version: 1.11.1
4. Если докер еще не запущен, выполните:
# service docker start
Redirecting to /bin/systemctl start  docker.service
5. Проверьте запуск, выполнив команду:
ps -ef | grep docker
root       815 27601  0 11:31 pts/0    00:00:00 grep --color=auto docker
root     19444     1  0 May13 ?        00:04:36 /usr/bin/docker daemon -H fd://
root     19450 19444  0 May13 ?        00:00:26 docker-containerd -l /var/run/docker/libcontainerd/docker-containerd.sock --runtime docker-runc
Конфигурирование докера (загрузка образов и создание контейнеров) 1. Скачиваем готовый образ, выполнив команду:
# docker pull ubuntu
Вывод должен быть примерно таким:
# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
6d28225f8d96: Pull complete 
166102ec41af: Pull complete 
d09bfba2bd6a: Pull complete 
c80dad39a6c0: Pull complete 
a3ed95caeb02: Pull complete 
Digest: sha256:5718d664299eb1db14d87db7bfa6945b28879a67b74f36da3e34f5914866b71c
Status: Downloaded newer image for ubuntu:latest
2. Проверяем, что образ появился в докере, выполнив:
# docker images
Ожидаемый вывод:
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              c5f1cf30c96b        2 weeks ago         120.7 MB
hello-world         latest              94df4f0ce8a4        3 weeks ago         967 B
centos              latest              778a53015523        6 weeks ago         196.7 MB
3. Создайте контейнер из скачанного образа:
docker run --privileged  -h mydomain.myhost.com -i -t -v /spare:/spare ubuntu
4. Проверьте, что контейнер появился (запомните его ID).
# docker ps -l
# пока был создан только один контейнер
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
fc4a829dd23f        ubuntu              "/bin/bash"         32 seconds ago      Up 29 seconds                           trenched_katie
5. Создайте из того же образа еще один контейнер:
docker run --privileged  -h mydomain.myhost.com -i -t -v /spare:/spare ubuntu
6. Проверьте, что он существует (запомните его ID):
# второй пошел!
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
8e6c818e87f1        ubuntu              "/bin/bash"         12 seconds ago      Up 10 seconds                           opposed_trent
Настройка маршрута между контейнерами 1. Создайте 2 моста на хосте:
# brctl addbr br1
# brctl addbr br2
2. Проверьте, что мосты появились, выполнив команду:
# ip addr
 
6: docker0: <broadcast ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:8c:73:8f:68 brd ff:ff:ff:ff:ff:ff
    inet 172.15.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:8cff:fe73:8f68/64 scope link 
       valid_lft forever preferred_lft forever
18: veth6d72f5f@if17: </broadcast><broadcast ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP 
    link/ether ea:0d:26:52:69:32 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::e80d:26ff:fe52:6932/64 scope link 
       valid_lft forever preferred_lft forever
19: br1: </broadcast><broadcast ,MULTICAST> mtu 1500 qdisc noop state DOWN 
    link/ether a6:51:c0:76:0b:87 brd ff:ff:ff:ff:ff:ff
20: br2: </broadcast><broadcast ,MULTICAST> mtu 1500 qdisc noop state DOWN 
    link/ether 6e:95:43:2f:09:0c brd ff:ff:ff:ff:ff:ff
</broadcast>
3. На хост-машине надо назначить IP адреса для br1 и br2 с помощью команд:
ifconfig br1 ${lBr1IPAddress} netmask ${lSubnetMask}
ifconfig br2 ${lBr2IPAddress} netmask ${lSubnetMask}
Можно выбрать такие значения:
ifconfig br1 172.15.2.1/24 netmask 255.255.255.0
ifconfig br2 172.15.3.1/24 netmask 255.255.255.0
4. Проверьте, что мостам действительно назначены IP:
#ip addr
 
6: docker0: <broadcast ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:8c:73:8f:68 brd ff:ff:ff:ff:ff:ff
    inet 172.15.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:8cff:fe73:8f68/64 scope link 
       valid_lft forever preferred_lft forever
18: veth6d72f5f@if17: </broadcast><broadcast ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP 
    link/ether ea:0d:26:52:69:32 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::e80d:26ff:fe52:6932/64 scope link 
       valid_lft forever preferred_lft forever
19: br1: </broadcast><broadcast ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether a6:51:c0:76:0b:87 brd ff:ff:ff:ff:ff:ff
    inet 172.15.2.1/24 brd 172.15.2.255 scope global br1
       valid_lft forever preferred_lft forever
    inet6 fe80::1851:c0ff:fe66:b43/64 scope link 
       valid_lft forever preferred_lft forever
20: br2: </broadcast><broadcast ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether 6e:95:43:2f:09:0c brd ff:ff:ff:ff:ff:ff
    inet 172.15.3.1/24 brd 172.15.3.255 scope global br2
       valid_lft forever preferred_lft forever
    inet6 fe80::8c95:4bff:fe2f:97c/64 scope link 
       valid_lft forever preferred_lft forever
</broadcast>
5. Можно воспользоваться командой:
ip route
 
172.15.0.0/16 dev docker0  proto kernel  scope link  src 172.15.0.1 
172.15.2.0/24 dev br1  proto kernel  scope link  src 172.15.2.1 
172.15.3.0/24 dev br2  proto kernel  scope link  src 172.15.3.1
Пересылка запросов между контейнерами Предполагается, что на хосте установлен httpd и добавлена в папку www какая-нибудь тестовая страничка. 1. Получаем список всех контейнеров:
#docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
1eb65a781a34        centos              "/bin/bash"         About an hour ago   Up About an hour                                    prickly_stallman
a3b38dde603a        centos              "/bin/bash"         About an hour ago   Exited (0) About an hour ago                        small_lovelace
55d28eae64aa        hello-world         "/hello"            About an hour ago   Exited (0) About an hour ago                        sick_ardinghelli
97fc942e39f6        hello-world         "/hello"            About an hour ago   Exited (0) About a minute ago                       determined_curie
0d7e9943fb4d        hello-world         "/hello"            About an hour ago   Exited (0) About an hour ago                        clever_goldstine
37d386b7e41f        hello-world         "/hello"            2 hours ago         Exited (0) 2 hours ago                              jolly_bohr
2. Перед использованием контейнер надо запустить. Для запуска контейнера нужен ID. Мы запустим серверный и клиентский контейнеры.
# docker start 1eb65a781a34
# docker start a3b38dde603a
Для нашей конфигурации:
client = 172.15.3.1
Server = 172.15.2.1
Прикрепляем контейнер:
docker attach 1eb65a781a34
3. Для проверки маршрута между контейнерами выполним curl запрос: (прокси настроен на хост машине в режиме full transparency, поэтому в моем случае его нигде не надо указывать)
curl http://172.15.2.1/test.html
< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
</head>
 
<body>
 
</body><body BGcolor="#EAF1FD">
 
<blockquote>
  <h1 align="center">
    <font face="Arial, Helvetica, sans-serif">Response!</font></h1>
</blockquote>
</body>
</html>
You can leave a response, or trackback from your own site.

Leave a Reply