gpt4 book ai didi

docker - 是否可以使用Http通过Http连接Docker容器

转载 作者:行者123 更新时间:2023-12-02 19:32:05 25 4
gpt4 key购买 nike

我正在尝试使用Docker来帮助部署应用程序。这个想法是有两个容器。一个是包含Nginx和Angular应用程序的前端。

FROM nginx
COPY ./dist/ /usr/share/nginx/html
COPY ./nginx.conf /etc/nginx/nginx.conf

应该联系使用 gradle-docker plugin推荐的 Spring和Dockerfile生成的基于Spring Boot的API:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

它们似乎可以单独运行(我可以在开发机器上访问它们);但是,我无法将两者连接。

我的 docker-compose.yml文件:
version: '3'
services:
webapp:
image: com.midamcorp/emp_front:latest
ports:
- 80:80
- 443:443
networks:
- app
api:
image: com.midamcorp/employee_search:latest
ports:
- 8080:8080
networks:
- app
networks:
app:

根据我对网络上Docker文档的理解,给我的印象是,这些容器将放置在同一网络中,因此可以交互,并且服务名称(例如api)充当“主机”。基于此假设,我试图通过以下方式从Angular应用程序访问API:
private ENDPOINT_BASE: string = "http://api:8080/employee";
这将返回错误: Http failure response for (unknown url): 0 Unknown Error

老实说,我看过的示例使用了这个概念(用主机的服务名称代替连接两个容器的主机),用于数据库应用程序,而不是HTTP。我试图完成的事情不可能吗?

编辑:

我的nginx.conf
worker_processes  1;


events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
location / {
index index.html index.htm;
try_files $uri $uri/ /index.html;
}

}

}

编辑:

更新了nginx.conf
worker_processes  1;


events {
worker_connections 1024;
}

http {

upstream docker-java {
server api:8080;
}

include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;


server {
listen 8081;
server_name localhost;
location / {
proxy_pass http://docker-java;
proxy_redirect off;
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-Host $server_name;
}


}

server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
location / {
index index.html index.htm;
try_files $uri $uri/ /index.html;
}

}

}

和docker-compose.yml
    version: '3'
services:
webapp:
image: com.midamcorp/emp_front:latest
ports:
- 80:80
- 443:443
networks:
- app
depends_on:
- api
api:
image: com.midamcorp/employee_search:latest
networks:
- app
networks:
app:

并且客户端/ Angular应用程序使用以下内容来联系API private ENDPOINT_BASE: string = "http://localhost:8081/employee";
docker ps的输出
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
947eb757eb4b b28217437313 "nginx -g 'daemon of…" 10 minutes ago Up 10 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp employee_service_webapp_1
e16904db67f3 com.midamcorp/employee_search:latest "java -Djava.securit…" 10 minutes ago Up 10 minutes employee_service_api_1

最佳答案

您遇到的问题并不奇怪。只是您没有明确命名容器。相反,Docker自己生成了一个名称。因此,nginx将解析employee_service_api_1,但不会仅识别api。打开您的webapp容器,然后查看您的主机(cat /etc/hosts)-它会向您显示employee_service_api_1及其IP地址。

如何解决。

container_name添加到您的docker-compose.yml中:

version: '3'
services:
webapp:
image: com.midamcorp/emp_front:latest
container_name: employee_webapp
ports:
- 80:80
- 443:443
networks:
- app
depends_on:
- api
api:
image: com.midamcorp/employee_search:latest
container_name: employee_api
networks:
- app
networks:
app:

我总是避免使用“简单”名称(即 api),因为在我的系统上cuz可能会显示多个具有相似名称的容器,因此我添加了一些前缀。在这种情况下,我将api容器命名为 employee_api,现在,一旦重新启动容器,nginx将解析为该名称。

关于docker - 是否可以使用Http通过Http连接Docker容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50297672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com