2014-10-09 3 views
2

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

# install openssh server and ssh client 
RUN yum install -y openssh-server 
RUN yum install -y openssh-clients 

RUN echo 'root:password' | chpasswd 

RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config 
RUN sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config 

EXPOSE 22 
CMD ["/usr/sbin/sshd", "-D"] 

я запускаю этот образ, как так:

sudo docker run -d -P crystal/ssh 

Когда я пытаюсь посмотреть на контейнер с sudo docker ps, я вижу порты :

0.0.0.0:49154->22tcp 

Если я ifconfig на хост-машине (Ubuntu), я вижу docker0 инет эл: 172.17.42.1. Я могу выполнить ping с моей главной машины, но не с любой другой машины. Что я делаю неправильно в настройке контейнера, чтобы посмотреть на внешний мир? Благодарю.

Edit:

Я попытался осматривая IPAddress контейнера и я вижу IPAddress: 172.17.0.28, но я не могу пинг, что либо ...

Если я пытаюсь птар, что, кажется, чтобы вернуться порты. Значит ли это, что он открыт, и я должен быть в состоянии ssh в него, если у меня есть ssh? Благодарю.

nmap -p 49154 10.211.55.1 показывает, что порт открыт с неизвестной услугой.

Я пытался SSH в по SSH корень -l -p 49154 10.211.55.1 и я получаю

Read from socket failed: Connection reset by peer. 
+0

Вы пытались подключиться к общедоступному IP-адресу главной машины на порту 49154? Я имею в виду IP-адрес интерфейса eth0? – Jiri

+0

@Jiri Я попробовал 'nmap -p 49154 ' и что вернулся: '49155/tcp, open, service unknown' – Crystal

ответ

1

UPDATE

Ваш Dockerfile неправильно. Ваш sshd настроен неправильно, он не запускается должным образом, и причина в том, что контейнер не отвечает на порт 22 правильно. См. Ошибки:

Could not load host key: /etc/ssh/ssh_host_rsa_key 
Could not load host key: /etc/ssh/ssh_host_dsa_key 

Необходимо создать ключи хоста. Эта линия будет делать магию:

RUN ssh-keygen -P "" -t dsa -f /etc/ssh/ssh_host_dsa_key 

ПРЕДЫДУЩИЙ ОТВЕТ

Вы, вероятно, нужно искать IP-адрес интерфейса eth0 (который доступен из сети), и вам необходимо подключить к контейнеру с помощью этого Айпи адрес. Трафик с/на docker0 мост должен быть перенаправлен по умолчанию на ваши эти интерфейсы.

Кроме того, вы лучше проверить, если у вас включена функция переадресации IP:

cat /proc/sys/net/ipv4/ip_forward 

Эта команда должна возвращать 1, в противном случае вы должны выполнить:

sudo echo 1 > /proc/sys/net/ipv4/ip_forward 

Q: Почему вы можете подключить этот способ контейнер?

Если у вас включена переадресация ip, пакеты, входящие из eth0-интерфейса, перенаправляются в виртуальный интерфейс docker0. Магия происходит, и пакет принимается в правильном контейнере. См. Docker Advanced Networking для получения более подробной информации:

Но docker0 не является обычным интерфейсом. Это виртуальный мост Ethernet , который автоматически пересылает пакеты между любыми другими сетевыми интерфейсами , которые прилагаются к нему. Это позволяет контейнерам связывать как с главной машиной, так и друг с другом. Каждый раз, когда Docker создает контейнер, он создает пару «равноправных» интерфейсов, которые являются , как противоположные концы трубы - пакет, посланный на один, будет получен с другой. Он дает одному из сверстников контейнеру стать его eth0 интерфейсом и сохраняет другого партнера с уникальным именем, например vethAQI2QT, в пространстве имен хост-машины. Связывая каждый интерфейс veth * с мостом docker0, Docker создает виртуальную подсеть , совместно используемую между главной машиной и каждым контейнером Docker.

+0

Как я могу подключиться к ip-адресу контейнера с адреса eth0? скажем, ipock докера - 172.17.42.5, а eth0 - 10.211.55.1, то как мне подключиться из внешнего мира? В стороне, я пытаюсь войти в докеры. (Http://docs.docker.io.s3-website-us-west-2.amazonaws.com/examples/running_ssh_service/). ip_forward сделал возврат 1. – Crystal

+0

@Crystal Вы не можете подключиться к «контейнеру IP-адреса» извне, но (только) пакеты на определенный хост-порт в eth0 пересылаются в контейнерный порт. Я обновил свой ответ. – Jiri

0

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

Кроме того, 172.17.42.1 является ip моста docker0, а не ip вашего экземпляра докера. Если вы хотите знать ip экземпляра докера, вам нужно запустить ifconfig внутри него или вы можете использовать docker inspect

Я не эксперт в отношении сопоставления портов, но до меня это означает, что для доступа к контейнеру докера порт 22 вам необходимо подключиться к порту 49154 хоста, и весь трафик будет перенаправлен.

+0

Я обновил свой вопрос, но я попытался выполнить ping ip из команды' inspect', и я продолжаю получить тайм-аут запроса. – Crystal

+0

С внешней стороны вы всегда будете получать тайм-аут запроса для ping, потому что это частный адрес. Если вы запускаете другой контейнер докеров, каждый докер может пинговать другой, но ни один хост не может их вызывать извне. До команды 'ssh' я думаю, что ответ Джири может быть решением. – mgaido

Смежные вопросы