Docker容器IP访问容器服务

前言

使用 Docker 搭建了一些服务,每一次新增服务,都需要在 nginx 的容器做一些操作。

于是乎,就探究探究能不能直接通过 容器IP+端口 来访问容器中的服务。

环境

  • Windows
  • Hyper-V
  • Ubuntu 20.04(虚拟机)
  • docker
  • docker-compose

准备工作

若容器是在虚拟机内,则需要先固定虚拟机的 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开启路由转发

  1. 获取虚拟机的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
  1. 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 路由表
===========================================================================
活动路由:
  无
永久路由:
  无
  1. windows使用管理员权限打开 powershell 添加路由表
# 下面的命令是添加永久路由的,若不需要添加永久路由,可以去掉 -p
# 172.19.0.0 是虚拟机中Docker的IP段
# 255.255.255.0 写死就好
# 192.168.137.128 是虚拟机的IP
route add -p 172.19.0.0 mask 255.255.255.0 192.168.137.128
  1. windows再次查看路由表
===========================================================================
接口列表
 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 路由表
===========================================================================
活动路由:
网络目标        网络掩码          网关       接口   跃点数
       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 路由表
===========================================================================
活动路由:
  无
永久路由:
  无

完成

最后

再也不用担心新增/修改服务时,影响其他服务了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值