容器?络
容器?络实质上也是由 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 容器的默认?络驱动,是通过?桥来实现?络通讯 ( ?桥?络的实现可以基于硬件,也可以基于软件 )。 Overlay ?络是借助 Docker 集群模块 Docker Swarm 来搭建的跨 Docker Daemon ?络,可以通过它搭建跨物理主机的虚拟?络,进?让不同物理机中运?的容器感知不到物理机的存在。
容器之间互联
Docker提倡一个容器只包含一个应用,但是目前很多系统是由多服务组成,此时就需要不同的容器之间能够通过网络来进行通信。要让容器间进行通讯,需要在创建容器时(docker create 或docker 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 --expose 23306 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 bridge webapp:latest
端口映射
除了容器和容器间进行通讯外,还有直接访问容器内应用的需求。比如此时有一个Web容器,需要直接访问容器内的应用,此时就需要进行端口的映射。通过端口的映射可以把容器的端口映射到宿主机操作系统上,当访问宿主机中的端口时,数据就会自动发送给与之映射的容器端口。 使?端口映射选项的格式是 -p <ip>:<host-port>:<container-port> ,其中 ip 是宿主操作系统的监听 ip,可以?来控制监听的?卡,默认为0.0.0.0,也就是监听所有?卡。host-port 和 container-port 分别表?映射到宿主操作系统的端口和容器的端口,这两者是可以不?样的,例如可以将容器的 80 端口映射到宿主操作系统的 8080 端口,传? -p 8080:80 即可。
|