
Эта заметка объяснит, как можно использовать Docker для тестирования связки клиент/прокси/сервер на одной единственной машине с RedHat 7. Для этого не требуется 3 сервера, нужен только один с 2 или 3 контейнерами. На одной машине будут и клиент, и прокси, и сервер.
Когда докер стартует, он создает виртуальный интерфейс docker0 (см. схему). При этом выбирается случайным образом незанятые на хост-машине адрес и подсеть из частного диапазона.
docker0 - это виртуальный Ethernet мост, который автоматически переправляет пакеты между другими другими сетевыми интерфейсами подключенными к нему. Это позволяет контейнерам общаться друг с другом и хост-машиной.
Основы
1. Образы докера
Образы позволяют создавать контейнеры.
2. Реестры докера
Реестры содержат образы
3. Контейнеры докера
Являются аналогами папок
- контейнер содержит все нужное для запуска приложения.
- каждый контейнер создается из образа.
- контейнер можно запустить, остановить, переместить, удалить.
- у контейнера может истечь срок действия (контейнер может "заэкспариться").
Установка докера
1. Устанавливаем RH7.
2. устанавливаем RH7 версию докера.
cd /etc/yum.repos.d
vi docker.repo |
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 |
[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 |
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 |
# 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 |
# 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 |
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
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 |
# 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. Проверяем, что образ появился в докере, выполнив:
Ожидаемый вывод:
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 |
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 |
docker run --privileged -h mydomain.myhost.com -i -t -v /spare:/spare ubuntu
4. Проверьте, что контейнер появился (запомните его ID).
# пока был создан только один контейнер
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc4a829dd23f ubuntu "/bin/bash" 32 seconds ago Up 29 seconds trenched_katie |
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 |
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 |
# второй пошел!
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 |
# 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> |
# 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 ${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 |
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> |
#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 |
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 |
#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 |
# docker start 1eb65a781a34
# docker start a3b38dde603a
Для нашей конфигурации:
client = 172.15.3.1
Server = 172.15.2.1 |
client = 172.15.3.1
Server = 172.15.2.1
Прикрепляем контейнер:
docker attach 1eb65a781a34 |
docker attach 1eb65a781a34
3. Для проверки маршрута между контейнерами выполним curl запрос:
(прокси настроен на хост машине в режиме full transparency, поэтому в моем случае его нигде не надо указывать)
curl http://172.15.2.1/test.html |
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> |
< !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>
Related Posts
И снова про dockerИ снова про docker Вы хотите иметь возможность развернуть свое программное обеспечение в любой системе?…
-
Docker Hub и автоматизацияЗатрагивая тему использования Docker невозможно не коснуться использования Docker Hub и Dockerfiles. В этой заметке…