How could I ping my docker container from my host
Solution 1
You can't ping or access a container interface directly with Docker for Mac.
The current best solution is to connect to your containers from another container. At present there is no way we can provide routing to these containers due to issues with OSX that Apple have not yet resolved. we are tracking this requirement, but we cannot do anything about it at present.
Docker Toolbox/VirtualBox
When running Docker Toolbox, Docker Machine via VirtualBox or any VirtualBox VM (like a Vagrant definition) you can setup a "Host-Only Network" and access the Docker VMs network via that.
If you are using the default
boot2docker VM, don't change the existing interface as you will stop a whole lot of Docker utilities from working, add a new interface.
You will also need to setup routing from your Mac to the container networks via your VM's new IP address. In my case the Docker network range is 172.22.0.0/16
and the Host Only adapter IP on the VM is 192.168.99.100
.
sudo route add 172.22.0.0/16 192.168.99.100
Adding a permanent route to osx is bit more complex
Then you can get to containers from your 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 setup
Here's my running config...
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
The ansible tasks.yaml
to configure a fixed network.
- 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
Add the route for the docker bridge network via the VM to the mac
$ sudo /sbin/route -n -v add -net 10.7.2.0/23 10.7.7.7
Then set DOCKER_HOST=10.7.7.7
in the environment to use the new 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
You don't get volumes mapped from the host to the vm, but as a bonus it uses a lot less cpu than the Docker 2.5.x release.
Solution 2
As an alternative, if your container has a bash shell incorporated, you can access it through
docker exec -it <CONTAINER ID> bash
and then you can ping your virtual ip
Solution 3
It works in this scenario:
- Windows host
- Linux VM installed on Windows host
- Docker container installed on Linux VM host
Now you have to note this. Containers are in a isolated network but connected to the internet throught your Docker container host adapter.So you have to tell kernel linux to be available in your network then in your Linux VM:
# sysctl net.ipv4.conf.all.forwarding=1
# sudo iptables -P FORWARD ACCEPT
Now in you Windows host you have to add a route for our container network: route add "Docker container network" "Linux VM IP" for example
# route add 172.17.0.0/16 192.168.1.20

Neil
• 3+ years of IT Experience in Analysis, Design, Development, Testing, Deployment and Implementation of Multi-Tier distributed applications using Java, J2EE Technologies. • 1 year Erlang Development, analysis and testing • Good experience on net setting and Cisco routers setting • Good experience on DevOps tools, like Jenkins, Ansible. etc • Good understanding of design patterns and n-tier architecture. • Excellent Java development skills using J2EE, Servlets, JSON, JMS, JDBC, and Java Beans. • Strong front-end UI development skills using scripting languages like JSTL, HTML5, JavaScript, JQuery and CSS. • Experience on XML and parsing methodologies like DOM and SAX. • Experience in Service Oriented Architecture (SOA) and developing Web services using SOAP, REST, XML, WSDL, JAXP XML Beans. • Experience on security design and development using Asymmetric cryptograph, Kerberos Protocol, Spring Security • Extensive experience in design, development and implementation of Model-View-Controller frame works using Sprint boot, Struts and Spring MVC. • Extensive experience in development and implementation of ORM framework Hibernate/ Hibernate with Spring Data Access. • Strong database skills in DB2 and MySQL. • Expertise in programming with SQL, PL/SQL and Stored Procedures. • Experienced with Java Multithreaded programming to develop multithreaded modules and applications. • Expertise in designing applications using various J2EE design patterns like Singleton, Value Object, Data Access Object, Factory, Session Façade and Business Delegate Service Locator etc. • Expertise in using and configuring various web & application servers like GlassFish, Apache Tomcat, Jetty and JBoss. • Proficiency in programming with different Java IDE's like IntellJ, Eclipse and Netbeans. • Extensive experience in Linux, UNIX, Shell scripting. • Used log4J for application logging and notification tracing mechanisms. • Worked with various Version Control Tools including GitHub, Subversion, Tortoise SVN and. • Experience on NoSQL DataBase including MangoDB, ElasticSearch
Updated on July 09, 2022Comments
-
Neil 6 months
I have created a ubuntu docker container on my mac
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
I set port as 123.
My container IP is
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,
On my Mac I try to ping my container,
Ping 172.17.0.2
, I got Request timeout for icmp_seq 0....What should I do? So my local machine can ping the container I installed. Did I missing some app installation on my container, which is a plain ubuntu system?
-
powder366 almost 5 yearsHow do I find the Docker network range 172.22.0.0/16 on my machine? How do I find the Host Only adapter IP on the VM 192.168.99.100 on my machine? In the question asked he used 172.17.0.2, whats the relation? Broken links...
-
Matt almost 5 years@powder366 The Docker network range is on the VM. Either in the Docker for Mac moby VM or whatever other VM platform you are running. An
ip ad sh
on a VM terminal will list the IP's.