标签: docker-network

通过特定物理接口的docker网络

所以我试图创建一个网络(docker network create),以便其流量将通过特定的物理网络接口(NIC);我有两个:(<iface1>内部)和<iface2>(外部)。

我需要两个网卡的流量在物理上分开。


方法一

我认为macvlan应该使用驱动程序来创建这样的网络。对于我在互联网上找到的大部分内容,解决方案参考 Pipework(现已弃用)和临时 docker-plugins(也已弃用)。对我最有帮助的是这个1

docker network create -d macvlan \
    --subnet 192.168.0.0/16 \
    --ip-range 192.168.2.0/24 \
    -o parent=wlp8s0.1 \
    -o macvlan_mode=bridge \
    macvlan0
Run Code Online (Sandbox Code Playgroud)

然后,为了使容器从主机可见,我需要在主机中执行以下操作:

sudo ip link add macvlan0 link wlp8s0.1 type macvlan mode bridge
sudo ip addr add 192.168.2.10/16 dev macvlan0
sudo ifconfig macvlan0 up
Run Code Online (Sandbox Code Playgroud)

现在容器和主机可以看到对方:)但是容器无法访问本地网络。这个想法是容器可以访问互联网。


方法2

因为我将手动使用<iface2>,所以如果默认情况下流量通过 ,我就可以了<iface1>。但无论我以何种顺序启动网卡(我也尝试暂时删除 LKM <iface2>);整个流量总是被外部网卡超过<iface2>。我发现这种情况发生是因为路由表在某个“随机”时间自动更新。为了强制流量通过<iface1>,我必须(在主机中):

sudo route del -net …
Run Code Online (Sandbox Code Playgroud)

networking nic docker docker-network macvlan

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

Docker DNS 设置

我尝试使用自定义网络和 dos 设置创建 docker 容器。

docker网络创建--driver=bridge--opt“com.docker.network.bridge.enable_ip_masquerade”=“true”--opt“com.docker.network.bridge.enable_icc”=“true”--opt=“com” .docker.network.driver.mtu"="1500" --opt="com.docker.network.bridge.host_binding_ipv4"="0.0.0.0" 网络

--

docker run --dns 10.0.0.2 --network=net busybox cat /etc/resolv.conf

名称服务器 127.0.0.11 选项 ndots:0

否则,如果我使用标准网络一切正常

docker run --dns 10.0.0.2 --network=bridge busybox cat /etc/resolv.conf

名称服务器 10.0.0.2

linux dns networking docker docker-network

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

无法创建 docker 网络:在要分配给网络的默认值中找不到可用的、非重叠的 IPv4 地址池

命令docker create network mynetwork给了我以下错误响应:

Error response from daemon: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network
Run Code Online (Sandbox Code Playgroud)

我用谷歌搜索了这个错误,但这些解决方案都不起作用

  1. 我只有 3 个预定义的 docker 网络,所以docker network prune没什么区别。
  2. 我从未安装过 OpenVPN

这是有关我的服务器环境的一些信息。操作系统:

LSB Version:    :core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID: CentOS
Description:    CentOS release 6.3 (Final)
Release:    6.3
Codename:   Final
Run Code Online (Sandbox Code Playgroud)

核心:

Linux xxx.com 3.10.0_3-0-0-17 #181 SMP Thu Feb 8 16:34:08 CST 2018 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

码头工人:

Client:
 Version:   18.03.0-ce
 API version:   1.37
 Go …
Run Code Online (Sandbox Code Playgroud)

docker docker-networking docker-network

4
推荐指数
1
解决办法
7196
查看次数

如何从docker-compose创建的docker容器内部连接到本地计算机?

我有一个使用docker-compose创建的Docker容器。这是yml文件。

version: "3"
services:
  redis:
    image: "redis"
  web:
    image: "myimage"
    ports:
      - "8000:8000"
    environment:
      REDIS_HOST: redis
    volumes:
      - .:/usr/src/app
    depends_on:
      - "redis"
    command: ["npm", "start"]
Run Code Online (Sandbox Code Playgroud)

我的Web应用程序需要从此容器连接到本地计算机,因为我的本地计算机正在运行Docker容器的Web应用程序需要访问的另一个Web应用程序。我该怎么做呢?本地主机的web应用程序托管在其他端口(7777)上。

我已经从Docker容器内部看到了如何连接到计算机的本地主机?,并且使用“ extra_hosts”选项使它正常工作,但是我想知道是否还有另一种方法可以执行此操作?

docker docker-compose docker-network

4
推荐指数
1
解决办法
5531
查看次数

docker --net与--network

--net对于--network与docker一起使用vs 背后的原因,我似乎找不到很好的解释。
--help不显示--net而仅显示--network,有人请解释区别吗?

谢谢 !

docker docker-networking docker-network

4
推荐指数
1
解决办法
1009
查看次数

使用 --net=container:containerName 键将 docker 容器附加到另一个容器的网络

我正在阅读 Jaroslaw Krochmalski 所著的《面向 Java 开发人员的 Docker 和 Kubernetes》一书,我偶然发现了以下示例。作者建议创建一个桥接myNetwork网络,然后运行连接到该网络的两个容器(Apache Tomcat 和 BusyBox),如下所示(命令应在单独的终端会话中运行):

$ docker run -it --name myTomcat --net=myNetwork tomcat
$ docker run -it --net container:myTomcat busybox
Run Code Online (Sandbox Code Playgroud)

作者特别指出“我们希望 busybox 容器使用与 Tomcat 使用的网络相同的网络。作为替代方案,我们当然可以使用该--net myNetwork选项显式指定网络名称”。

那么作者建议通过在busybox容器中运行以下命令来检查容器之间的通信:

$ wget localhost:8080
Run Code Online (Sandbox Code Playgroud)

这确实有效,但立即让我感到困惑,因为我们有两个不同的容器,并且不清楚为什么它们通过本地主机进行通信。事实证明,上面提到的带有密钥的命令并--net container:myTomcat没有完全将容器添加到网络中,而是使其在与myTomcat容器相同的 IP 下以某种方式可见。

观察结果证实了这一点,如果您运行docker network inspect myNetwork,您将看到实际上只有一个容器连接到网络:

[
    {
        "Name": "myNetwork",
        ...
        "Containers": {
            "464ed70a0c31784226dc943bcbcb79f7c4666b9d7825183706505731ac06a9bf": {
                "Name": "myTomcat",
                "EndpointID": "a4c384f17c6f8e443a430f130093ff6936bb59b1b54d0f056d1f0b4c703c1489",
                "MacAddress": "02:42:ac:14:00:02",
                "IPv4Address": "172.20.0.2/16",
                "IPv6Address": ""
            }
        },
        ...
    }
]
Run Code Online (Sandbox Code Playgroud)

相反,如果您 …

docker docker-network

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

单个容器上的多个 docker 网络

我有一个 docker 堆栈配置,其中包含一个名为 的覆盖网络traefik。它包含我的traefik反向代理容器,然后是几个服务于各个子域的容器。我正在添加一个新容器,它需要访问我在另一个容器中创建的数据库服务器,因此我添加了如下内容:

networks:
  traefik:
    driver: overlay
  database:
    driver: overlay

services:
  traefik:
    image: traefik
    networks:
      - traefik
    ports:
      - 80:80
      - 443:443
      - 8080:8080
    volumes:
      # ...

  # ...

  database:
    image: postgres:9.6-alpine # match what's being used by heroku
    networks:
      - database

  staging:
    image: staging
    networks:
      - traefik
      - database
deploy:
  labels:
    traefik.enable: "true"
    traefik.frontend.rule: Host:lotto-ticket.example.com
    traefik.docker.network: traefik
    traefik.port: 3000
Run Code Online (Sandbox Code Playgroud)

当我执行此操作时,反向代理开始返回网关超时代码,表明staging容器不再可用于网络traefikdatabase如果我从容器中删除网络staging,子域将按预期运行(尽管它显然无法访问数据库),并且当我将其重新添加时,反向代理开始从中超时。

