[英]How could I ping my docker container from my host
我在我的 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 ping 或访问容器接口。
当前最好的解决方案是从另一个容器连接到您的容器。 目前,由于 Apple 尚未解决的 OSX 问题,我们无法为这些容器提供路由。 我们正在跟踪此要求,但目前我们对此无能为力。
当通过 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
然后你可以从你的 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", 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
然后在环境中设置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
您不会将卷从主机映射到虚拟机,但作为奖励,它使用的 CPU 比 Docker 2.5.x 版本少得多。
作为替代方案,如果您的容器包含一个 bash shell,您可以通过以下方式访问它
docker exec -it <CONTAINER ID> bash
然后你可以ping你的虚拟IP
它适用于这种情况:
现在你必须注意这一点。 容器位于隔离网络中,但通过 Docker 容器主机适配器连接到 Internet。因此,您必须告诉内核 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
设置:
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
是docker0
的虚拟默认网桥。
现在在PC-B
添加路由
route add -net <dockerip> netmask <net mask> gw <docker's host>
直接ping/访问容器服务。
假设您有 W-> windows 机器、L-Linux Vbox VM(eth0、eth1)和 docker 应用程序(使用端口 8989)在这个 L-Linux Vbox VM 上运行。 Provider 无论如何都不需要 Vbox 或 W-> a win。你想在你的浏览器上输入http://app:8989 。有两种方法 afak; 通过“仅主机适配器”(实际上是 eth1)使用端口转发自动或手动配置 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 docker 容器 IP“172.17.0.2”。这可以运行跨平台的 win/lin/mac。您可能需要查看 Vbox 手册和 Vagrant 手册,特别是网络。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.