Chcę uzyskać dostęp do instancji ownCloud przez Nginx, oba skonfigurowane w oddzielnych kontenerach Docker. Więc zrobiłem docker-compose.yml
:
nginx:
image: nginx
ports:
- 80:80
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
links:
- owncloud
owncloud:
image: owncloud
ports:
- 6789:80
volumes:
- ~/ownCloud:/var/www/html/data
I nginx.conf
do pośredniczenia żądań o następującej treści:
http {
server {
listen 80 default;
server_name docker.dev;
location / {
proxy_pass http://127.0.0.1:6789;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
events {}
Wydaje mi się to słuszne, ale Nginx wylogowuje taką wiadomość:
[error] 6#6: *8 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.99.1, server: docker.dev
Co ja robię źle?
Odpowiedzi:
2 dla odpowiedzi № 1Problem polega na tym, że wewnątrz kontenera nginx 127.0.0.1:6789
nie będzie mapowany na własną chmurę. Wynika to z faktu, że doker jest tylko portem mapowania 80
na porcie owncloud 6789
na maszynie hosta.
Wyobraź sobie, że każdy pojemnik, a host dokerów to zupełnie osobna maszyna. W takim przypadku maszyna nginx wysyła żądanie do 127.0.0.1
który jest sam w sobie, a nie maszyną hosta, a nie maszyną własnej chmury.
Istnieje wiele sposobów komunikacji między kontenerami dokerów, a ty już korzystasz z jednego z nich, wbudowanego komponowania dokerów system łączenia.
W Twoim docker-compose.yml
już powiązałeś własną chmurę z nginx, co jest poprawne. To powoduje edycję kontenerów nginx /etc/hosts
plik do mapy owncloud
adres IP kontenera owncloud. (Możesz to sprawdzić, uruchamiając docker exec name_of_nginx_container cat /etc/hosts
). Oznacza to, że wewnątrz kontenera Nginx http://owncloud
mapy do portu 80
na stronie właściciela własnej chmury.
Mając to na uwadze, jest to pełna konfiguracja, która współpracuje z systemem łączenia komponentu dokera.
docker-compose.yml
nginx:
image: nginx
ports:
- 80:80
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
links:
- owncloud
owncloud:
image: owncloud
expose:
- 80
volumes:
- ~/ownCloud:/var/www/html/data
nginx.conf
http {
server {
listen 80 default;
server_name docker.dev;
location / {
proxy_pass http://owncloud;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
events {}
Jedyne różnice polegają na tym, że wystarczy ujawnić port 80
na obrazie własnej chmury, nie mapuj go na hosta i proxy_pass
wyrysować nginx.conf
.
Nadzieja, która pomaga.