添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
很拉风的小狗  ·  Proxmox ...·  2 周前    · 
发呆的春卷  ·  定价 - Red Hat 虚拟机 | ...·  4 天前    · 
强健的回锅肉  ·  Css for input ...·  5 月前    · 
任性的菠菜  ·  Python - ...·  5 月前    · 

于是乎,就探究探究能不能直接通过 容器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 路由表
===========================================================================
活动路由:
永久路由:

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

目前已经搭建好了ubuntu容器,但是如果想要在本机通过ip访问容器端口服务,不能直接ping通 ubuntu ifconfig root@c0035d371ca4:~# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.2 netmask 255.255...
docker容器的网络访问网络访问模式Bridge networksHost networkingOverlay networksMacvlan networksNone: Disable networking网络测试网络访问原理 网络访问模式 容器的子网络基于驱动,是可插拔的(pluggable)。默认情况下,存在以下几种驱动程序,它们提供核心的联网功能: Bridge:网桥(bridge)是默认的网络驱动。当应用程序在单机模式(standalone)的容器中运行且需要通信时,通常会使用网桥驱动。 sudo docker inspect -f='{{.NetworkSettings.IPAddress}}' $(sudo docker ps -a -q) 列出所以容器对应的名称,ip,端口 docker inspect -f='{{.Name}} {{.NetworkSettings.IPAddress}} {{.HostConfig.PortBindings}}' $(docker ps -aq)
  参考资料:   https://serverfault.com/questions/55611/loopback-to-forwarded-public-ip-address-from-local-network-hairpin-nat   https://www.jianshu.com/p/4a358a120983   书接上回,我通过docker部署了一个gitlab容器,并且想用它来实...
首先讲一下 docker的网络模式: 我们使用docker run创建容器时,可以使用--net选项指定容器的网络模式,docker一共有4中网络模式: 1:bridge模式,--net=bridge(默认)。 这是dokcer网络的默认设置。安装完docker,系统会自动添加一个供docker使用的网桥docker0,我们创建一个新的容器时,容器通过DHCP获取一个与docker0同网段的IP地址。并默认连接到docker0网桥,以此实现容器与宿主机的网络互通。如下: 2:host模式,--net=ho
2、link容器别名访问(ps: 官方文档中已经不推荐使用) 3、同一自定义网络下可通过容器访问 4.docker compose部署可通过service服务名访问(单机) 5.docker swarm 可通过service服务名访问(多主机集群 跨主机通讯)
docker搭建了lnmp环境后,如果需要访问安装在宿主机上的数据库或中间件,是不能直接使用127.0.0.1这个ip的,这个ip容器中指向容器自己,那么应该怎么去访问宿主机呢:         例如你的docker环境的虚拟IP是192.168.99.100,那么宿主机同样会托管一个和192.168.99.100同网段的虚拟IP,并且会是主IP:192.168.99.1,那么就简单了,在容器