【问题标题】:Access container name in Nginx configuration file访问 Nginx 配置文件中的容器名称
【发布时间】:2016-12-12 12:04:27
【问题描述】:

在 Docker 中,我使用 docker network create usta_network 命令创建了一个新网络,并在 docker-compose.yml 文件的服务声明中引用了这个网络。

没关系,我现在可以使用容器名称 ping 服务,但是如何在 Nginx 上游声明中引用容器名称?在容器之间引入访问的最佳或更好的做法是什么?

docker.compose for nginx

version: '2'

services:
   nginx-main:
      image: nginx:latest
      ports:
         - "80:80"
      volumes:
         - ./nginx.conf:/etc/nginx/nginx.conf:ro
         - /var/log/nginx:/var/log/nginx
      container_name: nginx_main
networks:
   default:
      external:
         name: usta_network
./nginx.conf

用户 nginx;

http {

    server {
       listen 80;
       index index.php index.html index.htm;
       server_name example.org www.example.org;

       location / {

         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_pass http://rahmanusta_upstream;
       }
    }

    upstream rahmanusta_upstream {

      server rahmanusta_wp:6565;

    }
}

docker-compose for mysql + wordpress

version: '2'

services:
   mysql-db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: pass
       MYSQL_DATABASE: mysql_db
       MYSQL_USER: root
       MYSQL_PASSWORD: pass
     container_name: mysql_db

   rahmanusta-wp:
     depends_on:
       - mysql-db
     image: wordpress:latest
     ports:
       - "6565:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_PASSWORD: pass
     container_name: rahmanusta_wp
volumes:
    db_data:
networks:
   default:
      external:
         name: usta_network

docker 网络检查 usta_network

[
    {
        "Name": "usta_network",
        "Id": "b971429c1ddcfa791bdfff0a6f9463ab9cfb9ae04ba6a3aa60ce08ca11d0a5ab",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.20.0.0/16",
                    "Gateway": "172.20.0.1/16"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "16cc89ca548fe90fb8ed9431d8e9633c341373344304ec3320acee1a81090709": {
                "Name": "rahmanusta_wp",
                "EndpointID": "d310cbf9617958226d36d5f9e0d804c113093097669b1d5ae8bed90d31dfca2f",
                "MacAddress": "02:42:ac:14:00:03",
                "IPv4Address": "172.20.0.3/16",
                "IPv6Address": ""
            },
            "5b0f7a7d95b23b6e69b17f85ebff5d652bdbcba305755169c6b9f78199fbf346": {
                "Name": "mysql_db",
                "EndpointID": "d2c304b450ce96d309ef51319aa42336bb742d99db095e98e129e547aee820c3",
                "MacAddress": "02:42:ac:14:00:02",
                "IPv4Address": "172.20.0.2/16",
                "IPv6Address": ""
            },
            "addf3c475fcfd5566b3d1c4b4a951f78978c07265211746f79711f38c5cd9649": {
                "Name": "nginx_main",
                "EndpointID": "3f4106184dbe805c509011c3dc42c673c85fcf2eb08441a5ecf24b9c5c68e2d4",
                "MacAddress": "02:42:ac:14:00:04",
                "IPv4Address": "172.20.0.4/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

谢谢。

【问题讨论】:

    标签: nginx docker docker-compose


    【解决方案1】:

    在您的 docker-compose.yml 中,您将使用它们的相关名称命名每个服务。假设我在名为 jenkins1 的 nginx docker 容器后面创建了一个 jenkins 实例。

    在我的 nginx.conf 文件的 http 部分中,我将上游服务器命名为:

    upstream jenkins {
      server jenkins1:8080;
    }
    

    在服务器块中,我可以如下调用它;

    location / {
          proxy_pass https://jenkins;
        }
    

    这会将所有到达您的 nginx 容器端口的流量引导到 jenkins1 服务容器上的端口 8080。

    根据更新后的问题进行编辑

    在您的 docker-compose.yml 中,使用外部链接从 .yml 文件外部链接两个容器。您的 nginx 服务部分应为:

    services:
       nginx-main:
          image: nginx:latest
          ports:
             - "80:80"
          volumes:
             - ./nginx.conf:/etc/nginx/nginx.conf:ro
             - /var/log/nginx:/var/log/nginx
          external_links:
             - rahmanusta_wp
             - mysql_db
          container_name: nginx_main
    

    【讨论】:

    • 我添加了我的配置文件,但我无法像您的建议那样连接到其他容器。你有什么想法吗?
    • 您是否能够从您的 NGINX 容器中 ping 容器主机名,或者当您运行它时它会抱怨未知的上游主机?当你在浏览器上打开 80 端口时,你会得到 NGINX 登陆页面吗?
    • @RahmanUsta 你能在容器运行时添加“docker network inspect usta_network”的输出吗?
    • 是的,它正在ping nginx_main 容器内的rahmanusta_wp 容器。顺便说一句,我添加了检查命令的输出,它在上面。
    • 不知道还是连接不上,nginx报502 Bad Gateway
    猜你喜欢
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多