docker默认每个容器的网络都是独立的,不互通的,和宿主机也是隔离的。
如何互通呢?容器之间可以通过--network 设置相同名称网络,来实现互通,如所有容器都run --network mynet123。
你服务器上安装了mysql,docker里有容器redis,容器nginx还有容器website,和宿主机的mysql怎么互通呢?
为了实现nginx能打开website,website能访问redis和mysql,我们只需要把所有容器的网络都设为和宿主机同处一个网络就行了
使用host
当 docker 容器使用 host 连接方式的时候,容器与宿主共用网络,这样就能从容器中访问宿主网络了
容器中的 localhost 就等于宿主的 localhost 了.
在 docker 命令中使用 --network host 来为容器配置host网络
1、docker run的时候加上--network host
docker run --name website --network=host
docker run --name nginx --network=host
docker run --name redis --network=host
2、docker-compose中使用
docker-compose.yaml文件:
加上network_mode: host
services:
website:
build: . # 指定 Dockerfile 所在路径
restart: always
network_mode: host
判断host模式是否生效
host.docker.internal指向主机ip,如果是127.0.0.1就对了
ping host.docker.internal
注意事项
需要注意的是,因为容器是与宿主机共享网络,并且容器不存在自己的ip, 端口映射不生效, -p,–publish,-P,和–publish-all都将被忽略,并产生一个警告
WARNING: Published ports are discarded when using host network mode
严重警告:host模式主机网络驱动程序仅适用于Linux主机,并且不支持Docker for Mac,Docker for Windows或Docker EE for Windows Server。
docker network介绍
如果不使用 --network=host 的话会出现什么问题呢?
curl localhost:3000 的时候会出现 502 Bad Gateway ,这种情况下 nginx.conf 中的 localhost 有问题。 由于 nginx 是运行在 docker 容器中的,这个localhost 是容器的 localhost,而不是宿主机的localhost。
Docker容器运行的时候有host、bridge、none三种网络可供配置,bridge还可以使用指定容器网络和自定义网络名称
–-network=bridge
默认就是 bridge,即桥接网络,以桥接模式连接到宿主机,创建一个独立网络
可以通过自定义bridge将多个容器互通
方式A:–-network=netName
自定义网络
这个模式可以自定义network名称,相同network名称之间的容器可以互通。
与默认的bridge原理一样,但自定义网络具备内部DNS发现,可以通过容器名或者主机名容器之间网络通信。
具体步骤查看:https://www.jianshu.com/p/2468ef97ce1e
方式B:–-network=container:Name/ID
可以和指定容器之间互通。
与指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他都还是隔离的。
–-network=host
与宿主机共享网络,也就是在网络这块不会与宿主机隔离,而是共享宿主机的网络配置,并且 容器不会分配自己的ip地址
由于不需要端口映射,host网络的性能较高.
–-network=none
无网络,容器将无法联网。
–-network=overlay
用于swarm集群中容器的跨主机网络访问
网友评论