Почему мой сетевой запрос прокси-сервера работает локально, но не работает? - PullRequest
0 голосов
/ 01 ноября 2018

Я работаю над проектом по созданию внешнего интерфейса для частного / безопасного реестра докеров. Я делаю это с помощью docker-compose для создания сети между внешним интерфейсом и реестром. Моя идея состоит в том, чтобы использовать экспресс для обслуживания моего сайта и пересылать запросы от клиента в реестр через сеть докеров.

Локально все отлично работает ....

Однако в производственной среде клиент не получает ответ из реестра. Я могу войти в реестр и получить доступ к его API через почтальона (для каталога) на https://myregistry.net:5000/v2/_catalog. Но ... клиент просто выдает ошибку.

когда я захожу в контейнер экспресс-сервера и пытаюсь свернуть созданную мной конечную точку для запросов прокси, я получаю это

curl -vvv http://localhost:3000/api/images
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 3000 (#0)
> GET /api/images HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.61.1
> Accept: */*
>
* Empty reply from server
* Connection #0 to host localhost left intact
curl: (52) Empty reply from server

и возвращаемая ошибка включает _currentUrl из https://username:password@registry:5000/v2/_catalog

мой файл docker-compose выглядит так ...

version: '3'
services:
  registry:
    image: registry:2
    container_name: registry
    ports:
      # forward requests to registry.ucdev.net:5000 to 127.0.0.1:443 on the container
      - "5000:443"
    environment:
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
      REGISTRY_HTTP_ADDR: 0.0.0.0:443
      REGISTRY_HTTP_TLS_CERTIFICATE: /certs/fullchain.pem
      REGISTRY_HTTP_TLS_KEY: /certs/privkey.pem
    volumes:
      - /etc/letsencrypt/live/registry.ucdev.net/fullchain.pem:/certs/fullchain.pem
      - /etc/letsencrypt/live/registry.ucdev.net/privkey.pem:/certs/privkey.pem
      - ./auth:/auth
    restart: always
  server:
    image: uc/express
    container_name: registry-server
    ports:
      - "3000:3000"
    volumes:
      - ./:/project
    environment:
      NODE_ENV: production
    restart: always
    entrypoint: ["npm", "run", "production"]

пример моего внешнего запроса выглядит следующим образом ...

axios.get('http://localhost:3000/api/images')
      .then((response) => {
        const { data: { registry, repositories } } = response;
        this.setState((state, props) => {
          return { registry, repositories }
        })
      })
      .catch((err) => {
        console.log(`Axios error -> ${err}`)
        console.error(err)
      })

и этот запрос отправляется на экспресс-сервер, а затем в реестр, как это ...

app.get('/api/images', async (req, res) => {
  // scheme is either http or https depending on NODE_ENV
  // registry is the name of the container on the docker network
  await axios.get(`${scheme}://registry:5000/v2/_catalog`)
  .then((response) => {
    const { data } = response;
    data.registry = registry;
    res.json(data);
  })
  .catch((err) => {
    console.log('Axios error -> images ', err);
    return err;
  })
})

любая помощь, которую вы могли бы предложить, была бы великолепна! спасибо!

1 Ответ

0 голосов
/ 02 ноября 2018

В данном конкретном случае это была проблема, связанная с брандмауэром, за которым стоял сервер. запросы, поступающие из док-контейнеров, были заблокированы. Чтобы решить эту проблему, мы должны были явно установить network_mode для моста. это позволило запросам из контейнеров вести себя правильно. окончательный файл docker-compose выглядит так

version: '3'
services:
  registry:
    image: registry:2
    container_name: registry
    # setting network_mode here and on the server helps the express api calls work correctly on the myregistry.net server.
    # otherwise, the calls fail with 'network unreachable' due to the firewall.
    network_mode: bridge
    ports:
      # forward requests to myregistry.net:5000 to 127.0.0.1:443 on the container
      - "5000:443"
    environment:
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
      REGISTRY_HTTP_ADDR: 0.0.0.0:443
      REGISTRY_HTTP_TLS_CERTIFICATE: /certs/fullchain.pem
      REGISTRY_HTTP_TLS_KEY: /certs/privkey.pem
    volumes:
      - /etc/letsencrypt/live/myregistry.net/fullchain.pem:/certs/fullchain.pem
      - /etc/letsencrypt/live/myregistry.net/privkey.pem:/certs/privkey.pem
      - ./auth:/auth
    restart: always
  server:
    image: uc/express
    container_name: registry-server
    network_mode: bridge
    ports:
      - "3000:3000"
    volumes:
      - ./:/project
    environment:
      NODE_ENV: production
    restart: always
    entrypoint: ["npm", "run", "production"]
...