Macos 如何从主机ping docker容器

Macos 如何从主机ping docker容器,macos,docker,networking,Macos,Docker,Networking,我在mac上创建了一个ubuntu docker容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5d993a622d23 ubuntu "/bin/bash" 42 minutes ago Up 42 minutes 0.0.0.0:123->123/tcp kickass_ptolemy 我将端口设置为123 我的集装箱IP为17

我在mac上创建了一个ubuntu docker容器

CONTAINER ID  IMAGE   COMMAND      CREATED         STATUS         PORTS                 NAMES
5d993a622d23  ubuntu  "/bin/bash"  42 minutes ago  Up 42 minutes  0.0.0.0:123->123/tcp  kickass_ptolemy
我将端口设置为123

我的集装箱IP为
172.17.0.2

docker inspect 5d993a622d23 | grep IP
"LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
                    "IPAMConfig": null,
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
在我的Mac电脑上,我尝试ping我的容器

Ping 172.17.0.2
,我收到了icmp的请求超时\u seq 0

我该怎么办?所以我的本地机器可以ping我安装的容器。我的容器是一个普通的ubuntu系统,我是否错过了一些应用程序安装

当前最好的解决方案是从连接到容器 另一个容器。目前我们无法提供路由 由于OSX的问题,苹果公司还没有对这些容器进行修改 断然的。我们正在跟踪这一要求,但我们无能为力 目前还不清楚

Docker工具箱/VirtualBox 当通过VirtualBox或任何VirtualBox虚拟机(如)运行Docker Toolbox、Docker Machine时,您可以通过它设置并访问Docker虚拟机网络

如果您使用的是
default
boot2docker虚拟机,请不要更改现有接口,因为这样会使大量Docker实用程序停止工作,请添加一个新接口

您还需要通过VM的新IP地址设置从Mac到容器网络的路由。在我的例子中,Docker网络范围是
172.22.0.0/16
,VM上的仅主机适配器IP是
192.168.99.100

sudo route add 172.22.0.0/16 192.168.99.100
添加一个更复杂的

然后你可以从你的Mac电脑上获取容器

machost:~ ping -c 1 172.22.0.2
PING 172.22.0.2 (172.22.0.2): 56 data bytes
64 bytes from 172.22.0.2: icmp_seq=0 ttl=63 time=0.364 ms

--- 172.22.0.2 ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.364/0.364/0.364/0.000 ms
流浪者+易变的设置 这是我的跑步配置

Vagrant.configure(“2”)do | config|
config.vm.box=“debian/contrib-buster64”
config.vm.hostname=“docker”
config.vm.network“private_network”,ip:“10.7.7.7”,主机名:true
config.vm.provider“virtualbox”do | vb|
vb.gui=false
vb.memory=“4000”
vb.cpus=“4”
结束
config.vm.provision“ansible”do | ansible|
ansible.verbose=“v”
ansible.playbook=“tasks.yaml”
结束
结束
ansible
tasks.yaml
用于配置固定网络

