簡體   English   中英

我怎么能從我的主機 ping 我的 docker 容器

[英]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 問題,我們無法為這些容器提供路由。 我們正在跟蹤此要求,但目前我們對此無能為力。

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

然后在環境中設置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

它適用於這種情況:

  1. 視窗主機
  2. 安裝在 Windows 主機上的 Linux VM
  3. 安裝在 Linux VM 主機上的 Docker 容器

現在你必須注意這一點。 容器位於隔離網絡中,但通過 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是主機的接口, docker0docker0的虛擬默認網橋。

現在在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM