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

新手上路,请多包涵

我在我的 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 系统?

原文由 Neil 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 519
2 个回答

您无法使用 Docker for Mac 直接 ping 或访问容器接口

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

Docker 工具箱/虚拟箱

当通过 VirtualBox 或任何 VirtualBox VM(如 Vagrant 定义)运行 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

添加 到 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

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

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

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

然后在使用新VM的环境中设置 DOCKER_HOST=10.7.7.7

 $ 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 版本少得多。

原文由 Matt 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

docker exec -it <CONTAINER ID> bash

然后你可以ping你的虚拟IP

原文由 Cesar Gomez Velazquez 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题