在Nginx配置文件中访问容器名称

时间:2016-12-12 12:04:28

标签: nginx docker docker-compose

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

没关系,我现在可以使用容器名称ping服务,但是如何在Nginx Upstream声明中引用容器的名称?在容器之间进行访问是最好还是更好的做法?

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 network inspect 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": {}
    }
]

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

$(document).ready(function() {
    function viewPeriods() {
        $.ajax({
            type: "POST",
            data: {
                type: "view"
            },
            url: "/staff/main/ajax/marking-periods.php",
            success: function(data) {
                $("#periods").hide().html(data).fadeIn();
            }
        });
    }

    $("#save-new").click(function() {
        var title = $("#title").val();
        var start = $("#start").val();
        var end = $("#end").val();
        var gstart = $("#gstart").val();
        var gend = $("#gend").val();
        var ptype = $("#type").val();

        $.ajax({
            type: "POST",
            data: {
                title: title,
                start: start,
                end: end,
                gstart: gstart,
                gend: gend,
                ptype: ptype,
                type: "add"
            },
            url: "/staff/main/ajax/marking-periods.php",
            dataType: "json",
            success: function(data) {
                $.notify({
                    icon: data.icon,
                    title: data.title,
                    message: data.message 
                },
                {
                    element: 'body',
                    allow_dismiss: true,
                    newest_on_top: false,
                    type: data.status,
                    icon_type: 'class',
                    template: '<div data-notify="container" class="col-xs-11 col-sm-3 alert alert-{0}" role="alert">' +
                        '<button type="button" aria-hidden="true" class="close" data-notify="dismiss"><i class="fa fa-times"></i></button>' +
                        '<span data-notify="icon"></span> ' +
                        '<span data-notify="title">{1}</span> ' +
                        '<span data-notify="message">{2}</span>' +
                    '</div>' 
                });

                $("#new-period").modal("hide");

                viewPeriods();
            }
        });
    });

    viewPeriods();
});

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

upstream jenkins {
  server jenkins1:8080;
}

这会将所有访问您的nginx容器端口的流量定向到jenkins1服务容器上的端口8080。

编辑基于更新的问题

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

location / {
      proxy_pass https://jenkins;
    }