-主机:所有
变成:是的
变量:
ansible_python_解释器:自动静音
docker_配置:
bip:10.7.2.1/23
主持人:[”tcp://10.7.7.7:2375"]
用户地代理:false
任务:
-ansible.builtin.apt:
更新缓存:是
强制执行:是的
包装:
-桥牌
-docker.io
-蟒蛇3号码头工人
-巨蟒码头工人
-iptables持久
-ansible.builtin.hostname:
姓名:docker
-ansible.builtin.copy:
内容:{{docker_config}to_json}
dest:/etc/docker/daemon.json
-ansible.builtin.LINEINFLE:
行:“DOCKER_OPTS=“{%forhost in DOCKER_config.host%}-H{{{host}}{%endfor%}”中的主机
regexp:“^DOCKER\u OPTS=”
路径:/etc/default/docker
-ansible.builtin.systemd:
姓名:docker.service
状态:重新启动
-ansible.builtin.iptables:
行动:插入
链:DOCKER-USER
目的地:10.7.2.0/23
in_接口:eth1
输出接口:docker0
跳转:接受
-ansible.builtin.shell:iptables保存>/etc/iptables/rules.v4
通过VM将docker网桥网络的路由添加到mac

$ sudo /sbin/route -n -v add -net 10.7.2.0/23 10.7.7.7
然后在环境中设置
DOCKER\u HOST=10.7.7.7
,以使用新VM

$ export DOCKER_HOST=10.7.7.7 
$ docker run --name route_test --rm -d node:14-slim node -e "require('http').createServer((req, res) => {
 res.writeHead(200, {'Content-Type':'text/plain'})
 res.end('hello')
}).listen(3000)"
$ docker container inspect route_test -f '{{ .NetworkSettings.Networks.bridge.IPAddress }}'
$ curl http://10.7.2.3:3000
hello
$ docker rm -f route_test

您无法将卷从主机映射到vm,但作为奖励,它使用的cpu比Docker 2.5.x版本少得多。

作为替代方案,如果您的容器合并了bash shell,您可以通过

docker exec-it bash

然后您可以ping虚拟ip设置:

PC-A
A是docker主机,
PC-B
是网络中的另一台PC。要从
PC-B
ping/访问docker容器,请在主机中运行以下
iptables
-规则

iptables -A FORWARD -i docker0 -o eth0 -j ACCEPT

iptables -A FORWARD -i eth0 -o docker0 -j ACCEPT
注意:
eth0
是主机的接口,
docker0
是docker的虚拟默认网桥

现在在PC-B中添加路线

route add -net <dockerip> netmask <net mask> gw <docker's host>

route add-net netmask gw它在这种情况下工作:

  • Windows主机
  • Windows主机上安装的Linux虚拟机
  • Linux虚拟机主机上安装的Docker容器
  • 现在你必须注意这一点。容器位于隔离的网络中,但通过Docker容器主机适配器连接到internet。因此,您必须告诉内核linux在网络中可用,然后在linux VM中可用:

    #sysctl net.ipv4.conf.all.forwarding=1
    #sudo iptables-P向前接受
    
    现在,在Windows主机中,您必须为我们的容器网络添加路由: 例如,路由添加“Docker容器网络”“Linux VM IP”

    #路线添加172.17.0.0/16 192.168.1.20
    
    假设您有W->windows机器、L-Linux Vbox虚拟机(eth0、eth1)和docker应用程序(使用端口8989)在这个L-Linux Vbox虚拟机上运行。提供商不必使用Vbox或W->a win。您希望在浏览器上键入内容。afak有两种方法;通过“仅主机适配器”(实际上是eth1)自动或手动配置Vbox虚拟机并进行端口转发的简单方法;通常eth0是Vbox默认的保留10.0.2.15 IP分配。或者在win/lin/mac上的命令提示符下,通过“VBoxManage”命令,您可以设置网络或通过脚本实现自动化

    webtier.vm.network "forwarded_port", guest: 8989, host: 8989
    
    运行docker应用程序

    sudo docker run -p 8989:8989 ...
    
    在windows资源管理器(W->windows机器)上浏览您的应用程序

    http://app:8989
    

    在这种情况下,您仍然无法从W->windows机器ping“172.17.0.2”,这是docker容器IP。这可能会运行跨平台的win/lin/mac。您可能需要查看Vbox手册和Vagrant手册,尤其是网络

    Docker for Mac或Docker Toolbox?您应该提及您正在使用的Ubuntu版本以及您正在使用的Docker版本。另外,您是否查阅了适用于Docker版本的Docker网络文档?Docker for Mac、Docker 1.12.1、Ubuntu 11.10如何在我的机器上找到Docker网络范围172.22.0.0/16?如何在我的机器上的VM 192.168.99.100上找到仅主机的适配器IP