我怎么能从我的主机 ping 我的 docker 容器

Posted

技术标签:

【中文标题】我怎么能从我的主机 ping 我的 docker 容器【英文标题】:How could I ping my docker container from my host 【发布时间】:2017-01-06 02:37:21 【问题描述】:

我在我的 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_seq 0 的请求超时....

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

【问题讨论】:

Docker for Mac 还是 Docker Toolbox? 您应该提及您使用的 Ubuntu 版本以及您使用的 Docker 版本。另外,您是否查看了适用于您的 Docker 版本的有关网络的 Docker 文档? Docker for Mac、Docker 1.12.1、Ubuntu 11.10 【参考方案1】:

You can't ping or access a container interface directly with Docker for Mac.

当前最好的解决方案是从 另一个容器。目前我们没有办法提供路由 由于 Apple 尚未解决的 OSX 问题,这些容器 解决。我们正在跟踪此要求,但我们无能为力 就目前而言。

Docker 工具箱/虚拟箱

当通过 VirtualBox 或任何 VirtualBox VM(如 a Vagrant definition)运行 Docker Toolbox、Docker Machine 时,您可以设置 "Host-Only Network" 并通过它访问 Docker VMs 网络。

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

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

sudo route add 172.22.0.0/16 192.168.99.100

添加permanent route to osx 有点复杂

然后你可以从你的 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 + Ansible 设置

这是我的运行配置...

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", hostname: true
  config.vm.provider "virtualbox" do |vb|
    vb.gui = false
    vb.memory = "4000"
    vb.cpus = "4"
  end
  config.vm.provision "ansible" do |ansible|
    ansible.verbose = "v"
    ansible.playbook = "tasks.yaml"
  end
end

ansible tasks.yaml 配置固定网络。

- hosts: all
  become: yes
  vars:
    ansible_python_interpreter: auto_silent
    docker_config:
      bip: 10.7.2.1/23
      host: ["tcp://10.7.7.7:2375"]
      userland-proxy: false
  tasks:

  - ansible.builtin.apt:
      update_cache: yes
      force_apt_get: yes
      pkg:
      - bridge-utils
      - docker.io
      - python3-docker
      - python-docker
      - iptables-persistent

  - ansible.builtin.hostname:
      name: docker

  - ansible.builtin.copy:
      content: " docker_config | to_json "
      dest: /etc/docker/daemon.json

  - ansible.builtin.lineinfile:
      line: 'DOCKER_OPTS="% for host in docker_config.host % -H  host  % endfor %"'
      regexp: '^DOCKER_OPTS='
      path: /etc/default/docker

  - ansible.builtin.systemd:
      name: docker.service
      state: restarted
  
  - ansible.builtin.iptables:
      action: insert
      chain: DOCKER-USER
      destination: 10.7.2.0/23
      in_interface: eth1
      out_interface: docker0
      jump: ACCEPT
  - ansible.builtin.shell: iptables-save > /etc/iptables/rules.v4

将docker bridge网络的路由通过VM添加到mac

$ sudo /sbin/route -n -v add -net 10.7.2.0/23 10.7.7.7

然后在环境中设置DOCKER_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 版本少得多。

【讨论】:

如何在我的机器上找到 Docker 网络范围 172.22.0.0/16?如何在我的机器上的 VM 192.168.99.100 上找到 Host Only 适配器 IP?在问他使用172.17.0.2的问题中,有什么关系?断开的链接... @powder366 Docker 网络范围在 VM 上。在 Docker for Mac moby VM 或您正在运行的任何其他 VM 平台中。 VM 终端上的ip ad sh 将列出 IP。【参考方案2】:

作为替代方案,如果您的容器包含 bash shell,您可以通过以下方式访问它

docker exec -it <CONTAINER ID> bash

然后你就可以ping你的虚拟IP了

【讨论】:

【参考方案3】:

它适用于这种情况:

    Windows 主机 Linux 虚拟机安装在 Windows 主机上 Docker 容器安装在 Linux VM 主机上

现在你必须注意这一点。容器在一个隔离的网络中,但通过你的 Docker 容器主机适配器连接到互联网。所以你必须告诉内核 linux 在你的网络中可用,然后在你的 Linux VM 中可用:

# sysctl net.ipv4.conf.all.forwarding=1
# sudo iptables -P FORWARD ACCEPT

现在在您的 Windows 主机中,您必须为我们的容器网络添加一个路由: route add "Docker container network" "Linux VM IP" 例如

# route add 172.17.0.0/16 192.168.1.20

【讨论】:

【参考方案4】:

设置:

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

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>

直接ping/访问容器服务。

【讨论】:

【参考方案5】:

假设您有 W-> windows 机器、L-Linux Vbox VM (eth0,eth1) 和 docker 应用程序(使用端口 8989)在此 L-Linux Vbox VM 上运行。 Provider 不一定非要 Vbox 或 W-> a win。你想在浏览器上输入http://app:8989。有两种方法 afak;通过“Host-only Adapter”(实际上是 eth1)自动运行 vagrant 或手动配置具有端口转发的 Vbox VM 的简单方法;通常 eth0 是 Vbox 的默认保留 10.0.2.15 IP 分配。或者在 win/lin/mac 上的命令提示符下通过“VBoxManage”命令您可以设置网络或通过脚本自动化。

webtier.vm.network "forwarded_port", guest: 8989, host: 8989

运行泊坞窗应用程序

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 Manual 和 Vagrant手动,尤其是网络。

【讨论】:

以上是关于我怎么能从我的主机 ping 我的 docker 容器的主要内容,如果未能解决你的问题,请参考以下文章

为啥我ping不通我的docker容器

无法从我的 Docker 容器内部连接到主机的 localhost

无法从我的本地主机访问 docker 上的 apache

如何将文件夹从我的主机挂载到自定义 docker 映像,在目录中使用 Dockerfile 进行设置? [复制]

我的vmware虚拟机ping得到外网,ping不到主机了,怎么解决啊

为啥我的虚拟机ping不通物理机?