如何将 docker-compose 连接到容器网络和本地主机网络

use*_*089 5 docker docker-compose

如何设置 docker-compose 文件以连接到内部容器网络和外部本地主机网络?

我尝试在 docker-compose 中使用 extra_hosts 属性,但无法获得我需要的结果

我的 docker-compose 包含以下内容:

version: '3.7'

    services:

        myapp1:
            container_name: 
                  myapp1
            hostname:
                  myapp1
            build: 
                  context: 
                       .
                  dockerfile: 
                       Dockerfile
            command: 
                  ["npm", "start"]
            networks:
                  - container_network # This is an internal container network

        myapp2:
             ... # Same idea as above
            networks:
                  - container_network # This is an internal container network

    networks: 

         container_network:
              name:
                   container_network
              driver: 
                   bridge
Run Code Online (Sandbox Code Playgroud)

我还有一个独立的服务,我使用以下命令运行它:

docker run --name standalone_service --network host
Run Code Online (Sandbox Code Playgroud)

还有其他与我的问题无关的原因,即为什么standalone_service无法合并到docker-compose文件中。因此,将其合并到 docker-compose 文件并使用 container_network 不是此服务的选项。

我希望属于内部container_network的一部分的myapp1能够访问主机网络上的standalone_service。我该怎么做呢?

Dav*_*aze 7

鉴于您已经运行了standalone_serviceas --network host,它与主机上运行的任何其他进程没有什么区别,并且从 Docker 容器内部,如何连接到 [主机] 计算机的各种答案应该适合您。

第二种更好的方法是在 Docker Compose 之外创建一个 Docker 网络,并将另一个容器附加到该网络

docker network create container_network
docker run --net container_network -p 8888:8888 --name standalone_service ...
Run Code Online (Sandbox Code Playgroud)

完成此操作后,您可以将您的同一网络声明为docker-compose.yml外部网络。您甚至可以将其设为default网络,这样您就不必手动配置其他服务来使用它。

version: 3
services:
  myapp1:
    build: .
    ports: ['3000:3000']
    environment:
      MYAPP2_URL: 'http://myapp2/'
      STANDALONE_URL: 'http://standalone_service/'
    # gets `command:` from the Dockerfile
    # attaches to the `default` network
networks:
  default:
    external: true
    name: container_network
Run Code Online (Sandbox Code Playgroud)

default如果您不介意以相反的顺序启动并取决于实现细节,您还可以“借用”Docker Compose 创建的默认网络。

docker-compose up -d
docker run --net dirname_default -p 8888:8888 --name standalone_service ...
Run Code Online (Sandbox Code Playgroud)

不存在“连接到外部本地主机网络”这样的事情。每个网络环境(主机以及每个容器)都有自己的“本地主机网络”127.0.0.0/8;localhost固定为 IP 地址 127.0.0.1,并且始终表示“我”;在 Docker 上下文中,“特别是我正在调用的容器”。

  • 谢谢你的解释。如果我想要一个 docker 容器来解析在 LAN 上某处运行的非 dockerized REST API,我该如何让它访问这个外部/外部地址? (2认同)