标签: docker-networking

在同一主机上的不同网络中的Docker容器之间进行通信

是否有可能在同一主机内的不同网络中进行通信?请注意,我目前不使用docker-compose.

以下是我所做的总结.我使用以下命令创建了两个网络

docker network create --driver bridge mynetwork1   
docker network create --driver bridge mynetwork2
Run Code Online (Sandbox Code Playgroud)

然后我使用以下命令在这些创建的网络中运行了两个容器:

docker run --net=mynetwork1 -it name=mynet1container1 mycontainerimage
docker run --net=mynetwork1 -it name=mynet1container2 mycontainerimage
docker run --net=mynetwork2 -it name=mynet2container1 mycontainerimage
docker run --net=mynetwork2 -it name=mynet2container2 mycontainerimage
Run Code Online (Sandbox Code Playgroud)

然后,我从使用创建的网络中识别出每个容器的IP地址

docker network inspect mynetwork1
docker network inspect mynetwork2
Run Code Online (Sandbox Code Playgroud)

使用那些我能够在同一网络中的容器之间进行通信,但我无法通过网络在容器之间进行通信.只有将容器添加到同一网络才能进行通信.

非常感谢...

containers docker docker-networking

9
推荐指数
3
解决办法
6969
查看次数

为docker for mac指定ip地址

我正在使用Docker for Mac Beta,它从聚光灯下运行.

有没有办法从控制台运行它或强制使用任何配置文件来指定docker host的ip地址.

现在它从192.168.64.3变为192.168.64.5(每个docker的启动它可以有任意随机IP)

可能我需要配置桥接接口?

com.docker.network.bridge.enable_ip_masquerade: true
com.docker.network.bridge.host_binding_ipv4: 0.0.0.0
Run Code Online (Sandbox Code Playgroud)

有谁知道这是怎么做到的吗?

macos networking docker docker-networking

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

Windows上的Docker:如何使用容器IP从主机连接到容器?

我有

  • Windows 10
  • Docker for Windows V. 1.12.5 Rev. 9503,不再依赖boot2docker或VirtualBox了.

我有很多在Docker镜像中运行的JBoss实例(172.18.0.2是一个数据库):

  • 实例1:名称:jboss-eap,IP:172.18.0.3
  • 实例2:名称:jboss-eap-arquillian,IP:172.18.0.4

应该同时运行.每个JBoss实例导出例如其8787,8080和8443端口.

我还创建了一个桥接网络:docker network create --driver bridge --subnet 172.18.0.0/24 bridged_network

目前,我已经设置了本地端口转发,以便主机可以使用前缀访问各种服务(例如,当访问实例1的端口8080时,主机使用localhost:28080进行连接).但这很容易出错.

现在,我想使用容器的IP从主机访问这些端口,例如调用172.18.0.4:8080(下一步:使用主机名:jboss-eap-arquillian:8080).虽然这在容器之间顺利运行,但我无法将其设置为从主机连接.

有Windows网络接口(类型:DockerNAT),IP 10.0.75.1,但我可能手动创建它(不确定......现在已经尝试了很长时间).但是当将容器的端口绑定到此设备时,这很有用,例如docker run ... -p 10.0.75.1:8080:8080.然后我可以使用10.0.75.1:8080调用该服务,但这对第二个容器没有帮助.

我也试过使用Docker的主机网络设备,但是那个.似乎只适用于一台机器b.我无法静态设置IP,这是运行静态配置的JUnit测试所需的.注意:我不能依赖网络DHCP在启动时分配IP,因为我经常更改我的网络(以及DHCP),导致再次出现不固定的IP.

所以基本上我正在寻找一种以这种方式设置网络/容器的方法,我可以使用容器IP(例如172.18.0.3,例如1)调用容器提供的服务(例如,在端口8080上)来自主机使用172.18.0.3:8080.

windows jboss docker docker-networking

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

如何在一台服务器上增加最大 Docker 网络?

在我的电脑中,我可以创建更多的最大值 29 Docker Network,就像那样。

