网络管理
Docker 网络很重要,重要的,我们在上面学到的所有东西都依赖于网络才能工作。我们从两个方面来学习网络:端口映射和网络模式 为什么先学端口映射呢? 在一台主机上学习网络,学习端口映射最简单,避免过多干扰。
端口映射详解
默认情况下,容器和宿主机之间网络是隔离的,我们可以通过端口映射的方式,将容器中的端口,映射到宿主机的某个端口上。这样我们就可以通过宿主机的ip+port的方式来访问容器里的内容
Docker的端口映射
- 随机映射 -P(大写)
- 指定映射 -p 宿主机ip:宿主机端口:容器端口
注意: 生产场景一般不使用随机映射,但是随机映射的好处就是由docker分配,端口不会冲突, 不管哪种映射都会有所消耗,影响性能,因为涉及到映射的操作
随机映射实践
随机映射我们从两个方面来学习:
- 默认随机映射
- 指定主机随机映射
默认随机映射
#命令格式:
docker run -d -P [镜像名称]
#命令效果:
#先启动一个普通的nginx镜像
$ docker run -d nginx
#查看当前宿主机开放了哪些端口
$ netstat -tnulp
#启动一个默认随机映射的nginx镜像
$ docker run -d -P nginx
#查看当前宿主机开放了哪些端口
$ netstat -tnulp
注意: 宿主机的32768被映射到容器的80端口 -P 自动绑定所有对外提供服务的容器端口,映射的端口将会从没有
使用的端口池中自动随机选择,但是如果连续启动多个容器的话,则下一个容器的端口默认是当前容器占用端口号+1,端口一般都是从32768开始分配映射。
指定主机随机映射
#命令格式
:~$ docker run -d -p [宿主机ip]::[容器端口] --name [容器名称][镜像名称]
#命令效果
:~$ docker run -d -p 192.168.8.14::80 --name nginx-1 nginx
#检查效果
:~$ docker ps
#随机映射还可以这么写(省略ip,默认0.0.0.0,注意端口前是::)
:~$ docker run -d -p ::80 --name nginx-1 nginx
指定映射实践
指定端口映射我们从二个方面来讲:
- 指定端口映射
- 指定多端口映射
指定端口映射
#命令格式:
docker run -d -p [宿主机ip]:[宿主机端口]:[容器端口] --name [容器名字][镜像名称]
#注意:
#如果不指定宿主机ip的话,默认使用 0.0.0.0,
#命令实践:
#现状我们在启动容器的时候,给容器指定一个访问的端口 1199
docker run -d -p 192.168.8.14:1199:80 --name nginx-2 nginx
#查看新容器ip
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' 0ad3acfbfb76
#查看容器端口映射
docker ps
多端口映射方法
#命令格式
docker run -d -p [宿主机端口1]:[容器端口1] -p [宿主机端口2]:[容器端口2] --name [容器名 称][镜像名称]
#开起多端口映射实践
docker run -d -p 520:443 -p 6666:80 --name nginx-3 nginx
#查看容器进程
docker ps
网络管理基础
docker网络命令
#查看网络命令帮助
:~$ docker network help
connect Connect a container to a network
#将一个容器连接到一个网络
create Create a network
#创建一个网络
disconnect Disconnect a container from a network
#从网络断开一个容器
inspect Display detailed information on one or more networks
#在一个或多个网络上显示详细信息
ls List networks
#网络列表
prune Remove all unused networks
#删除所有未使用的网络
rm Remove one or more networks
#删除一个或多个网络。
经常使用的网络查看命令
#查看当前主机网络
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
#网络id #名称 #驱动 #范围
c2dcffa83a29 bridge bridge local
c4deefdaf53b host host local
57942890c6d6 none null local
#查看bridge的网络内部信息
:~$ docker network inspect bridge
查看容器详细信息
#命令格式:
docker inspect [容器id]
#命令效果:
查看容器全部信息:
:~$ docker inspect 930f29ccdf8a
查看容器网络信息:
:~$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' 930f29ccdf8a
查看容器端口信息
#命令格式:
docker port [容器id]
#命令效果:
:~$ docker port 930f29ccdf8a
网络模式简介
从1.7.0版本开始,Docker正式把网络跟存储这两个部分的功能实现都以插件化的形式剥离出来,允许用户通过指令来选择不同的后端实现。这也就是Docker希望构建围绕着容器的强大生态系统的一些积极尝试。 剥离出来的独立网络项目叫做libnetwork,libnetwork中的网络模型(Container Networking Model ,CNM)十分简洁,可以让上层的大量应用容器最大程度上不去关心底层实现。
docker的常用的网络模式
==bridge模式==: 简单来说:就是穿马甲,打着宿主机的旗号,做自己的事情。 Docker的默认模式,它会在docker容器启动时候,自动配置好自己的网络信息,同一宿主机的所有容器都在一个网络下,彼此间可以通信。类似于我们vmware虚拟机的桥接模式。 利用宿主机的网卡进行通信,因为涉及到网络转换,所以会造成资源消耗,网络效率会低。
1.png
==host模式:== 简单来说,就是鸠占鹊巢,用着宿主机的东西,干自己的事情。容器使用宿主机的ip地址进行通信。特点:容器和宿主机共享网络
2.png
==container模式==: 新创建的容器间使用,使用已创建的容器网络,类似一个局域网。 特点:容器和容器共享网络
3.png
==none模式:== 这种模式最纯粹,不会帮你做任何网络的配置,可以最大限度的定制化。 不提供网络服务,容器启动
后无网络连接。
4.png
==overlay模式==: 容器彼此不再同一网络,而且能互相通行。
5.png
网友评论