如何从主机ping我的Docker容器

nx7onnlm  于 2023-11-17  发布在  Docker
关注(0)|答案(6)|浏览(163)

我在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系统,我错过了一些应用程序安装吗?

kh212irz

kh212irz1#

您无法直接使用Docker for Mac ping或访问容器接口。
目前最好的解决方案是从另一个容器连接到您的容器。目前,由于Apple尚未解决OSX的问题,我们无法提供到这些容器的路由。我们正在跟踪此要求,但目前我们无法对此做任何事情。

lima

Lima可以通过socket_vmnet在虚拟机上添加主机可访问的接口(现在是2023年,lima用于牧场主/podman桌面)

# Install
brew install lima socket_vmnet

# Customise the `shared` network if required. 
vi ~/.lima/_config/networks.yaml

# Set up the sudoers file for launching `socket_vmnet` from Lima
limactl sudoers >etc_sudoers.d_lima
sudo install -o root etc_sudoers.d_lima /etc/sudoers.d/lima

# Create a containerd VM on the `shared` network
echo | limactl start \
  --network lima:shared \
  --vm-type vz \
  --mount-type virtiofs \
  --set '.containerd.system = true | .containerd.user = false' \
  template://debian-12

# You may want to add this ip/mac address to /etc/bootptab
# so the IP address remains consistent on this VM. 
lima ip -j address show lima0 \
 | jq -r '.[0] as $if
    | "lima  1  \($if.address)  \($if.addr_info[] |select(.family == "inet") |.local)"'

# Setup network and route
lima sudo nerdctl network create ctr01 --subnet 10.2.3.0/24
sudo /sbin/route add 10.2.3.0/24 192.168.105.3 # or configured networks.yaml

# Test
lima sudo nerdctl run --detach --net ctr01 --ip 10.2.3.3 nginx
ping -c 2 10.2.3.3
curl http://10.2.3.3

字符串

Docker插件/VirtualBox

当通过VirtualBox或任何VirtualBox VM(如a Vagrant definition)运行Docker Server、Docker Machine时,您可以设置一个“仅主机网络”并通过该网络访问Docker VM网络。
如果你使用的是default boot 2docker虚拟机,不要改变现有的接口,因为你会停止很多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


通过VM将docker bridge网络的路由添加到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


你不会得到从主机Map到虚拟机的卷,但作为奖励,它使用的CPU比Docker 2.5.x版本少得多。

pu82cl6c

pu82cl6c2#

作为替代方案,如果您的容器包含bash shell,则可以通过
第一个月
然后你可以ping你的虚拟IP

yacmzcpb

yacmzcpb3#

它在这种情况下工作:

  1. Windows主机
  2. Windows主机上安装的Linux虚拟机
    1.安装在Linux VM主机上的Docker容器
    现在你必须注意到这一点。容器在一个隔离的网络中,但通过Docker容器主机适配器连接到互联网。所以你必须告诉内核Linux在你的网络中可用,然后在你的Linux VM中可用:
# sysctl net.ipv4.conf.all.forwarding=1
# sudo iptables -P FORWARD ACCEPT

字符串
现在,在Windows主机中,您必须为我们的容器网络添加路由:例如,路由添加“Docker容器网络”“Linux VM IP”

# route add 172.17.0.0/16 192.168.1.20

sc4hvdpw

sc4hvdpw4#

设置:
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是host的接口,docker0是docker的虚拟默认桥。
现在在PC-B中添加路由

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


ping/直接访问容器服务。

8yparm6h

8yparm6h5#

假设你有W-> Windows机器,L-Linux Vbox VM(eth0,eth 1)和docker app(使用端口8989)在此L-Linux Vbox VM上运行。提供程序无论如何都不需要Vbox或W-> a win。您要在浏览器上键入http://app:8989。有两种方法afak;自动运行vagrant或手动配置Vbox虚拟机的简单方法,通过“Host-only Adapter”(实际上是eth 1)进行端口转发;通常eth0是Vbox默认保留的10.0.2.15 IP分配。或者在win/lin/mac上的命令提示符下通过“VBoxManage”命令,您可以设置网络或通过脚本进行自动化。

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

字符串
运行docker app

sudo docker run -p 8989:8989 ...


在windows资源管理器(W-> windows机器)浏览您的应用程序

http://app:8989


你仍然不能ping“172.17.0.2“,这是docker容器IP在这种情况下从W-> windows机器。这可能会运行跨平台win/lin/mac。你可能想看看Vbox手册和Vagrant手册,特别是网络。

qzwqbdag

qzwqbdag6#

可以在一个相同的网络中运行感兴趣的容器,其中包含一个带有OpenVPN服务器的附加容器,以便您可以从主机通过VPN连接查看容器:

  • 使用docker network create --subnet=172.19.0.0/24 my-netcreate a network,容器可以看到彼此。
  • 使用docker run--net my-net参数将容器附加到它。
  • 在同一网络中运行一个带有OpenVPN的附加容器。这次您需要VPN连接-p 1194:1194/udp的端口Map。
  • 在主机上使用OpenVPN客户端连接到这个网络与容器ping他们.

此外,您可能需要在OpenVPN客户端配置文件中注解掉redirect-gateway指令,并将push "route 172.19.0.0 255.255.255.0"添加到服务器配置文件(并删除其他推送)。

相关问题