for num in `seq -w 100`; do
    echo "Create network: $num"
    docker network create $num
done
Run Code Online (Sandbox Code Playgroud)

创建 29 后Docker Network,出现错误:

Error response from daemon: failed to parse pool request for address space "LocalDefault" pool "" subpool "": could not find an available predefined netw
ork
Run Code Online (Sandbox Code Playgroud)

我的问题:如何在一台服务器上增加最大 Docker 网络?

因为我以前测试过很多docker-compose应该需要更多的网络。

谢谢你。

docker docker-compose docker-networking

9
推荐指数
2
解决办法
4053
查看次数

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 网桥模式下的 Keycloak 授权:如何访问 localhost?

应用程序上下文是一个带有 mongo db 的 node js 应用程序,使用 keycloak 服务器进行具有开放 ID 的授权。对于开发环境,我们有一个 mongo 容器、一个 keycloak 容器和应用服务器容器。

Keycloak 容器在 8080 上有一个端口映射,以便我可以访问http://localhost:8080.

应用程序容器在 9000 上有一个端口映射来访问应用程序本身 http://localhost:9000

所有 3 个容器都在一个 docker 网络中application_default(从 docker compose 开始)。

在应用程序内部,使用 keycloak 进行 openid 身份验证所需的信息由以下环境变量管理:

# KEYCLOAK CREDENTIALS
APP_KEYCLOAK_REALM="http://localhost:8080/auth/realms/myrealm"
APP_KEYCLOAK_RETURN_URL="http://localhost:9000/api/auth/openid/return"
APP_KEYCLOAK_CLIENT_ID=myapplication
APP_KEYCLOAK_CLIENT_SECRET="00d5c908-eade-4e26-bcf0-b9341ghie197"
Run Code Online (Sandbox Code Playgroud)

这些设置不起作用,通常实际上就像在应用程序容器内部一样, 的APP_KEYCLOAK_REALMlocalhost:8080不是指我的 PC(和 keycloak),而是指应用程序容器。

现在当我替换为

APP_KEYCLOAK_REALM="http://keycloak:8080/auth/realms/myrealm"
Run Code Online (Sandbox Code Playgroud)

该应用程序可以转到 keycloak,但是为​​了进行身份验证,我的浏览器被卡住了,试图将我重定向到一个对他来说没有任何意义的 url 开始 http://keycloak:8080/auth/realms...

我设法使配置正常工作的唯一方法是将我的 PC 的实际 IP 地址放在环境文件中:

# KEYCLOAK CREDENTIALS
APP_KEYCLOAK_REALM="http://192.168.1.34:8080/auth/realms/myrealm"
APP_KEYCLOAK_RETURN_URL="http://192.168.1.34:9000/api/auth/openid/return"
APP_KEYCLOAK_CLIENT_ID=myapplication
APP_KEYCLOAK_CLIENT_SECRET="00d5c908-eade-4e26-bcf0-b9341ghie197"
Run Code Online (Sandbox Code Playgroud)

这有效,但似乎不是可移植性的理想选择(IP 地址一直在变化)。

有没有标准的方法来做到这一点?可以将 docker dns …

docker keycloak docker-networking

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

如果设置了变量,如何将 docker compose 配置为使用给定的子网,或者如果未设置则自行选择?

我的 docker compose 文件中有以下网络配置。

networks:
    default:
        ipam:
            driver: default
            config:
                - subnet: ${DOCKER_SUBNET}
Run Code Online (Sandbox Code Playgroud)

DOCKER_SUBNET被设置时,如预期可以用来在变量中指定的子网。当变量未设置时,我得到:ERROR: Invalid subnet : invalid CIDR address:因为变量是空白的(这是完全合理的)。

有没有办法配置 ipam 驱动程序,以便在DOCKER_SUBNET未设置变量时,docker -compose 将选择一个可用的子网,就像未提供 ipam 配置时通常会做的那样?

environment-variables docker docker-compose docker-networking

8
推荐指数
2
解决办法
8406
查看次数

