若容器是在虚拟机内,则需要先固定虚拟机的
IP
。
关于
Hyper-V
的虚拟机
IP
固定操作可以参考
Hyper-V固定虚拟机IP
;
docker-compose.yml
编写注意点
为了能够保证每次容器获取到的
IP
都是固定的,所以需要定义网段和为每个容器指定
IP
demo 如下:
version: "3"
services:
mysql:
image: mysql:8
command: --default-authentication-plugin=mysql_native_password
environment:
- MYSQL_PASSWORD=123456
- MYSQL_ROOT_PASSWORD=123456
container_name: mysql
restart: always
networks:
default:
ipv4_address: 172.19.0.1
redis:
image: redis:6.2.2-alpine
ports:
- "6379:6379"
volumes:
- ./redis/data:/data
container_name: redis
restart: always
networks:
default:
ipv4_address: 172.19.0.2
php56:
image: php:5.6-fpm-alpine
environment:
TZ : 'Asia/Shanghai'
restart: always
container_name: php5.6
networks:
default:
ipv4_address: 172.19.0.56
php73:
image: php:7.3.18-fpm-alpine
environment:
TZ : 'Asia/Shanghai'
restart: always
container_name: php5.6
networks:
default:
ipv4_address: 172.19.0.73
networks:
default:
ipam:
config:
- subnet: 172.19.0.0/16
这个时候,若是 Linux
环境,是可以直接通过 IP
访问容器了。
容器IP通过虚拟机路由到宿主机
虚拟机开启路由转发
sudo sed -i 's!#net.ipv4.ip_forward=1!net.ipv4.ip_forward=1!g' /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf
sudo iptables -P FORWARD ACCEPT
windows开启路由转发
获取虚拟机的IP
ifconfig eth0
结果如下(192.168.137.128):
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.137.128 netmask 255.255.255.0 broadcast 192.168.137.255
inet6 fe80::215:5dff:fe2a:9b0a prefixlen 64 scopeid 0x20<link>
ether 00:15:5d:2a:9b:0a txqueuelen 1000 (Ethernet)
RX packets 812947 bytes 916704076 (916.7 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 481002 bytes 77532801 (77.5 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
windows上通过 powershell
查看路由表
route print 172.19.0.0
结果如下(路由表没数据):
===========================================================================
12...00 15 5d 2a 9b 09 ......Hyper-V Virtual Ethernet Adapter #2
14...e4 54 e8 c4 ad fc ......Realtek PCIe GbE Family Controller
1...........................Software Loopback Interface 1
25...00 15 5d 6c 85 b7 ......Hyper-V Virtual Ethernet Adapter
===========================================================================
IPv4 路由表
===========================================================================
活动路由:
永久路由:
IPv6 路由表
===========================================================================
活动路由:
永久路由:
windows使用管理员权限打开 powershell
添加路由表
route add -p 172.19.0.0 mask 255.255.255.0 192.168.137.128
windows再次查看路由表
===========================================================================
12...00 15 5d 2a 9b 09 ......Hyper-V Virtual Ethernet Adapter
14...e4 54 e8 c4 ad fc ......Realtek PCIe GbE Family Controller
1...........................Software Loopback Interface 1
25...00 15 5d 6c 85 b7 ......Hyper-V Virtual Ethernet Adapter
===========================================================================
IPv4 路由表
===========================================================================
活动路由:
网络目标 网络掩码 网关 接口 跃点数
172.19.0.0 255.255.255.0 192.168.137.128 192.168.137.1 16
===========================================================================
永久路由:
网络地址 网络掩码 网关地址 跃点数
172.19.0.0 255.255.255.0 192.168.137.128 1
===========================================================================
IPv6 路由表
===========================================================================
活动路由:
永久路由:
再也不用担心新增/修改服务时,影响其他服务了。