Docker网络管理
端口映射详解
默认情况下,docker容器和宿主机之间的网络是隔离的,docker容器在启动的时候,如果不指定端口映射参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。我们可以使用端口映射的方式,将容器中的端口映射到宿主技到某个端口上,这样我们就可以通过宿主机的ip + port的方式来访问容器里的内容。
Docker的端口映射
Docker端口映射有两种方式:
1. 随机映射:-P(大写),将容器内部开放的网络端口随机映射到宿主机的一个端口上,这个过程是docker自己控制的,好处是docker自己分配端口而且不会冲突,但是生产环境不建议使用。
2. 指定映射:-p(小写) ,一个指定端口上只可以绑定一个容器。格式为:宿主机ip:宿主机端口:容器端口。
随机映射实践
随机映射有两种:默认随机映射和指定主机随机映射
1)默认随机映射:
#命令格式:
docker run -d -P [镜像名称]
启动nginx镜像
docker run -d nginx
docker run -d -P nginx
两次启动nginx,第一次没有大P参数,第二次带上P参数后,在宿主机(0.0.0.0)上就启动打开了32768端口,宿主机上32768端口就映射到容器80端口上。我们在浏览器输入http://127.0.0.1:32768/可以看到nginx欢迎页面,说明nginx也是正常访问的。
如果我们将带有P参数的命令多次执行启动多个nginx容器,可以发现这个端口是在32768上递增累加的。而且这个新增的也是可以在浏览器上正常可以访问的。
上面示例展示了默认随机映射的效果。
2)指定主机随机映射:
#命令格式:
docker run -d -p [宿主机ip] ::[容器端口] --name [容器名称][容器镜像]
指定映射实践
指定映射也有两种模式:指定端口映射和指定多端口映射
1)指定端口映射
#命令格式: docker run -d -p [宿主机ip]:[宿主机端口]:[容器端口] --name[容器端口][容器镜像] #如果不指定宿主机ip 默认就是0.0.0.0
如下
2)指定多端口映射
#命令格式: docker run -d -p [宿主机端口1]:[容器端口] -p [宿主机端口1]:[容器端口] --name[容器端口][容器镜像]
Docker网络模式
从docker1.7.0版本开始,docker正式把网络跟存储着两个部分的功能实现都以插件化的形式剥离出来,允许用户通过指令的方式来选择不同的后段实现。这也是docker希望围绕着容器的强大生态系统的积极尝试。剥离出来的独立网络项目叫做libnetwork,libnetwork中的网络模型(Container Networking Model,CNM)十分简洁,可以让上层大量的应用容器最大程度的不去关心底层的实现。
Docker几种网络模式
docker有下面几种网络模式,在docker run 命令在创建 Docker 容器时,可以用 --net 选项指定容器的网络模式。
1. bridge模式:
Docker的默认网络模式,它会在docker启动的时候会为每个容器自动的配置好自己的分配Network Namespace、设置IP等网络信息,并将并将一个主机上的Docker容器连接到一个虚拟网桥上,当Docker server启动时会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上,同一个宿主机所有容器都在同一个网络下,彼此之间可以进行通信。不过它利用宿主机的网卡进行通信,涉及到网络转换,因此会造成资源消耗,网络效率比较低。
2. host模式:
宿主网络模式,容器和宿主机共享网络,容器使用宿主机的ip进行通信。
3. container模式:
新创建的容器间的使用,使用已创建的网络,类似一个局域网。容器和容器共享网络,和宿主机关系不大。
4. none模式:
无网络模式,不做任何网络配置,容器启动后没有网络连接,所以可以最大限度的定制化。
5. overlay模式:
容器彼此不再一个网络,而且能够互相通信。
bridge模式实践
docker的容器默认可以访问外网,但是外网访问不了容器,可以使用端口映射的方式访问容器的服务,还有一种方法就是桥接到物理网络,在上面docker端口映射就是使用的bridge模式,我们也可以通过该模式来创建桥接网络。
创建网络命令:
docker network create --driver [网络类型] [自定义网络名称]
--driver参数后面用于指定网络类型。
我们创建一个网络,如下
上面创建了一个新的网络bridge-1,通过docker network ls命令就可以查看到。
Docker网络命令
#查看网络命令帮助
docker network help
#创建一个网络
docker network create
#将一个容器连接到一个网络
docker network connect
#展示网络列表
docker network ls
#删除一个或者多个网络
docker network rm
#从网络断开一个容器
docker network disconnect
#显示一个或者多个网络详细信息
docker network inspect
#查看容器端口信息
docker port 容器id