docker安装时会自动创建三个网络,我们可以用docker network ls指令查看:
顾名思义,none网络就是没有网络,挂在这个网络下的容器出了lo没有其他网卡,该容器处于完全封闭的状态,无法跟外界的任何容易进行通信。对于一些对安全性有较高的要求且不需要联网的应用可以通过--network=none来指定使用none网络。
连接到host网络的容器会共享docker主机的网络和端口,容器中的网络配置和主机一模一样,可以通过--network=host指定使用host网络。
host网络适合对网络传输效率要求较高的场景,但是这种网络模式需要考虑端口占用的问题,docker host上已经使用的端口就不能再用了。这一点限制了host模式的使用范围。
bridge网络模式使用的更加广泛。如果创建容器时不指定networks,容器会默认以bridge模式启动。
使用docker network inspect bridge可以查看bridge网络的子网和网关地址等配置信息。
docker run -it --name=a busybox 查看以bridge模式启动的容器内的网络配置,其ip地址172.17.0.2是docker自动分配的(docker自动分配可以避免造成端口重复占用)。
我们可以根据业务需要创建自己的网络。docker提供了三种网络驱动:bridge、overlay、macvlan。后两种主要是用来创建跨主机的网络,后面再研究。我们可以用bridge驱动创建类似原生的bridge网络。
例如: docker network create --driver bridge my_net
可以看出我们已经成功创建了一个网桥,可以查看下它的网络配置
172.19.0.0/16是docker自动分配的网段,我们也可以自行指定ip网段,用--subnet和--gateway参数
例如: docker network create --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2
我们可以启动一个挂在自定义网络上的容器 docker run -it --network=my_net2 --name=b busybox
该容器的ip地址依然是docker自动从subnet中分配的,我们也可以用--ip指定容器的静态ip。但是需要注意的是只有创建时指定了subnet的网络才能指定静态ip。
docker run -it --network=my_net2 --ip 172.22.16.8 --name=c busybox
我们现在有三个容器a,b,c,其中a容器挂在原生的bridge网络上,bc同挂在my_net2上,那么bc容器可以相互通信, 但是不能和a容器进行通信,我们用ping命令进行查看:
那我们有没有办法让bc也能和a容器进行通信呢?只要为a容器添加一块my_net2的网卡就行啦,通过docker network connect my_net2 cc056c2d8c9e 实现。
上图可以看出a容器有两个网卡了,bridge和my_net2,现在它就可以和bc容器进行通信了。
结论:两个容器要能通信,必须要有同属于一个网络的网卡。这样就可以通过ip进行交互。
容器中有三种通信方式:ip通信、docker DNS Server、joined容器。
上述例子就是根据ip通信,但是通常情况下容器的ip地址为docker自动分配,要指定ip地址进行访问会比较麻烦,这种情况可以通过docker自带的DNS服务解决。
例如 docker run -it --network=my_net2 --name=busybox_bridge busybox 启动的容器,可以在b容器进行ping
joined容器可以使多个容器共享同一个网络栈,共享网络配置和网卡。这些joined容器之间可以直接通过127.0.0.1进行通信。
例如创建一个和busybox_bridge容器共享的容器busybox_bridge_2:
docker run -d -it --network=container:busybox_bridge --name=busybox_bridge_2 busybox
busybox_bridge_2 和 busybox_bridge 容器的网络配置一毛一样。那么这两个容器之间可以用127.0.0.1访问彼此的服务。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。