Назад | Перейти на главную страницу

Как управлять контейнером Docker с отображением портов?

Я установил контейнер ELK Docker.

Я запускаю его с такими параметрами:

sudo docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -p 5000:5000 -it --name elk sebp/elk

Проверить чек:

sudo docker ps

CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                                                                                                      NAMES
4f42137c954d        sebp/elk:latest     "/usr/local/bin/star   22 hours ago        Up 22 hours         0.0.0.0:5000->5000/tcp, 0.0.0.0:5044->5044/tcp, 0.0.0.0:5601->5601/tcp, 0.0.0.0:9200->9200/tcp, 9300/tcp   elk            

Джо, хорошо выглядит.

Вот внешний интерфейс гостя KVM, в котором находятся контейнеры Docker:

marius @ elk: ~ $ ifconfig eth0 eth0 Link encap: Ethernet HWaddr 52: 54: 00: 15: cf: f2
inet адрес: 192.168.100.134 Bcast: 192.168.100.255 Маска: 255.255.255.0

Но порт 5044 (например, для Elastic Beats) закрыт в сетевом интерфейсе KVM:

marius@elk:~$ nc -v 192.168.100.134 5044
nc: connect to 192.168.100.134 port 5044 (tcp) failed: Connection refused

Причина этого, похоже, в том, что я создал хаос:

marius@elk:~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             172.17.0.4           tcp dpt:5000
ACCEPT     tcp  --  anywhere             172.17.0.4           tcp dpt:5044
ACCEPT     tcp  --  anywhere             172.17.0.4           tcp dpt:5601
ACCEPT     tcp  --  anywhere             172.17.0.4           tcp dpt:9200

И новый IP-адрес контейнера Docker после перезапуска будет 172.17.42.1 и 0.4

marius @ elk: ~ $ / sbin / ifconfig docker0 Link encap: Ethernet HWaddr a6: 3d: 01: 38: 7a: 6a
inet адрес: 172.17.42.1 Bcast: 0.0.0.0 Маска: 255.255.0.0

Итак, как мне перезапустить / управлять контейнером Docker таким образом, чтобы я не сталкивался с конфликтами IPtables

И как мне это исправить, не создавая каждый раз хаос Docker / IPtables? Я не хочу вручную сбрасывать Docker iptables.

В первую очередь - это потому, что вы действуете из-за небольшого заблуждения. Контейнеры Docker имеют динамическую IP-адресацию в сети Docker. Вы просите боли, если пытаетесь полагаться на статичность.

Так что не надо - просто привыкните к мысли, что, хотя контейнеры должны иметь IP-адреса для работы, вы никогда не должны обращаться к ним напрямую. У вас есть несколько способов избежать этого:

  • docker inspect + передать переменные среды в контейнеры.
  • С новым докером (1.10+) у вас есть именная служба
  • haproxy может динамически перенаправлять трафик на диапазон IP-адресов, поэтому вы можете использовать что-то вроде haproxy + confd + etcd для «обнаружения» расположения контейнеров и динамического добавления новых записей в конфигурацию haproxy.