所以我试图创建一个网络(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) 我尝试使用自定义网络和 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
命令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)
我用谷歌搜索了这个错误,但这些解决方案都不起作用:
docker network prune没什么区别。这是有关我的服务器环境的一些信息。操作系统:
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-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”选项使它正常工作,但是我想知道是否还有另一种方法可以执行此操作?
--net对于--network与docker一起使用vs 背后的原因,我似乎找不到很好的解释。
--help不显示--net而仅显示--network,有人请解释区别吗?
谢谢 !
我正在阅读 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 堆栈配置,其中包含一个名为 的覆盖网络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容器不再可用于网络traefik。database如果我从容器中删除网络staging,子域将按预期运行(尽管它显然无法访问数据库),并且当我将其重新添加时,反向代理开始从中超时。
两个网络之间是否存在某种冲突?我是否需要配置 IP 路由才能在单个容器上使用多个 docker 网络?
编辑:在配置摘录中添加更多详细信息
运行 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配置两个容器使用相同的网络堆栈?
而不是监听单个 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.2和10.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-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 服务中工作,因为它是浏览器请求?即:axioshttp://api:5050在 React / axios 请求内部使用,是因为没有主机解析吗?http://localhost:9906|3306连接到我的数据库服务?localhost:5050从我的 React 容器中仍然可以看到 API 服务器在另一个容器中的 5050 上运行?