标签: docker-network

Compose 文件中的 --add-host=host.docker.internal:host-gateway 等效项是什么

从 Docker 版本20.10https://github.com/moby/moby/pull/40007)开始,有一个新的特殊字符串host-gateway,可以在--add-host运行标志中使用,以允许从 docker 容器内部直接连接到本地计算机在基于 Linux 的系统上。这非常好。

--add-host=host.docker.internal:host-gateway但是Compose 文件中的等价物是什么?

例如在:

$ docker run \
  --rm \
  --name postgres \
  -p "5433:5432" \
  -e POSTGRES_PASSWORD=**** \
  --add-host=host.docker.internal:host-gateway \
  -d postgres:14.1-bullseye
Run Code Online (Sandbox Code Playgroud)

相同的标志如何--add-host适合这个 Docker Compose 等效模板:

version: '3.9'

services:
  postgres:
    image: postgres:14.1-bullseye
    environment:
      POSTGRES_PASSWORD: ****
    ports:
      - "5433:5432"
Run Code Online (Sandbox Code Playgroud)

肯定不是:network_mode: host在服务级别(参见#Doc)。

linux docker docker-compose docker-network

49
推荐指数
1
解决办法
8万
查看次数

错误:根据名称找到 2 个匹配项:network <nameofservice>_default 不明确

我正在docker使用命令构建图像

docker-compose -f "docker-compose.yml" up -d --build 
Run Code Online (Sandbox Code Playgroud)

但它返回一个错误

ERROR: 2 matches found based on name: network officeconverter_default is ambiguous

这有点清楚,在我的机器上有两个同名的网络试图存在。

问题是如何从 docker 网络中删除网络

PS E:\repos\Github\officeconverter> docker network ls
网络 ID 名称驱动程序范围
868c88a83bd6桥桥本地
92f7d20ed432 officeconverter_default 桥接本地
3f96cfb7b591 officeconverter_default 桥接本地

docker docker-compose docker-network

23
推荐指数
2
解决办法
6485
查看次数

无法分配请求的地址 (localhost:xxxx) - Docker + Linux 容器

我们有一个 WPF 应用程序,它将调用一个名为 API-1 的 Web API,该 API 在 Docker 容器中运行。我还有另一个名为 API-2 的 API,它也在 docker 中运行,但在不同的容器中。

每当应用程序发生 API-1 调用时,API-1 都会执行一些逻辑并尝试向 API-2 发出发布请求。

现在,我的问题是,对 API-2 的 post 请求总是返回Cannot allocate requested address (localhost:XXXX)

如果我尝试不使用 docker,效果很好。此外,对每个 API 的单独请求也可以正常工作(使用 POSTMAN)

仅当 API 部署在 docker 中时才会出现此问题。我使用 docker-compose 来创建容器。我创建了一个 docker 网桥,并将其分配给 docker-compose.yml 文件中的相应 API。

这是我的 docker-compose 文件以及两个 API 的 docker 文件。

Docker-Compose.yml

version: "3.7"

networks : 
  localdev:
    name: localdev
    external: true

services:
  api-01:
    build:
      context: .
      dockerfile: api-01/Dockerfile
    restart: always
    container_name: "api-01"
    ports:
       - …
Run Code Online (Sandbox Code Playgroud)

docker dockerfile docker-compose asp.net-core docker-network

16
推荐指数
2
解决办法
3万
查看次数

Docker 带有“--network host”不允许访问应用程序端口

我在 docker 中有 Spring Boot 应用程序,并且我正在像这样运行我的应用程序:

docker run  --rm --network host --name myapp1 myapp
Run Code Online (Sandbox Code Playgroud)

但是当我尝试从主机访问它时,它失败了:

my_machine:~ root$ curl localhost:8081/someendpoint -v
*   Trying ::1...
* TCP_NODELAY set
* Connection failed
* connect to ::1 port 8081 failed: Connection refused
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connection failed
* connect to 127.0.0.1 port 8081 failed: Connection refused
* Failed to connect to localhost port 8081: Connection refused
* Closing connection 0
curl: (7) Failed to connect to localhost port 8081: Connection …
Run Code Online (Sandbox Code Playgroud)

docker spring-boot docker-network

13
推荐指数
1
解决办法
6530
查看次数

Nginx 不会重新解析 Docker 中的 DNS 名称

我正在运行 nginx 作为 docker-compose 模板的一部分。在 nginx 配置中,我通过 docker 主机名引用其他服务(例如backendui)。在我完成这个技巧之前,这一切都很好:

docker stop backend
docker stop ui
docker start ui
docker start backend
Run Code Online (Sandbox Code Playgroud)

这使得后端和 ui 容器交换 IP 地址(docker 在向每个新请求者提供 CIDR 中的下一个可用 IP 的基础上提供私有网络 IP)。这 4 个命令的执行模仿了一些罕见的情况,即两个上游容器同时重新启动,但 nginx 容器没有重新启动。另外,我相信,在基于 Kubernetes 的集群上运行 pod 时,这应该是一种非常常见的情况。

现在nginx将backend主机解析为ui的IP和ui后端的IP。重新加载 nginx 的配置确实有帮助(nginx -s reload)。另外,如果我从 nginx 容器内进行 nslookup - IP 总是能正确解析。

因此,这将问题隔离为围绕 DNS 缓存的纯粹 nginx 问题。

我尝试过的事情:

  1. 我在 nginx 配置中的 http {} 块下设置了解析器:
resolver 127.0.0.11 ipv6=off valid=10s;
Run Code Online (Sandbox Code Playgroud)
  1. 互联网上的人们提出的最常见的解决方案是在 proxy-pass 中使用变量(这有助于防止 …

nginx docker-compose docker-network nginx-config

13
推荐指数
1
解决办法
7979
查看次数

Docker-Compose:如何依赖另一个网络上的容器?即使网络已链接,我仍收到一条错误消息,提示容器“未定义”

我在 2 个不同位置的 2 个不同的 docker-compose.yml 文件中有 2 个不同的服务。

服务1:wordpress

version: "3.7"

services:

  # Wordpress
  wordpress:
    depends_on:
      - db
    container_name: wordpress
    image: wordpress:latest
    ports:
      - '8000:80'
    restart: unless-stopped
    volumes: ['./:/var/www/html']
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
    networks:
      - wpsite
networks:
  wpsite:
    driver: bridge
Run Code Online (Sandbox Code Playgroud)

服务2:前端

version: "3.7"

services:
  frontend:
    depends_on:
      - wordpress
    container_name: frontend
    restart: unless-stopped
    stdin_open: true
    build:
      context: ../realm-frontend
    volumes:
      - static:/realm-frontend/build
    networks:
      - cms_wpsite

networks:
  cms_wpsite:
    external: true

Run Code Online (Sandbox Code Playgroud)

我有一个 shell 脚本,可以转到这 2 个位置并运行 docker-compose 文件来创建容器。

脚本

cd …
Run Code Online (Sandbox Code Playgroud)

docker dockerfile docker-compose docker-network

10
推荐指数
2
解决办法
3万
查看次数

从操作中通过 github 操作中的主机名访问容器

我在 github 操作中启动了一个 docker 容器,并尝试从操作中访问它。但该操作无法解析主机名。如何将我的容器添加到与操作相同的 docker 网络并让操作通过其主机名访问它?

steps:
  - name: Run Fuseki
    run: docker run -p 3030:3030 --name fuseki -d stain/jena-fuseki /jena-fuseki/fuseki-server --file=/staging/aksw.org.nt /aksw
  - name: curl
    uses: wei/curl@master
    with:
      args: https://fuseki:3030/aksw
Run Code Online (Sandbox Code Playgroud)

完整的文件可以在 GitHub 上找到

docker docker-network github-actions

10
推荐指数
2
解决办法
1万
查看次数

Docker:无法在要分配给网络的默认值中找到可用的,不重叠的IPv4地址池

当我尝试使用docker-compose部署我的应用程序时,我收到了以下错误:

Creating network "<myapplicationnamehere_mycustomnetwork>" with the 
default driver
could not find an available, non-overlapping IPv4 address pool among 
the defaults to assign to the network
Run Code Online (Sandbox Code Playgroud)

现在我在这里和那里研究了一下,人们建议修剪未使用的旧码头网络docker network prune.但是因为我运行了34个docker容器(我认为大约有30个网络),所以它只会在错误再次出现之前修剪一个或两个旧网络.

我的问题是:如何在不遇到docker网络分配问题的情况下确保运行多项服务.(也许以某种方式创建更小的子网?)

我的Docker-compose文件的顶级网络部分如下所示:

#
# Networks section
# Networks:
# - public, represents the network between nginx and the public nginx-proxy (which should be already running)
# - uwsgi, represents the network between nginx and uwsgi
# - postgres, represents the network between uwsgi and postgres
#
networks:
  uwsgi:
  postgres:
  public: …
Run Code Online (Sandbox Code Playgroud)

networking docker docker-compose docker-networking docker-network

9
推荐指数
1
解决办法
2281
查看次数

Docker Stack任务因Permission denied错误而被拒绝

我尝试使用docker stack deploy命令部署堆栈(包含一个服务)并从我的swarm应用程序运行2个实例!这是我的docker-compose文件:

version: "3"
services:
  server:
    image: makbn/thumbnailer-server:v1
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      resources:
        limits:
          cpus: "0.1"
          memory: 1024M
      restart_policy:
        condition: on-failure
    ports:
      - 8080:8080
    networks: 
      - server_network
networks: 
  server_network:
Run Code Online (Sandbox Code Playgroud)

运行sudo docker stack deploy -c ./docker-compose.yml ts命令后,My stack成功部署到swarm,但这是我的docker stack ps ts 输出:

ID                  NAME                IMAGE                         NODE                DESIRED STATE       CURRENT STATE             ERROR                              PORTS
8zmjp6wt47ki        ts_server.1         makbn/thumbnailer-server:v1   fanap9-lp           Ready               Rejected 2 seconds ago    "mkdir /var/lib/docker: permis…"   
88vizpnabbi8         \_ ts_server.1     makbn/thumbnailer-server:v1   fanap9-lp           Shutdown            Rejected 7 seconds …
Run Code Online (Sandbox Code Playgroud)

docker docker-compose docker-network docker-stack

9
推荐指数
1
解决办法
1729
查看次数

使用Unix域套接字从Docker容器连接到Postgresql可怕吗?

下面是背景故事,但这是问题:我发现,如果我在docker主机上运行了postgresql,则可以通过作为文件安装的域套接字在容器中连接到它:

docker run -v /var/run/postgresql/:/var/run/postgresql
Run Code Online (Sandbox Code Playgroud)

这感觉像是一个主要的hack,所以我很好奇这在生产环境中是否真的可怕。有什么想法吗?


背景故事

背景是我在docker主机上运行了postgresql,因为我不信任docker直接运行postgresql。

所以我需要从在同一服务器上运行的Docker容器连接到该postgresql实例。我试过了:

  • 使用 --add-host

    但这也是一个黑客,因为它要求将docker run放在脚本中以找出主机的正确IP。就像是:

    docker run --add-host=postgres-host:$(ip route show | awk {print $2})
    
    Run Code Online (Sandbox Code Playgroud)

    我不喜欢那样做。

  • 我尝试使用--net=host,但这不是我们想要的。我们想要一个覆盖网络。

  • 我试图通过在容器中查找主机的IP地址来在容器中进行设置,但为此目的运行脚本并不感到很好。

所以...我想:“使用域套接字怎么办?”

postgresql docker docker-network

8
推荐指数
1
解决办法
192
查看次数