Настройка работы Docker и OpenStack
Первое с чего мы начнем — это установка Docker и необходимых пакетов. Обращаю внимание, что этот вариант установки подходит только для тестовых сред. Для «боевой установки» следует собрать rpm-пакет с драйвером Docker и не устанавливать на вычислительные узлы средства, применяемые при разработке. Действия выполняем на вычислительном узле:
[root@os2 ~]# yum -y install net-tools docker-io
python-pip git
Также обратите внимание на то, что мы устанавливаем пакет net-tools, который в современных дистрибутивах при установке по умолчанию заменен на iproute,а утилиты из его состава имеют статус устаревших. Нам он понадобится ради команды ifconfig, которая используется драйвером Docker.
Теперь забираем с Github исходный код драйвера и устанавливаем:
[root@os2 ~]# git clone
https://github.com/stackforge/nova-docker.git
[root@os2 ~]# cd nova-docker
[root@os2 nova-docker]# git checkout -b pre-i18n
9045ca43b645e72751099491bf5f4f9e4bddbb91
[root@os2 nova-docker]# python setup.py install
[root@os2 nova-docker]# pip install pbr
Команду git checkout мы выполняем до обновления исходного кода, который «ломает» совместимость с релизом OpenStack Juno. Следующим шагом запускаем и включаем сервис Docker и выполняем не очень «чистый» обходной прием с правами, для того чтоб в CentOS драйвер получил доступ к Docker:
[root@os2 ~]# systemctl start docker
[root@os2 ~]# systemctl enable docker
[root@os2 ~]# chmod 660 /var/run/docker.sock
Нам необходимо в соответствии с инструкцией на Github настроить драйвер. Создаем файл с инструкциями по настройки сети для Docker:
[root@os2 ~]# mkdir /etc/nova/rootwrap.d
[root@os2 ~]# vi
/etc/nova/rootwrap.d/docker.filters
и в файл docker.filters копируем следующие содержимое:
#nova-rootwrap command filters for setting up
network in the docker driver
# This file should be owned by (and
only-writeable by) the root user
[Filters]
# nova/virt/docker/driver.py: 'ln', '-sf',
'/var/run/netns/.*'
ln: CommandFilter, /bin/ln, root
Наконец на узле Glance добавляем к форматам контейнеров docker:
[root@os1 ~]# crudini --set
/etc/glance/glance-api.conf DEFAULT container_formats
ami,ari,aki,bare,ovf,ova,docker
[root@os1 ~]# systemctl restart
openstack-glance-api
А на вычислительном узле os2 в качестве драйвера указываем драйвер Docker. Других изменений производить не надо:
[root@os2 ]# crudini --set /etc/nova/nova.conf
DEFAULT compute_driver novadocker.virt.docker.DockerDriver
[root@os2 ]# systemctl restart
openstack-nova-compute
Теперь тестируем нашу конфигурацию. Для начала ограничимся работоспособностью контейнеров Docker. Попробуем запустить контейнер с дистрибутивом Fedora:
[root@os2 ~]# docker run -i -t fedora /bin/bash
Unable to find image 'fedora:latest' locally
Trying to pull repository docker.io/fedora ...
...
Status: Downloaded newer image for
docker.io/fedora:latest
bash-4.3# cat /etc/redhat-release
Fedora release 21 (Twenty One)
Как мы видим, из репозитория docker.io был скачен последний образ Fedora и запущен. Если посмотреть на список контейнеров, мы также это уведем:
[root@os2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
cb7b37a3a1b2 fedora:latest "/bin/bash"
9 minutes ago Up 9 minutes heisenberg
Теперь скачаем образ с минимальным http-сервером thttpd, который будем использовать для проверки работы:
[root@os2 ~]# docker pull larsks/thttpd
Trying to pull repository
docker.io/larsks/thttpd ...
...
Status: Downloaded newer image for
docker.io/larsks/thttpd:latest
После этого загрузим его в Glance:
[root@os2 ~]# source keystonerc_admin
[root@os2 ~]# docker save larsks/thttpd | glance
image-create --is-public True --container-format docker --disk-format
raw --name larsks/thttpd
+------------------+--------------------------------------+
| Property | Value
|
+------------------+--------------------------------------+
| checksum |
c98dcd00b284eaf35ba8d10e1bff941c |
| container_format | docker
|
| created_at | 2015-05-09T19:42:23
|
| deleted | False
|
| deleted_at | None
|
| disk_format | raw
|
| id |
7133ae58-03aa-4d80-af98-adf5e1c02a5e |
| is_public | True
|
| name | larsks/thttpd
|
| owner |
a5c42139ce154b4d945b4ed806cbee81 |
| protected | False
|
| size | 1083392
|
| status | active
|
| updated_at | 2015-05-09T19:42:25
|
| virtual_size | None
|
+------------------+--------------------------------------+
Проверяем список образов:
[root@os2 ~]# glance image-list
+------+---------------------+-------------+------------------+----------+--------+
| ID | Name | Disk Format |
Container Format | Size | Status |
+------+---------------------+-------------+------------------+----------+--------+
| bc.. | cirros-0.3.3-x86_64 | qcow2 |
bare | 13200896 | active |
| 71.. | larsks/thttpd | raw |
docker | 1083392 | active |
+------+---------------------+-------------+------------------+----------+--------+
И в графическом интерфейсе Horizon:

Наконец, можно попробовать создать экземпляр контейнера:
$ source keystonerc_demo
$ nova boot --image larsks/thttpd --flavor
m1.small test1
+--------------------------------------+-------------------------------------+
| Property | Value
|
+--------------------------------------+-------------------------------------+
| OS-DCF:diskConfig | MANUAL
|
| OS-EXT-AZ:availability_zone | nova
|
| OS-EXT-STS:power_state | 0
|
| OS-EXT-STS:task_state |
scheduling |
| OS-EXT-STS:vm_state |
building |
| adminPass |
Y6htpjH5xe2X |
| created |
2015-05-09T20:05:08Z |
| flavor |
m1.small (2) |
| id |
65de57d0-f033-4818-a522-2c3291dc.. |
| image |
larsks/thttpd (7133ae58-03aa-4d8..) |
| metadata | {}
|
| name | test1
|
| os-extended-volumes:volumes_attached | []
|
| security_groups | default
|
| status | BUILD
|
| tenant_id |
9c1c71f2c0f243b7a3b1d0d1880820e9 |
| updated |
2015-05-09T20:05:08Z |
| user_id |
f3aabe457c2c4fe5912a0f90e569e04d |
+--------------------------------------+-------------------------------------+
Проверяем, что контейнер запущен:
[root@os2 ~]# docker ps
CONTAINER ID IMAGE
COMMAND CREATED STATUS PORTS
NAMES
4680097f2cc0 larsks/thttpd:latest
"/thttpd -D -l /dev/ 13 minutes ago Up 13 minutes
nova-65de57d0-f033-4818-a522-2c3291dc516b
В графическом интерфейсе это выглядит следующим образом:

Для доступа к http-серверу присвоим экземпляру внешний floating IP:
[root@os1 ~]# nova floating-ip-associate test1
10.100.1.101
Проверяем:
[root@os1 ~]# nova list
+------+-------+--------+------------+-------------+-----------------------+
| ID | Name | Status | Task State | Power
State | Networks |
+------+-------+--------+------------+-------------+-----------------------+
| 65.. | test1 | ACTIVE | - | Running
| demo-net=172.16.0.14, |
| | | | |
| 10.100.1.101 |
+------+-------+--------+------------+-------------+-----------------------+
И из тестовой машины со внешней сети пробуем подключится к серверу:
$ curl http://10.100.1.101
____ _ _
_ _
/ ___|___ _ __ __ _ _ __ __ _| |_ _ _| |
__ _| |_(_) ___ _ __ ___
| | / _ \| '_ \ / _` | '__/ _` | __| | | | |/
_` | __| |/ _ \| '_ \/ __|
| |__| (_) | | | | (_| | | | (_| | |_| |_| | |
(_| | |_| | (_) | | | \__ \
\____\___/|_| |_|\__, |_|
\__,_|\__|\__,_|_|\__,_|\__|_|\___/|_| |_|___/
|___/
Все работает, можно наградить себя чашечкой кофе.