У меня есть контейнер сервлета Java, работающий в edge_web_1, к которому я могу получить доступ через порт 8080, и я не могу получить доступ к 80 или 443 через edge_nginx_1. Любые идеи?
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
99c26fe2117e nginx:1 "nginx -g 'daemon ..." 27 minutes ago Up 27 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp edge_nginx_1
571ef4787dbc edge_web "/tmp/entrypoint.sh" 27 minutes ago Up 27 minutes 0.0.0.0:8080->8080/tcp edge_web_1
7f0c15522a70 mongo:3 "/entrypoint.sh mo..." 58 minutes ago Up 27 minutes 27017/tcp edge_db_1
С хоста докера:
# curl localhost:8080
{"code":404,"message":"HTTP 404 Not Found"}
(Ответ json означает, что я дошел до контейнера сервлета, для этого подходит 404).
# curl localhost:80
curl: (52) Empty reply from server
Я получаю то же самое для 443. Я пытался использовать 18080 вместо 80 на случай, если это связано с привилегированными портами. Хост создается с помощью докер-машины с драйвером digitalocean. Контейнеры настроены с помощью docker-compose, и все это работает как локально, так и с драйвером виртуального бокса.
Любопытно (для меня), что на виртуальной машине docker-machine все настроено для работы от имени пользователя докера, в digitalocean, похоже, он работает от имени пользователя root. Правила iptables тоже сильно отличаются, но правила digitalocean для 80 ничем не отличаются от 8080.
# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
DOCKER-ISOLATION all -- 0.0.0.0/0 0.0.0.0/0
DOCKER all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain DOCKER (1 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.17.0.4 tcp dpt:8080
ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:80
Chain DOCKER-ISOLATION (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Расчетное время прибытия:
Кажется, это связано с тем, что экземпляр докер-машины digitalocean не обрабатывает тома. Глядя на контейнер nginx, он не содержит файлов из томов. Я могу воспроизвести его только с помощью этих:
докер-compose.yml
nginx:
image: nginx:1
ports:
- "80:80"
volumes:
- ./testconf:/etc/nginx/conf.d
- ./testhtml:/usr/share/nginx/html
testconf/nginx.conf
server {
listen 80;
server_name _;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ @proxy;
}
}
testhtml/index.html
<!DOCTYPE html>
<html>
<body>
<p>Hello</p>
</body>
</html>