当前位置: 首页 > 知识库问答 >
问题:

我怎么能从我的主机上定位我的码头集装箱

方恺
2023-03-14

我在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我的容器,

172.17.0.2,我得到请求超时icmp_seq0......

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

共有3个答案

邓翼
2023-03-14

它在这种情况下起作用:

  1. Windows主机

现在你必须注意这一点。容器位于隔离的网络中,但通过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
罗晨
2023-03-14

或者,如果您的容器合并了bashshell,则可以通过

docker exec-it

然后你可以ping你的虚拟ip

宿鹏程
2023-03-14

您不能直接使用Docker for Mac ping或访问容器接口。

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

当通过VirtualBox或任何VirtualBox虚拟机(如流浪定义)运行Docker工具箱、Docker机器时,您可以设置“仅限主机网络”并通过该网络访问Docker虚拟机网络。

如果您使用的是默认boot2docker VM,请不要更改现有接口,因为您将停止大量Docker实用程序的工作,请添加新接口。

您还需要通过VM的新IP地址设置从Mac到容器网络的路由。在我的例子中,Docker网络范围是172.22.0.0/16,VM上的仅主机适配器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.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

ansibletasks.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网桥网络的路由通过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

您不会将卷从主机映射到虚拟机,但作为奖励,它使用的cpu比Docker 2.5. x版本少得多。

 类似资料:
  • 但我怎么才能阻止码头服务器呢?我听说了一些关于stop.jar和start.jar的事情。我能在哪里找到它?它集成在Jetty-all-jar中吗?

  • 问题内容: 我在Mac上创建了一个Ubuntu Docker容器 我将端口设置为123。 我的容器IP是 在Mac上,我尝试ping我的容器, ,我收到icmp_seq 0的请求超时…。 我该怎么办?因此,我的本地计算机可以ping通我安装的容器。我是否在容器(这是一个普通的ubuntu系统)上缺少一些应用程序安装? 问题答案: 您不能直接使用Docker for Mac ping或访问容器接口

  • 请分享有关该主题的一些最佳实践。 情况:我们有产品在虚拟机中运行。在我们的产品中,我们有多个项目,它们正在使用我们的库。 任务:需要自动更新相应从属项目中已更改库项目的版本。 示例:库pom.xml文件的更改将触发使用库的依赖项目的更改。 措施:调查web挂钩、git挂钩、maven bom(这一个有利于集中库) 结果:这种解决方案对我们不起作用。 P. S.目前正在考虑拥有一个节点js脚本,该脚

  • 问题内容: 这是我的整个源代码: 代码卡在了 fmt.Println(“ enq =”,t)上, 但是我不知道为什么,这太奇怪了。 问题答案: deQueue在失败情况下无限循环,这阻塞了CPU。Goroutine在执行CPU工作时不会屈服。GOMAXPROCS必须大于等于2才能获得CPU并行性。 只是为了踢,这是使用高阶通道的线程安全,无阻塞队列实现:https : //gist.github.

  • Docker运行命令具有将主机目录装入容器的选项 Dockerfile有指令 在我看来,在使用Dockerfile时,无法指定<code>主机目录 除了想要与其他容器共享卷之外,DOCKER 文件中的 VOLUME 还有其他用法吗?