标签: docker-network

使用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
查看次数

Docker 容器可以访问互联网,但不能访问本地网络

我有一个在 win server 2016 上运行的 Windows docker 容器

容器中运行的站点可以从网络上的其他节点访问。

容器可以访问互联网(它可以访问网络外部的第 3 方节点),但无法连接到网络中的其他节点。

当容器中运行的应用程序尝试访问网络中另一台计算机 (machine_name) 上的服务时,会出现以下错误:

The remote name could not be resolved: machine_name

当应用程序尝试连接到网络上的数据库时:

A network-related or instance-specific error occurred while establishing a connection

所以看起来容器没有访问权限或者找不到内网机器

我跑了 docker exec -ti e87633560c6c ipconfig /all 并得到以下信息:

Windows IP Configuration

   Host Name . . . . . . . . . . . . : gmsa_acct
   Primary Dns Suffix  . . . . . . . :
   Node Type . . . . . …
Run Code Online (Sandbox Code Playgroud)

docker docker-network

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

docker网络创建,--subnet和--ip-range有什么区别

Docker 网络文档指出:

  • subnet : CIDR 格式的子网,表示一个网段
  • ip-range : 从子范围分配容器ip

示例显示:

$ docker network create \
  --driver=bridge \
  --subnet=172.28.0.0/16 \
  --ip-range=172.28.5.0/24 \
  --gateway=172.28.5.254 \
  br0
Run Code Online (Sandbox Code Playgroud)

因此,子网是从 172.28.0.0 到 172.28.255.255

ip 范围是从 172.28.5.0 到 172.28.5.255

为什么要使子网大于 IP 范围?

为什么有子网和 ip-range 选项?

docker docker-network

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

Docker Compose配置中"ipam"键的用途是什么?

我是Docker的新手但不是那么新我不理解Docker的cli.但是我对Docker文件和Docker Compose的处理方式都很新.如果有人能向我解释docker-compose.yml的这一部分,我将非常感激.

我的评论是嵌入式的:

networks:
  vpcbr: <-I know what this is
    driver: bridge <-I know what this is
    ipam:  <-What the heck is this for?
     config: <-I know what this is.
       - subnet: 10.5.0.0/16 <- Obvious
         gateway: 10.5.0.1 <- Obvious
Run Code Online (Sandbox Code Playgroud)

docker docker-compose docker-networking docker-network

7
推荐指数
1
解决办法
6195
查看次数

如何从连接到外部网络的另一个组合访问容器?

这是我希望从外部容器(在另一个撰写文件中定义)连接到的带有容器配置的撰写文件:

version: '3.5'
services:
  service-to-connect-to:
    build: .
    networks:
      - my-external-network

networks:
  my-external-network:
    external: true
Run Code Online (Sandbox Code Playgroud)

和另一个包含我希望连接到的容器配置的撰写文件service-to-connect-to

version: "3.5"

services:
  service-to-connect-from:
    build: .
Run Code Online (Sandbox Code Playgroud)

我试图service-to-connect-to通过这个域连接到:

service-to-connect-to service-to-connect-to.my-external-network my_external_network.service-to-connect-to

但他们都没有工作。

我错在哪里?

谢谢

docker docker-compose docker-networking docker-network

7
推荐指数
1
解决办法
4528
查看次数

macOS 和 Windows 上的 --network host 的 Docker 替代方案

我有两个 Docker 容器:

  • 数据库
  • 使用数据库的应用程序

我像这样运行我的数据库容器:

docker run --name my-db -p 127.0.0.1:3306:3306 my-db-image

我的应用程序容器是这样的:

docker run --name my-app --network host -it my-app-image

这在 Linux 上运行良好。我可以从主机系统和应用程序容器访问数据库。完美的。

--network host不适用于 Mac 和 Windows:

主机网络驱动程序仅适用于 Linux 主机,Docker for Mac、Docker for Windows 或 Docker EE for Windows Server 不支持。

