我们有一个项目,我们必须构建两个独立的系统-人员和项目(某些小组必须实施人员,而其他小组必须实施项目-我们必须实施人员)。 每个数据库都有一个单独的数据库,它们必须彼此交换信息。我认为那没有问题。
问题出现在docker-compose.yml文件中:
version: "3.1"
services:
proxy:
image: nginx:1.15-alpine
ports:
- 8080:80
volumes:
- ./proxy/conf/nginx.conf:/etc/nginx/nginx.conf:ro
- ./proxy/conf/domain.conf:/etc/nginx/domain.conf:ro
depends_on:
- projekt
- person
# ========================================
# Falls Sie das Person-SCS implementieren,
# überschreiben Sie diesen Teil
persondb:
image: mysql
environment:
- "MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}"
- "MYSQL_DATABASE=${MYSQL_DATABASE}"
- "MYSQL_USER=${MYSQL_USER}"
- "MYSQL_PASSWORD=${MYSQL_PASSWORD}"
volumes:
- ./data:/var/lib/mysql
person:
#networks:
# - default
build: ./person-scs/.
depends_on:
- persondb
environment:
- "MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}"
- "MYSQL_DATABASE=${MYSQL_DATABASE}"
- "MYSQL_USER=${MYSQL_USER}"
# ========================================
# Falls Sie das Projekt-SCS implementieren,
# überschreiben Sie diesen Teil
projekt:
image: hashicorp/http-echo
command: -listen=:8080 -text="Hello from projekt"
projektdb:
image: hashicorp/http-echo
command: -listen=:3306 -text="I am just a dummy"
# ========================================
docker-compose的整个代理部分是由我们的讲师以及projekt和projektdb部分提供给我们的(因为我们没有实现项目SCS)。
其中一项指示是,“从外部”看不到除8080以外的任何端口,并且我们必须通过“ localhost:8080 / person”调用Person-API。截至目前,当我呼叫本地主机时,我收到带有404消息的Whitelabel错误页面。
当我忽略代理服务器并在Person目录中实现docker-compose(具有相同的Dockerfile)时,看到localhost:8080 / person页面就没有问题,一切正常。
他们没有给我们编写docker-compose文件的背景知识,所以我什至不确定Google。希望有人能够给小费。
编辑:
nginx.conf看起来像这样:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/domain.conf;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
server {
listen 80 default_server;
location / {
proxy_pass http://person:8080/;
}
}
}
和domain.conf文件:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
# Assets
# location / {
# root /usr/share/nginx/html;
# index index.html index.htm;
# }
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
# set maximum allowed files
client_max_body_size 10M;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location /person {
proxy_pass http://person:8080/;
}
location /projekt {
proxy_pass http://projekt:8080/;
}
}
我知道"...proxy_pass..."
的部分是在两个domain.conf和nginx.conf文件,它似乎并不成为问题。
不知道它是否相关,但是我也在使用Spring Boot。
答案 0 :(得分:0)
这真的不是问题,这是一个完整的任务。
首先,您需要了解docker的桥接网络的工作原理-它由docker-compose
自动设置,并且文件中声明的所有服务都包含在其中。您不要需要公开服务之间的端口 -网络内部它们都公开。
您要做的是将端口暴露在外部-根据您的情况,根据任务是8080
。因此,它将是您应用程序的唯一入口点。您从web
公开了它-这是一个错误。如果只有一个外部端口,则将其授予nginx
,然后让nginx
内部转发到网桥网络中的适当服务。
您必须提供nginx.conf
以获得详细信息,但通常看起来会像这样:
...
http {
server {
listen 80 default_server; # start listen on 80 inside network
location / { # forward all requests ...
proxy_pass http://web/; # to "web" container
}
}
然后将nginx
暴露在外面:
docker-compose.yml
...
nginx:
ports:
- "8080:80"
数据库的所有端口都在您的网络内部内部使用,不应暴露。