You can't ping or access a container interface directly with Docker for Mac.
当前最好的解决方案是从
另一个容器。目前我们没有办法提供路由
由于 Apple 尚未解决的 OSX 问题,这些容器
解决。我们正在跟踪此要求,但我们无能为力
就目前而言。
Docker 工具箱/虚拟箱
当通过 VirtualBox 或任何 VirtualBox VM(如 a Vagrant definition)运行 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
添加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
将docker bridge网络的路由通过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
您不会将卷从主机映射到 vm,但作为奖励,它使用的 cpu 比 Docker 2.5.x 版本少得多。