2016-08-02 4 views
2

Я новичок в докере, и я докционировал все свое приложение на одном сервере. Пока все хорошо и работает. Однако я ничего не понимаю. Я использую docker-compose для всего (я еще не создал файл докеров для моих проектов), и есть атрибут ports в docker-compose. Если я пишу что-то вроде этого:сделать перезагрузку IP-порта док-станции?

ports: 
    8085:80 

Он будет слушать 0.0.0.0:8085, что означает внешний мир имеет доступ к моему серверу. После некоторых дискуссий и Google-ING, я обнаружил, что я могу взять IP-адрес в моей сети Docker моста и делать сопоставление портов легко:

ports: 
    172.17.0.1:8085:80 

Это будет слушать только на 172.17.0.1:8085, который является большим, как он только слушает внутри, а мой nginx проксирует трафик на необходимые порты. (например, proxy_pass http://172.17.0.1:8085). Узнав больше о докере и понимая, как они работают, я понял, что все эти контейнеры имеют свои собственные IP-адреса с портами, открытыми только для этих адресов. Например, один из моих «веб-контейнеров» имеет IPv4-адрес 172.17.0.10, а порт 80 выставлен. Если я сделаю docker inspect в одном из этих контейнеров, я увижу IP-адрес контейнера.

Теперь я хочу использовать эти IP-адреса в своем nginx. Вместо proxy_pass http://172.17.0.1:8085, я хочу сделать http://172.17.0.10. Я лично считаю, что это очень элегантный интерфейс, но есть одна вещь, которая касается меня. Что произойдет, если я перезапущу свою машину? Все контейнеры начнутся в каком-то порядке. Если у меня есть 5 веб-контейнеров и они начинаются в произвольном порядке, могу ли я быть уверенным, что IP-адреса для этих контейнеров будут одинаковыми? Или они изменятся? Должен ли я всегда использовать ports в docker-compose для использования nginx? Если да, как я могу использовать разные IP-адреса для каждого контейнера вместо разных портов с одним и тем же IP-адресом? Будет ли хорошо, если я создам другой сетевой интерфейс докеры (скажем, в подсети 172.17.1.0) и назначат разные IP-адреса этого интерфейса для открытых «открытых» портов? Под этим я подразумеваю в основном использование 172.17.1.1:80:80 в одном контейнере, 172.17.1.2:80:80 в другом и т. Д.

ответ

2

Не эксперт в области докер-сети, но я постараюсь ответить на вопросы, которые вы получили там.

Вопрос: Что произойдет, если я перезапущу свою машину? Все контейнеры начнутся в каком-то порядке.
A: Если вы не используете ключевые слова links или depends_on, в противном случае вы не можете гарантировать начальную последовательность.

Вопрос: Если у меня есть 5 веб-контейнеров, и они начинаются в произвольном порядке, могу ли я быть уверенным, что IP-адреса для этих контейнеров будут одинаковыми?
A: Я сделал небольшой эксперимент на своей машине, обратив внимание на ipaddresses из моих существующих 2 контейнеров (postgresDB и infuxDB).

Они работают на

  1. Postgres: 172.17.0.2
  2. InfluxDB: 172.17.0.3

Закройте его и загрузить снова. Вероятно, из-за того, что на этот раз они загружаются на тот же порядок, ip-адреса, похоже, поддерживаются.Добавлено ключевое слово depends_on, чтобы заставить контейнер InfluxDB начать сначала до того, как Postgres может, теперь IP-адреса обоих контейнеров;

  1. Postgres: 172.17.0.3
  2. InfluxDB: 172.17.0.2

Я думаю, что IP распределяется на основе на первый пришел первый обслужен. Если вы не указали заказ на загрузку контейнеров, я думаю, что существует небольшая вероятность того, что ip может быть другим для контейнеров. Действительно зависит от того, кто работает первым.

Q: Должен ли я всегда использовать порты в докер-компоновке для использования nginx?
A: Да, если вы хотите перенести порт экземпляра nginx во внешний мир. В противном случае никто не сможет ударить по этому веб-серверу. Например. выставляя порт 443, чтобы пропускать HTTPs.

Вопрос: Как я могу использовать разные IP-адреса для каждого контейнера вместо разных портов с одним и тем же IP-адресом?
A: Я не знаю, возможно ли это или нет, но после того, как вы проведете какое-то исследование для документации документации для докеров, это возможно с помощью ключевого слова ipam.

См:
https://docs.docker.com/compose/compose-file/#/ipam

Это выглядит страшно мне так, что я сделал для моего собственного проекта было использовать service_name вместо этого.

Пример:

container_bbb: 
    image: banana 

my_nginx: 
    image: apple 
    environment: 
     - MOUNT_SRC0=http://container_bbb:80 
     - MOUNT_DEST0=/ 
    links: 
     - container_bbb 

В этом случае в my_nginx контейнере, имя службы container_bbb будет разрешен в имени хоста этого контейнера. Тогда у меня будет скрипт python, который будет динамически генерировать конфигурацию ngix, используя эту информацию в области сценария точки входа контейнера.

Звучит немного излишне, но это дает мне больший контроль над тем, что я хочу делать с моим nginx.

Так что в моих /etc/nginx/conf.d/default-locations/ конфигурациях было бы что-то типа;

location /container_bbb/ { 
    proxy_pass http://container_bbb:3000/; 
} 

Примечание: Я использую этот экземпляр сервера Nginx в качестве обратного прокси-сервера.

Я предполагаю, что я пытаюсь сказать здесь, что вы можете по существу использовать имя хоста вместо ip-адреса. И чтобы добраться до контейнера по соседству, вы перейдете в http://CONTAINER_SERVICE_NAME:PORT

1

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

E.g., Если ваш веб-приложение было названо php, ваш Nginx прокси конфигурации будет выглядеть примерно так:

location/{ 
    proxy_pass http://php; 
    proxy_set_header Host $host; 
    proxy_redirect  off; 
} 

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