(来源: https: //docs.docker.com/network/host/

我仍然可以从主主机访问数据库127.0.0.1:3306,但无法从应用程序容器访问它。

我该如何解决这个问题?如何让应用程序容器连接到数据库(并使用 继续从主主机访问数据库127.0.0.1:3306)?

我尝试过使用host.docker.internalandgateway.docker.internal但它不起作用。

我还尝试--network my-network在创建后my-network使用启动两个容器docker network create my-network,但它不起作用。

我不知道如何解决这个问题。

docker docker-container docker-network docker-run

7
推荐指数
1
解决办法
8175
查看次数

Docker compose服务名与外网冲突

我正在尝试使用外部网络连接在 docker-compose 上运行的两个本地开发的项目。

从一方面来看,我有第一个要公开的应用程序。Compose 包含主机:apprabbit

version: '3.4'

services:
  app:
    # ...
  rabbit:
    # ...

networks:
  default:
    driver: bridge
Run Code Online (Sandbox Code Playgroud)

从另一边来看,我有第二个应用程序预计会看到第一个应用程序:

version: '3.4'

services:
  app:
    # ...
    networks:
      - paymentservice_default
      - default

networks:
  paymentservice_default:
    external: true
Run Code Online (Sandbox Code Playgroud)

rabbit.paymentservice_default可以到达主机。

然而,服务(第一)与(第二)app冲突:app

root@6db86687229c:/app# ping app.paymentservice_default
PING app.paymentservice_default (192.168.80.6) 56(84) bytes of data.

root@6db86687229c:/app# ping app
PING app (192.168.80.6) 56(84) bytes of data.
Run Code Online (Sandbox Code Playgroud)

一般来说,从第二个角度来看,主机appapp.paymentservice_default共享相同的 IP 使得app.paymentservice_default无法被发现。

这里的问题是,我是否有正确的配置并且可以在不更改服务名称的情况下避免app冲突?为什么有这个限制?考虑到每个 docker-compose …

docker docker-compose docker-network

7
推荐指数
1
解决办法
2151
查看次数

Docker Compose 同时使用主机和桥接网络

我有 2 个图像,我想通过 compose 的默认桥接网络相互通信,但我也希望它们能够访问我的主机网络。

为了允许图像在 compose 的默认桥接网络中相互通信,我不需要执行任何操作:

version: '3.4'
services: 
  hello:
   image: hello-world

  world:
    image: hello-world
Run Code Online (Sandbox Code Playgroud)

通过上述规范,服务可以通过使用 DNS 名称来hello引用服务worldworld

如果我希望 hello 服务能够与我的主机网络交互,我可以添加network_mode: host到规范中。

version: '3.4'
services: 
  hello:
   image: hello-world
   network_mode: host
  world:
    image: hello-world
Run Code Online (Sandbox Code Playgroud)

这允许hello服务访问我的主机网络,但无法再world通过 compose 的内置 DNS 进行访问。我怎样才能同时实现这两个目标?

我尝试创建自定义网络,但自定义网络无法使用主机驱动程序,并且我无法network_mode与以下命令结合使用networks

这不起作用:

version: '3.4'
services: 
  hello:
   image: hello-world
   network_mode: host
   networks:
   - bridge
  world:
    image: hello-world
    networks:
    - bridge

networks:
  test:
    driver: bridge
Run Code Online (Sandbox Code Playgroud)
$ docker-compose up …
Run Code Online (Sandbox Code Playgroud)

docker docker-compose docker-network

7
推荐指数
1
解决办法
4161
查看次数

在 docker 容器内创建网络命名空间时出错。错误:挂载 --make-shared /run/netns 失败:权限被拒绝

在 docker 容器内创建网络命名空间时出现错误,提示权限被拒绝。

command  
ip netns add red
Run Code Online (Sandbox Code Playgroud)
error
mount --make-shared /run/netns failed: Permission denied
Run Code Online (Sandbox Code Playgroud)

我正在运行图像 ubuntu:20.10 并尝试向容器添加特定功能,但没有帮助。

docker run -it --rm --name=ubuntu --cap-add CAP_SYS_ADMIN --cap-add NET_ADMIN ubuntu:20.10
apt-get update && apt-get install -y net-tools && apt-get install -y iproute2
Run Code Online (Sandbox Code Playgroud)

即使添加所有功能后,问题仍然相同。

docker run -it --rm --name=ubuntu --cap-add ALL ubuntu:20.10
Run Code Online (Sandbox Code Playgroud)

ubuntu docker-network

7
推荐指数
2
解决办法
6606
查看次数

Docker 网络影响容器重启时的主机网络:chrome 中的 ERR_NETWORK_CHANGED

我在docker 网络方面遇到了一个奇怪的问题。我在 Docker 容器中使用名为extenal_network的外部桥接网络,并启用了自动重启。如果任何容器由于某些错误(可能是代码或基础设施相关)而重新启动,我将无法访问我的主机网络。

请参阅随附的屏幕截图以获得更清晰的信息。

网络错误

我已经尝试过以下链接,但没有运气。


Dockerfile

FROM node:10.20.1-alpine
RUN apk add --no-cache python make g++
WORKDIR /home/app
COPY package.json package-lock.json* ./
RUN npm install
COPY . .
Run Code Online (Sandbox Code Playgroud)

Docker-Compose

version: "3"
services:
  app:
    container_name: app
    build:
      context: ./
      dockerfile: Dockerfile
    image: 'network_poc:latest'
    ports:
      - 8080:8080
    deploy:
      resources:
        limits:
          memory: 2G
    networks:
      - extenal_network
    restart: always
    command: node index.js

networks:
  shared_network:
    external:
      name: extenal_network
Run Code Online (Sandbox Code Playgroud)

docker 检查external_network

[
    {
        "Name": "extenal_network",
        "Id": "96476c227ddc14aa23d376392d380b2674fcbad109c90e7436c0cddd5c0a9ac5", …
Run Code Online (Sandbox Code Playgroud)

networking google-chrome docker docker-compose docker-network

7
推荐指数
0
解决办法
3181
查看次数