2016-05-12 4 views
0

Я недавно начал работу с Docker Compose и последовал за введением официальных документов. Первый пример, который я сделал (см. here), определяет два контейнера внутри docker-compose.yml, и, если я их правильно понимаю, контейнеры связаны по умолчанию. Их .yml выглядит так же, как у меня:Docker compaged не удается правильно настроить ссылки на контейнер

version: '2' 
services: 
    web: 
    build: . 
    ports: 
    - "5000:5000" 
    volumes: 
    - .:/code 
    depends_on: 
    - redis 
    redis: 
    image: redis 

Однако, используя Docker Exec для того, чтобы посмотреть внутри запущенного веб-контейнера показывает, что нет никакой записи DNS для Redis в /и т.д./хостов. Я также не могу выполнить пинг для контейнера redis по имени, он работает только для IP-адреса контейнера. Это мой/и т.д./хосты:

127.0.0.1  localhost 
::1  localhost ip6-localhost ip6-loopback 
fe00::0 ip6-localnet 
ff00::0 ip6-mcastprefix 
ff02::1 ip6-allnodes 
ff02::2 ip6-allrouters 
172.18.0.3  e886da2c2a78 

Я также рассмотрел отчеты об ошибках на Github, но предложения, которые я нашел не работал для меня до сих пор. Я могу исключить возможность, которая связана с любыми проблемами брандмауэра, поскольку firewalld не работает на моем хосте.

Любые идеи?

Моя установка:

  • Docker версия 1.11.1
  • Docker Compose версия 1.7.1
  • ОС: Ubuntu 16.04 на Oracle VirtualBox на Win7
+2

Вы пытались использовать ссылки вместо depend_on. Если я не ошибаюсь, depend_on просто определяет начальный порядок контейнеров, но не делает ссылку через файл/etc/hosts. – bartimar

+0

Привет @bartimar. Да, я уже пробовал, но не успел. – pklndnst

+1

Файл hosts не изменен для связи контейнера с контейнером, это делается с помощью внутреннего разрешения DNS службой DNS докера, я считаю, поэтому проверка файла hosts не будет показывать ничего, даже если он работает. Странно, что ping не работает. Я посмотрю, смогу ли я воспроизвести через минуту. – johnharris85

ответ

1

Я использую:

$ docker --version 
Docker version 1.11.1, build 5604cbe 

Если я использую ваш docker-compose.yml файл дословно, и следующий Dockerfile дать docker-compose что-то build: ...

FROM alpine 
RUN apk add --update darkhttpd 
CMD ["darkhttpd", "/var/www/localhost/htdocs"] 

Тогда я начинаю все вверх:

$ docker-compose up -d 

А затем введите веб-контейнер:

$ docker exec -it outofbounds_web_1 sh 

И затем пинг redis:

/ # ping -c 1 redis 
PING redis (172.20.0.2): 56 data bytes 
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.166 ms 

--- redis ping statistics --- 
1 packets transmitted, 1 packets received, 0% packet loss 
round-trip min/avg/max = 0.166/0.166/0.166 ms 

Все просто работает.

Как уже упоминалось в комментариях, нет изменений в /etc/hosts, поскольку теперь разрешение имен обрабатывается через поиск DNS.

+0

вы можете сделать '$ docker exec -it outofbounds_web_1 ping -c 1 redis' :) :) – bartimar

+0

Да. Дело в том, что обнаружение служб на основе имени должно работать из коробки, и вам не нужно будет использовать имя хоста на основе id (например, «c8e728098d19»), как вы предложили в комментариях к вопросу. – larsks

+0

@larsks, выполняющий ping для * redis *, работает для меня сейчас после перезагрузки. Раньше у меня была ошибка «неизвестного хоста». Thx за помощью! – pklndnst