1. docker网络
参考https://blog.csdn.net/lihongbao80/article/details/108019773
默认网络有三种,分别是
1、bridge模式,--net=bridge(默认)
dokcer网络的默认设置,为容器创建独立的网络命名空间,容器具有独立的网卡等所有单独的网络栈,是最常用的使用方式。在docker run启动容器的时候,如果不加--net参数,就默认采用这种网络模式。安装完docker,系统会自动添加一个供docker使用的网桥docker0,我们创建一个新的容器时,容器通过DHCP获取一个与docker0同网段的IP地址,并默认连接到docker0网桥,以此实现容器与宿主机的网络互通。
2、host模式,--net=host
Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。。
3、none模式,--net=none
为容器创建独立网络命名空间,但不为它做任何网络配置,容器中只有lo,用户可以在此基础上,对容器网络做任意定制。这个模式下,dokcer不为容器进行任何网络配置。需要我们自己为容器添加网卡,配置IP。因此,若想使用pipework配置docker容器的ip地址,必须要在none模式下才可以。
shell
docker network ls
NETWORK ID NAME DRIVER SCOPE
f65bddc829ad bridge bridge local
887f3f66f5dc host host local
7d7c2584672c none null local
所有docker在建立的时候会被默认分到bridge网络空间,并且会被分配不同IP
我遇到的具体问题就是:在docker A中,访问dockerB的服务,curl不通。这是因为我用的默认网关"172.17.0.1", 不是每个Docker的IP。因此应该配置的时候用网关IP。
2. 构建自己的网络
以下内容来自ChatGPT
在 Docker 中,容器名称不会自动映射为 IP 地址。容器名称只是一个方便的标识符,用于在 Docker 环境中标识和访问容器。
要在一个容器中通过容器名称访问另一个容器,你需要确保这两个容器连接到同一个网络,并且使用容器名称进行通信。
以下是一些步骤来确保容器之间可以通过名称进行通信:
-
创建一个自定义网络(如果还没有):
docker network create mynetwork
-
启动容器时,将它们连接到相同的网络并分配容器名称:
docker run -d --name containerA --network mynetwork imageA docker run -d --name containerB --network mynetwork imageB
在这个例子中,我们将容器A和容器B连接到同一个名为
mynetwork
的网络,并分别分配了容器名称containerA
和containerB
。 -
在容器A中通过容器名称访问容器B:
ping containerB
Docker 会自动解析容器名称
containerB
并将其转换为相应的 IP 地址。
请确保容器A和容器B都在同一个网络中,并且容器名称没有冲突。如果仍然无法访问,请确认网络配置和容器名称是否正确,并确保容器正常运行。
对于已经启动的Docker放入到指定网络
是的,对于已经启动的 Docker 容器,你可以通过使用 docker network connect
命令将其连接到指定的网络。
以下是将已经启动的容器连接到特定网络的步骤:
-
首先,使用
docker network ls
命令查看可用的网络列表,并找到你想要连接的目标网络的名称或 ID。 -
然后,使用以下命令将容器连接到目标网络:
docker network connect <network_name_or_id> <container_name_or_id>
其中
<network_name_or_id>
是目标网络的名称或 ID,<container_name_or_id>
是要连接的容器的名称或 ID。例如,如果要将容器
mycontainer
连接到网络mynetwork
,可以运行以下命令:docker network connect mynetwork mycontainer
-
连接成功后,容器将能够与目标网络中的其他容器进行通信。
请注意,连接容器到新网络后,容器将具有两个或多个网络接口,分别对应于每个连接的网络。这样,容器可以在不同的网络之间进行通信。你可以使用 docker network disconnect
命令将容器从网络中断开连接。
docker network disconnect <network_name_or_id> <container_name_or_id>
希望这可以帮助到你!如有其他问题,请随时提问。