两个网络之间是否存在某种冲突?我是否需要配置 IP 路由才能在单个容器上使用多个 docker 网络?

编辑:在配置摘录中添加更多详细信息

docker docker-network docker-stack

4
推荐指数
1
解决办法
7757
查看次数

docker-compose 如何像 docker run 中一样定义容器范围的网络?

运行 2 个容器,其中mycontainer2必须使用相同的网络堆栈mycontainer1。就好像两个容器在同一台机器上运行一样。docker run这是我尝试使用--network container:xxx来实现的方法

$ docker run -it --rm --name mycontainer1 -p 6666:7777 myregistry/my-container1:latest

$ docker run -it --rm --network container:mycontainer1 --name mycontainer2 myregistry/my-container2:latest
Run Code Online (Sandbox Code Playgroud)

我尝试使用docker-compose以下命令来复制此行为。但网络:的定义docker-compose.yaml并不表示与--network container:xxx的选项等效的内容docker run。是否可以docker-compose配置两个容器使用相同的网络堆栈?

docker docker-compose docker-network

4
推荐指数
1
解决办法
5178
查看次数

Docker-compose“端口”:监听多个 IP 地址/IP 范围

而不是监听单个 IP 地址,例如 localhost:

ports:
- "127.0.0.1:80:80"
Run Code Online (Sandbox Code Playgroud)

我希望容器只监听本地网络,ieeg:

ports:
- "10.0.0.0/16:80:80"

ERROR: The Compose file './docker-compose.yml' is invalid because:
services.SERVICE.ports contains an invalid type, it should be a number, or an object
Run Code Online (Sandbox Code Playgroud)

这可能吗?

我还不想使用群体模式等。


如果不支持 IP 范围,也许至少有多个 IP 地址,例如10.0.0.210.0.0.3

ERROR: for CONTAINER  Cannot start service SERVICE: driver failed programming external connectivity on endpoint CONTAINER (...): Error starting userland proxy: listen tcp 10.0.0.3:80: bind: cannot assign requested address

ERROR: for SERVICE  Cannot start service SERVICE: driver failed …
Run Code Online (Sandbox Code Playgroud)

docker docker-compose docker-network

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

Docker Compose 通过 localhost 访问另一个容器

我正在尝试思考如何访问作为docker-compose服务一部分运行的其他容器。

我见过很多关于通过其他容器内的服务名称访问容器的答案,但也有很多教程只是使用带有公开端口的本地主机。

所以我只是想弄清楚何时使用哪个以及为什么它会这样工作。

我的示例应用程序是:https ://github.com/daniil/full-stack-js-docker-tutorial

在其中,我有一个 NGINX 服务器将 ui 和 api 服务映射在一起,但事后我意识到,在我的 React 容器 (3000:3000) 内部,我实际上可以通过以下方式访问 Express 容器 (5050:5050)向 发送 axios 请求http://localhost:5050

但同时如果我尝试通过本地主机连接到我的 MySQL 容器(9906:3306),它不起作用,我必须用作db主机,即容器名称。

有人可以帮我理解这一切是如何运作的吗:

  • 我什么时候可以使用http://localhost:SERVICE_PORT,它是否可以在 React 服务中工作,因为它是浏览器请求?即:axios
  • 为什么我不能http://api:5050在 React / axios 请求内部使用,是因为没有主机解析吗?
  • 为什么我无法http://localhost:9906|3306连接到我的数据库服务?
  • 如果由于 localhost 似乎可以工作而实际上不需要中间的任何内容,那么 NGINX 反向代理将客户端和 api 连接在一起的目的或好处是什么?
  • 如果容器应该是隔离的,那么为什么localhost:5050从我的 React 容器中仍然可以看到 API 服务器在另一个容器中的 5050 上运行?
  • 其他可以帮助我理解跨容器通信如何工作的一般规则

docker docker-compose docker-network

3
推荐指数
1
解决办法
7119
查看次数