有没有办法刷新docker DNS缓存(内部)?

我正在使用 Docker 18.03.1-ce,如果我创建一个容器,将其删除然后重新创建它,内部 DNS 会保留旧地址(除了新地址)。

有没有办法清除或刷新旧条目?如果我删除并重新创建网络,那么它会刷新它,但我不想每次都这样做。

我创建网络:

docker network create -d overlay --attachable --subnet 10.0.0.0/24 --gateway 10.0.0.1 --scope swarm -o parent=ens224 overlay1
Run Code Online (Sandbox Code Playgroud)

然后创建一个容器(本例中为 SQL)

docker container run -d --rm --network overlay1 --name sql -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Some_SA_Passw0rd' -p 1433:1433 microsoft/mssql-server-linux 
Run Code Online (Sandbox Code Playgroud)

如果我在同一个网络上创建一个 Alpine 容器,我可以nslookup sql按名称并解析为10.0.0.6. 没有问题,到目前为止一切都很好。

现在,如果我删除 SQL 容器并重新创建它,则会nslookup sql显示10.0.0.610.0.0.8. 该10.0.0.6是原来的地址,不再活着,但仍做出决议。

我的容器使用的名称服务器127.0.0.11是用户创建的网络的典型名称,但我找不到任何可以让我清除其缓存的内容。

也许我遗漏了一些东西,但我认为只要容器被移除,DNS 条目就会被拆除。

任何见解当然值得赞赏!

docker docker-networking

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

部署服务时,如何解决Docker错误“ Win32中的hnsCall失败:找不到适配器”?

我正在尝试从主机运行一个四节点群集,我的计算机是管理器,并将三个Hyper-V VM作为工作程序节点。我试图在所有节点hnsCall failed in Win32: An adapter was not found上将静态网页作为服务运行,但是始终在主机和No such image虚拟机上接收错误(尝试从私有注册表中提取服务映像)。在部署堆栈或使用时会发生这种情况service create。但是,我可以通过容器实例运行静态页面,并且可以正常工作。

我按照本指南设置和创建了我的VM,我怀疑这是我的问题所在。我通过HyperV虚拟交换机管理器创建的虚拟交换机(名为thevswitch)既在外部,又在正确的适配器上设置。我初始化用我的主机的IPv4下一个群thevswitch--advertise-addr标志,并成功加入了虚拟机的工作节点到这个IP,同时使用驱动程序。无论如何,Docker似乎都看不到我创建的虚拟交换机。

PS C:\Docker\swarm-test> docker version
Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:31 2019
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.24)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun …
Run Code Online (Sandbox Code Playgroud)

docker docker-swarm docker-machine docker-networking docker-for-windows

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

如果零停机时间容器更新有多个实例,docker-compose 网络别名如何工作?

所以我有:

version: "3.6"

services:
  nginx:
    image: nginx
  app:
    image: node:latest
Run Code Online (Sandbox Code Playgroud)

我的 nginx 配置是:

upstream project_app {
  server app:4000;
}

server {
  listen 80;
  server_name example.com;

  location / {
    proxy_pass http://project_app;
  }

Run Code Online (Sandbox Code Playgroud)

为了在不停机的情况下更新容器(滚动更新),我首先将app服务升级到 2:

docker-compose up -d --no-deps --scale app=2 --no-recreate app
Run Code Online (Sandbox Code Playgroud)

它将project_app_1沿着project_app.

但是在这一步,即使新project_app_1容器准备好了,所有的流量也会流向project_app,前一个容器。

要同时使用它们,我需要运行docker-compose restart nginx.

现在,流量是到project_app和 的路由器project_app_1,这真的很酷。

我现在准备杀死现在已经project_app过时的。

我的问题是:

  • nginx 被杀死后是否需要再次重新启动,以确保所有流量都路由到project_app_1或者它有点自动?
  • 有效的事实http://app:4000是因为 DNS 主机名配置,对吗?在哪里可以了解更多信息?
  • 如果关闭发现在 …

nginx docker docker-compose docker-networking

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