在Docker for Mac中,您无法直接ping或访问容器接口。
目前最佳解决方案是从另一个容器连接到您的容器。目前,由于苹果尚未解决的OSX问题,我们无法为这些容器提供路由。我们正在跟踪这个需求,但目前我们无法做任何事情。
lima
Lima可以通过socket_vmnet
在虚拟机上添加主机可访问的接口(现在是2023年,lima在rancher/podman桌面中使用)
brew install lima socket_vmnet
vi ~/.lima/_config/networks.yaml
limactl sudoers >etc_sudoers.d_lima
sudo install -o root etc_sudoers.d_lima /etc/sudoers.d/lima
echo | limactl start \
--network lima:shared \
--vm-type vz \
--mount-type virtiofs \
--set '.containerd.system = true | .containerd.user = false' \
template://debian-12
lima ip -j address show lima0 \
| jq -r '.[0] as $if
| "lima 1 \($if.address) \($if.addr_info[] |select(.family == "inet") |.local)"'
lima sudo nerdctl network create ctr01 --subnet 10.2.3.0/24
sudo /sbin/route add 10.2.3.0/24 192.168.105.3
lima sudo nerdctl run --detach --net ctr01 --ip 10.2.3.3 nginx
ping -c 2 10.2.3.3
curl http://10.2.3.3
Docker Toolbox/VirtualBox
在运行Docker Toolbox时,通过VirtualBox或任何VirtualBox虚拟机(如Vagrant定义)运行Docker Machine,您可以设置一个"Host-Only Network"并通过它访问Docker虚拟机的网络。
如果您正在使用default
的boot2docker虚拟机,请不要更改现有的接口,因为这将导致许多Docker实用程序停止工作,请添加一个新的接口。
您还需要设置从您的Mac到容器网络的路由,通过您的虚拟机的新IP地址。在我的情况下,Docker网络范围是172.22.0.0/16
,虚拟机上的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
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桥接网络的路由添加到虚拟机上,以便通过mac进行通信。
$ sudo /sbin/route -n -v add -net 10.7.2.0/23 10.7.7.7
然后在环境中设置
DOCKER_HOST=10.7.7.7
以使用新的虚拟机。
$ 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版本少得多。