为什么有人会为两个 docker 容器使用相同的网络名称空间?
Why would anyone use the same network namespace for two docker containers?
为什么要通过网络命名空间连接两个 docker 容器,而不仅仅是通过一个网络?
据我所知,唯一的区别是您可以使用本地主机调用另一个容器。我没有看到任何需要这样做的用例。
有人有这方面的经验吗?
我能想到的一个原因是使用了您的容器中不可用的工具或命令。下面这个例子直接来自 docker run
docs:
NETWORK: CONTAINER
Example running a Redis container with Redis binding to localhost
then running the redis-cli
command and connecting to the Redis server over the localhost
interface.
$ docker run -d --name redis example/redis --bind 127.0.0.1
$ # use the redis container's network stack to access localhost
$ docker run --rm -it --network container:redis example/redis-cli -h 127.0.0.1
以类似的方式,可以使用此技术调试 容器。例如,如果您的容器没有 tcpdump
,您可以创建一个包含它的图像:
docker build -t tcpdump - <<EOF
FROM ubuntu
RUN apt-get update && apt-get install -y tcpdump
CMD tcpdump -i eth0
EOF
和run
一个用于调试您的应用程序的容器:
docker run --rm --net=container:my-app tcpdump
如果您的问题更多是关于 Kubernetes,一些有趣的链接是:
为什么要通过网络命名空间连接两个 docker 容器,而不仅仅是通过一个网络?
据我所知,唯一的区别是您可以使用本地主机调用另一个容器。我没有看到任何需要这样做的用例。
有人有这方面的经验吗?
我能想到的一个原因是使用了您的容器中不可用的工具或命令。下面这个例子直接来自 docker run
docs:
NETWORK: CONTAINER
Example running a Redis container with Redis binding to
localhost
then running theredis-cli
command and connecting to the Redis server over thelocalhost
interface.$ docker run -d --name redis example/redis --bind 127.0.0.1 $ # use the redis container's network stack to access localhost $ docker run --rm -it --network container:redis example/redis-cli -h 127.0.0.1
以类似的方式,可以使用此技术调试 容器。例如,如果您的容器没有 tcpdump
,您可以创建一个包含它的图像:
docker build -t tcpdump - <<EOF
FROM ubuntu
RUN apt-get update && apt-get install -y tcpdump
CMD tcpdump -i eth0
EOF
和run
一个用于调试您的应用程序的容器:
docker run --rm --net=container:my-app tcpdump
如果您的问题更多是关于 Kubernetes,一些有趣的链接是: