7.配置容器的网络

容器⽹络

容器⽹络实质上也是由 Docker 为应⽤程序所创造的虚拟环境的⼀部分,它能让应⽤从宿主机操作系统的⽹络环境中独⽴出来,形成容器⾃有的⽹络设备、IP 协议栈、端口套接字、IP 路由表、防⽕墙等等与⽹络相关的模块。
在这里插入图片描述
在Docker网络中,有三个核心概念:
沙盒 ( Sandbox ):沙盒提供了容器的虚拟⽹络栈,也就是之前所提到的端口套接字、IP 路由表、防⽕墙等的内容。其实现隔离了容器⽹络与宿主机⽹络,形成了完全独⽴的容器⽹络环境。
⽹络 ( Network ):可以理解为 Docker 内部的虚拟⼦⽹,⽹络内的参与者相互可见并能够进⾏通讯。Docker 的这种虚拟⽹络也是于宿主机⽹络存在隔离关系的,其⽬的主要是形成容器间的安全通讯环境。
端点 ( Endpoint ):是位于容器或⽹络隔离墙之上的洞,其主要⽬的是形成⼀个可以控制的突破封闭的⽹络环境的出入口。当容器的端点与⽹络的端点形成配对后,就如同在这两者之间搭建了桥梁,便能够进⾏数据传输了。
这三者形成了 Docker ⽹络的核⼼模型,也就是容器⽹络模型 ( Container Network Model )。

Docker 的⽹络实现

容器⽹络模型为容器引擎提供了⼀套标准的⽹络对接范式,⽽在 Docker 中,实现这套范式的是 Docker 所封装的 libnetwork 模块。
在这里插入图片描述
Docker 官⽅提供了五种 Docker ⽹络驱动:Bridge Driver、Host Driver、Overlay Driver、MacLan Driver、None Driver。

Bridge ⽹络是 Docker 容器的默认⽹络驱动,是通过⽹桥来实现⽹络通讯 ( ⽹桥⽹络的实现可以基于硬件,也可以基于软件 )。
Host 容器将不会获得独立的network namespace,将和主机共用一个
Overlay ⽹络是借助 Docker 集群模块 Docker Swarm 来搭建的跨 Docker Daemon ⽹络,可以通过它搭建跨物理主机的虚拟⽹络,进⽽让不同物理机中运⾏的容器感知不到物理机的存在。

容器之间互联

Docker提倡一个容器只包含一个应用,但是目前很多系统是由多服务组成,此时就需要不同的容器之间能够通过网络来进行通信。要让容器间进行通讯,需要在创建容器时(docker createdocker run),使用 --link 选项进⾏配置进行配置

例如,MySql是用Docker搭建的,此时通过Docker搭建一个web应用并且连接MySql

docker run -d --name mysql -e MYSQL_RANDOM_ROOT_PASSWORD=yes mysql
docker run -d --name webapp --link mysql webapp:lates

此时,两个容器间的网络已经打通。而在Web的配置文件中直接写入MySql服务名就可以连接,Docker会将其指向MySql容器的IP

String url = "jdbc:mysql://mysql:3306/webapp";

别名连接
直接通过容器名连接缺乏一定的灵活性,还可以通过--link <name>:<alias>的形式进行别名连接

docker run -d --name webapp --link mysql:database webapp:lates
#应用中
String url = "jdbc:mysql://database:3306/webapp";

暴露端口
虽然网络打通了,但是这并不意味这能随意访问被连接容器的任何服务。Docker有一套网络安全机制,只有容器运行的端口,才可以被访问。通过docker ps可以看到容器暴露的端口,可以在创建容器时通过--expose配置需要暴露的端口。端口的暴露就类似于防火墙的开放端口

docker run -d --name mysql -e MYSQL_RANDOM_ROOT_PASSWORD=yes --expose 13306  mysql:5.7

管理⽹络

容器能够互相连接的前提是处于同一个网络中( 这⾥的⽹络是指容器⽹络模型中的⽹络 )。就像上面说的网络可以看作是Docker所虚拟的子网,而容器网络沙盒可以看作是虚拟的主机,只有当主机都处在同一个网络中才可以进行通讯。

当启动 Docker 服务时,它会为我们创建⼀个默认的 bridge ⽹络,⽽我们创建的容器在不专门指定⽹络的情况下都会连接到这个⽹络上。
通过 docker inspect 命令查看容器,可以在 Network 部分看到容器⽹络相关的信息。
在这里插入图片描述
Docker 默认创建的这个 bridge ⽹络是⾮常重要的,在没有明确指定容器⽹络时,容器都会连接到这个⽹络中
创建网络
docker CLI ⾥与⽹络相关的命令都以 docker network 开头,其中创建⽹络的命令是 docker network create

docker network create -d bridge individual

通过 -d 选项可以为新的⽹络指定驱动的类型,其值可以是刚才所提及的 bridge、host、overlay、maclan、none,也可以是其他⽹络驱动插件所定义的类型。这⾥我们使⽤的是 Bridge Driver ( 当我们不指定⽹络驱动时,Docker 也会默认采⽤ Bridge Driver 作为⽹络驱动 )。
通过 docker network ls 或是 docker network list 可以查看 Docker 中已经存在的⽹络。
在这里插入图片描述
在启动容器时,可以通过--network来指定要加入的网络,假如此时MySql加入了新建的网络

docker run -d --name mysql -e MYSQL_RANDOM_ROOT_PASSWORD=yes --network individual  mysql

那么Web容器如果还是之前的连接方式是无法启动的,因为Web容器和MySql容器不在一个网络下,启动并打通和MySql的网络也需要添加--network命令

docker run -d --name webapp --link mysql --network individual  webapp:lates

端口映射

除了容器和容器间进行通讯外,还有直接访问容器内应用的需求。比如此时有一个Web容器,需要直接访问容器内的应用,此时就需要进行端口的映射。通过端口的映射可以把容器的端口映射到宿主机操作系统上,当访问宿主机中的端口时,数据就会自动发送给与之映射的容器端口。

使⽤端口映射选项的格式是 -p <ip>:<host-port>:<container-port> ,其中 ip 是宿主操作系统的监听 ip,可以⽤来控制监听的⽹卡,默认为0.0.0.0,也就是监听所有⽹卡。host-port 和 container-port 分别表⽰映射到宿主操作系统的端口和容器的端口,这两者是可以不⼀样的,例如可以将容器的 80 端口映射到宿主操作系统的 8080 端口,传⼊ -p 8080:80 即可。
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值