Обновление II
Теперь, 16 июля 2015 года, все изменилось. Я открыл этот автоматический контейнер из Джейсон Уайлдер:
https://github.com/jwilder/nginx-proxy
, и он решает эта проблема примерно до тех пор, пока требуетсяdocker run
контейнер. Это решение, которое я использую для решения этой проблемы.
Update
Сейчас в июле 2015 года, и ситуация кардинально изменилась с к сетевым контейнерам Docker. В настоящее время существует много разных предлагая решения этой проблемы (различными способами).
Вы должны использовать этот пост, чтобы получить базовое представление о
docker --link
подход к обнаружению службы, который примерно такой же базовый, как и он, работает очень хорошо, и на самом деле требует меньше фантазийных танцев, чем большинство других решений. Он ограничен в том, что довольно сложно подключать контейнеры на отдельных хостах в любом данном кластере, а контейнеры не могут перезапускаться после подключения к сети, но предлагают быстрый и относительно простой способ подключения контейнеров к одному и тому же хосту. Это хороший способ получить представление о том, что программное обеспечение, которое вы, скорее всего, будете использовать для решения этой проблемы, действительно выполняется под капотом.Кроме того, вы, вероятно, захотите также проверить Docker nascent
network
, Hashicorpconsul
, Weaveworksweave
, Джефф Линдсейprogrium/consul
иgliderlabs/registrator
, а GoogleKubernetes
.Также предлагаются предложения CoreOS, в которых используются
etcd
,fleet
иflannel
.И если вы действительно хотите провести вечеринку, вы можете развернуть кластер для запуска
Mesosphere
илиDeis
, илиFlynn
.Если вы новичок в сети (например, я), тогда вы должны получить свои очки для чтения, поп "Paint The Sky With Stars - The Best of Enya" на Wi-Hi-Fi, и взломать пиво - это будет время, прежде чем вы действительно поймете, что именно вы пытаетесь сделать. Подсказка: вы пытаетесь реализовать
Service Discovery Layer
в своемCluster Control Plane
. Это очень хороший способ провести субботнюю ночь.Это очень весело, но мне жаль, что я не нашел времени, чтобы лучше рассказать о сети в целом, прежде чем погрузиться. В конце концов я нашел пару сообщений от доброжелательных божеств Digital Ocean Tutorial:
Introduction to Networking Terminology
иUnderstanding ... Networking
. Я предлагаю прочитать их несколько раз перед тем, как погрузиться.Удачи!
Оригинальное сообщение
Я не могу понять, как отображать порт для контейнеров Docker
. В частности, как передавать запросы от Nginx в другой контейнер, прослушивая другой порт на том же сервере.
У меня есть Dockerfile для контейнера Nginx, например:
FROM ubuntu:14.04
MAINTAINER Me <[email protected]>
RUN apt-get update && apt-get install -y htop git nginx
ADD sites-enabled/api.myapp.com /etc/nginx/sites-enabled/api.myapp.com
ADD sites-enabled/app.myapp.com /etc/nginx/sites-enabled/app.myapp.com
ADD nginx.conf /etc/nginx/nginx.conf
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80 443
CMD ["service", "nginx", "start"]
И тогда файл конфигурации api.myapp.com
выглядит так:
upstream api_upstream{
server 0.0.0.0:3333;
}
server {
listen 80;
server_name api.myapp.com;
return 301 https://api.myapp.com/$request_uri;
}
server {
listen 443;
server_name api.mypp.com;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
proxy_pass http://api_upstream;
}
}
И еще один для app.myapp.com
.
И затем я запускаю:
sudo docker run -p 80:80 -p 443:443 -d --name Nginx myusername/nginx
И все это стоит отлично, но запросы не передаются другим контейнерам/портам. И когда я ssh в контейнер Nginx и проверяю журналы, я не вижу ошибок.
Любая помощь?