Centos 6.5 Docker
## EPEL RHEL/CentOS 6 64-Bit Repository ##
# wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm
# yum install -y docker-io
# chkconfig --level 345 docker on
# service docker start
// Чтобы не работать под root нужно добавить пользователя в группу docker
usermod -a -G docker
===================================================
Делаю мост между виртуальным и реальным интерфейсом. (т.к. контейнеру буду явно задавать IP адрес. Как сделать без моста не знаю. Если кто поделится, буду благодарен.)
### Инсталляция необходимых пакетов
# yum install -y bridge-utils
### Настраиваем интерфейс, для работы с контейнером
# cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BRIDGE=br0
NM_CONTROLLED=no
EOF
# cat > /etc/sysconfig/network-scripts/ifcfg-br0 << EOF
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.11
NETWORK=192.168.1.0
NETMASK=255.255.255.0
DELAY=0
NM_CONTROLLED=no
EOF
# service network restart
# ifconfig br0
br0 Link encap:Ethernet HWaddr 00:22:B0:51:3D:60
inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::222:b0ff:fe51:3d60/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:14 errors:0 dropped:0 overruns:0 frame:0
TX packets:25 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:932 (932.0 b) TX bytes:3410 (3.3 KiB)
# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.0022b0513d60 no eth1
docker0 8000.000000000000 no
===================================================
// Копирую контейнер
# docker pull centos:centos6
// Так, чего у нас есть локально из контейнеров
# docker images --tree
// Выполнить команду в контейнере, при этом не запуская демон
# docker run centos:centos6 cat /etc/redhat-release
// Получить список контейнеров, в том числе остановленных
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
952829a799e3 centos:centos6 cat /etc/redhat-rele 3 minutes ago Exited (0) 3 minutes ago ecstatic_hawking
// Стартовать контейнер для работы
# docker run -i -t centos:centos6 /bin/bash
bash-4.1#
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
80075ddd71e8 centos:centos6 /bin/bash 10 minutes ago Up 10 minutes clever_pare
# docker stop 80075ddd71e8
# docker ps -s -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
80075ddd71e8 centos:centos6 /bin/bash 18 minutes ago Exited (-1) 4 minutes ago clever_pare 2.392 MB
952829a799e3 centos:centos6 cat /etc/redhat-rele 23 minutes ago Exited (0) 23 minutes ago ecstatic_hawking -1 B
# docker start 80075ddd71e8
# docker attach 80075ddd71e8
# Чтобы отключиться от конейнера и он продолжал работать
Удерживая CTRL нажать P затем Q
===============================================
Теперь попробую запустить контейнер с мостом, настроить на нем сеть
-- Нахер вырубаю докер с его виртуальным адаптером
# service docker stop
# ip link set dev docker0 down
# brctl delbr docker0
# cp /etc/default/docker /etc/default/docker.orig
с помощью параметров DOCKER_OPTS ничего не заработало.
Зато стало лучше когда добавил параметры в other_args, причем файла /etc/sysconfig/docker
# echo 'other_args="-b=br0 -d -e lxc"' > /etc/sysconfig/docker
-b=br0 - использовать созданный мост
-e lxc - использовать расширения lxc, чтобы работали ключи --lxc-conf.
-d - стартовать в режиме демона.
The reason you can't use --lxc-conf by default is that LXC is no longer the default execution engine. If you must use --lxc-conf, you'll have to switch to the LXC execution driver by specifying -e lxc as part of DOCKER_OPTS in "/etc/default/docker".
# service docker restart
====================================
Установил lxc, чтобы настроить сеть как мне нужно.
# yum install -y \
libvirt \
libvirt-client \
python-virtinst
# chkconfig --level 345 libvirtd on
# service libvirtd restart
# chkconfig --level 345 cgconfig on
# service cgconfig restart
====================================
Сейчас так
# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.0022b0513d60 no eth1
А после старта контейнера, должно получиться так.
# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.0022b0513d60 no eth1
veth82dd
# docker run -i -t \
--lxc-conf="lxc.network.ipv4 = 192.168.1.23/24" \
centos:centos6 /bin/bash
Заработало.
Теперь по мере того, как будет наращиваться опыт и накапливаться знания, а также с развитием используемого ПО, содержание будет корректироваться.
UPD: Контейнер после запуска доступен сразу по 2-м ip адресам. 1 тот, что задал я, а второй, назначен сервисом docker. Мелочь, но неприятная.
Чтобы этого не было docker нужно стартовать с параметром запрещающим автоматическую настройку сетевых интерфейсов, в этом случае настройка сети задается при запуске контейнера.
Я сделал следующим образом.
Все вроде работате.
# docker run -i -t \
--net=none \
--lxc-conf="lxc.network.type = veth" \
--lxc-conf="lxc.network.ipv4 = 192.168.1.21/24" \
--lxc-conf="lxc.network.ipv4.gateway = 192.168.1.1" \
--lxc-conf="lxc.network.link = br0" \
--lxc-conf="lxc.network.name = eth0" \
--lxc-conf="lxc.network.flags = up" \
centos:centos6 /bin/bash
Всеравно непонятно. При перестартовке httpd, появляется сообщение:
# service httpd restart
Stopping httpd: [FAILED]
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.1.3 for ServerName
[ OK ]
Откуда этот адрес? 192.168.1.3, если единственному интерфейсу назначен совсем другой адрес?