Docker 网络主要有以下两个作用:
- 容器间的互联和通信以及端口映射
- 容器IP变动时候可以通过服务名直接网络通信而不受到影响
只要是处于同一个Docker 网络下的容器就可以使用服务名直接访问,而无需担心重启。
docker容器网络模式
- bridge网络模式:使得容器与容器之间可以相互互通
bridge网络模式是基于NAT模式下的网络通信方式。此驱动为Docker的默认设置驱动,使用这个驱动的时候,将创建出来的Docker容器连接到Docker网桥上。作为最常规的模式,bridge模式已经可以满足Docker容器最基本的使用需求了。然而其与外界通信使用NAT,增加了通信的复杂性,在复杂场景下使用会有诸多限制。
- host网络模式:让容器程序可以使用主机网络
容器内的网络并不是希望永远跟主机是隔离的,有些基础业务需要创建或更新主机的网络配置,我们的程序必须以主机网络模式运行才能够修改主机网络,这时候就需要用到 Docker 的 host 主机网络模式。因此可以认为host驱动适用于对于容器集群规模不大的场景。
- none网络模式:不得使用任务的网络
none 网络模式即不为 Docker Container 创建任何的网络环境,容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。可以说 none 模式为 Docke Container 做了极少的网络设定,但是俗话说得好"少即是多",在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制开发。这也恰巧体现了 Docker 设计理念的开放。
- container网络模式:将两个容器放到统一网络空间中,可以直接通过localhost访问
container网络模式允许一个容器共享另一个容器的网络命名空间。当两个容器需要共享网络,但其他资源仍然需要隔离时就可以使用 container 网络模式,例如我们开发了一个 http 服务,但又想使用 nginx 的一些特性,让 nginx 代理外部的请求然后转发给自己的业务,这时我们使用 container 网络模式将自己开发的服务和 nginx 服务部署到同一个网络命名空间中。container 网络模式是 Docker 中一种较为特别的网络的模式,处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用 localhost 高效快速通信。
docker容器网络命令
- 创建网络
参数说明:
--driver:驱动程序类型
--gateway:主子网的IPV4和IPV6的网关
--subnet:代表网段的CIDR格式的子网
mynet:自定义网络名称
不指定任何选项的时候默认的--driver(网络模式)也是bridge(桥接),但是gateway和subnet会自动生成。
bash
docker network create 网络名称
docker network create -d bridge mynetwork
docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 mynet
- 查看查看网络列表
bash
docker network ls
- 查询网络的模型详细信息
bash
docker network inspect 网络名称
- 网络连接
bash
docker network connect 网络名称 容器名称
- 网络断开
bash
docker network disconnect 网络名称 容器名称
- 网络删除
bash
docker network rm 网络名称
- 删除所有不再使用的网络
bash
docker network prune
- 创建并运行容器时指定网络
bash
docker run --name containerName -p 80:80 -d --network my_network nginx
Docker 安装时,自动在host上创建了如下3个网络:
docker network ls
NETWORK ID NAME DRIVER SCOPE
ff11ffdbd211 bridge bridge local
a80155c5275d host host local
b67166d3dfba none null local
使用示例
1、创建容器时挂载网络
bash
#创建一个桥接类型的网络
docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 myNet1
#创建并运行容器时指定网络
docker run --name containerName -p 80:80 -d --network myNet1 myNginx
#不想用时可以断开网络
docker network disconnect myNet1 myNginx
2、把已存在的容器连接到新网络
bash
#创建一个桥接类型的网络
docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 myNet2
#为容器连接新的网络
docker network connect myNet2 myNginx
#不想用时可以断开网络
docker network disconnect myNet2 myNginx
docker-compose给容器挂载网络
使用docker-compose up -d命令编排一组容器时会默认创建一个网络,并且这组容器全部都会加入到网络当中,容器之间可以直接使用服务名去通信。
如果想要指定网络,可以参考如下配置:
bash
networks:
mynet:
driver: bridge
ipam:
config:
- subnet: "192.168.0.101/16"
gateway: 192.168.0.100
配置好网络后,在每个服务下可以指定使用的网络:
bash
version: '3'
services:
nginx:
image: nginx:alpine
container_name: nginx-dev
environment:
- TZ=Asia/Shanghai
ports:
- "80:80"
volumes:
- /usr/local/docker/workspace/nginx/html:/usr/share/nginx/html
- /usr/local/docker/workspace/nginx/conf/nginx.conf:/etc/nginx/conf.d/default.conf
networks:
- mynet
networks:
mynet:
driver: bridge
ipam:
config:
- subnet: "192.168.0.101/16"
gateway: 192.168.0.100
这样容器编排时,所有容器都会加入到mynet
这个自定义网络中。