docker 编写 nginx 和 tomcat,仅在 Internet 上公开 nginx

docker compose nginx and tomcat, expose only nginx on internet

我正在使用 Docker 组合文件来创建 nginx 和 tomcat 容器。 nginx 将用作反向代理,以便它访问 tomcat。我能够使用 Azure 容器实例通过 2 个单独的容器成功地做到这一点。你点击了 nginx 的 URL 然后你被重定向到 tomcat securley 因为 nginx 有 HTTPS 和证书。 直到一切正常。但问题是,如果您通过 http 访问单独的 tomcat Ip,您也可以访问容器,这是不安全的。我只想让 tomcat 被 nginx 访问。如何实现?我现在正在尝试使用 docker compose,我知道容器将使用相同的网络并且可以相互连接,但是我怎样才能实现 nginx 连接到 Tomcat 和 tomcat 只能通过 https 上的 nginx 重定向访问,并且 tomcat 无法通过 http 单独访问。这是我拥有的 YML,但我不知道如何管理端口来实现我想要的。这可能吗?

    version: '3.1'
services:

  tomcat:
    build:
      context: ./tomcat
      dockerfile: Dockerfile
    container_name: tomcat8
    image: tomcat:search-api
    ports:
      - "8080:8080"

  nginx:
    build:
      context: ./nginx
      dockerfile: Dockerfile
    container_name: nginx
    image: nginx:searchapi
    depends_on: 
    - tomcat 
    ports:
      - "80:80"
      - "443:443"

通过在 docker-compose 中使用端口选项,您可以在外部公开该端口。如果您从 tomcat 中删除端口选项,它应该仍然有效,因为容器应该仅在内部为 docker 网络公开端口 8080。

仅删除 tomcat 服务中 docker-compose 文件中公开的端口,反向代理将使用您自定义的 [=22] 与 docker 的内部网络一起工作=] 与容器 link 和 tomcat 容器的内部端口,这里我附上一个例子:

  version: '3.1'
    services:

      tomcat:
        # build:
        #   context: ./tomcat
        #   dockerfile: Dockerfile
        container_name: tomcat8
        image: tomcat:search-api

      nginx:
        build:
          context: ./nginx
          dockerfile: Dockerfile
        container_name: nginx
        image: nginx:searchapi
        links:
          - "tomcat"
        volumes:
          - ./proxyConf:/etc/nginx/conf.d
        depends_on: 
        - tomcat 
        ports:
          - "80:80"
          - "443:443"

proxyConf/default.conf 文件:

server {
  listen 80;
  server_name localhost;

  location / {
    proxy_pass http://tomcat:8080;
  }
}

在代理传递中,我添加 tomcat 的 docker-compose link 和 tomcat 容器的内部端口。

这是我的目录树:

C:.
│   docker-compose.yml
│
├───nginx
│       Dockerfile
│
├───proxyConf
│       default.conf
│
└───tomcat
        Dockerfile