Docker 安装时会自动在host上创建三个网络
none网络
- 挂在这个网络下的容器除了io, 没有任何网卡, 容器创建时, 可以通过—network=none指定使用none网络
- 一些对安全性要求高且不需要联网的应用可以使用none网络, 如生成随机密码
host网络
- 连接到host网络的容器共享Docker host的网络栈, 容器的网络配置与host完全一样
- 优点一是性能, 但要考虑端口冲突问题, host已使用的端口就不能再用了
- 优点二是让容器可以直接配置host网络, 比如某些跨host的网络解决方案, 其本身也是以容器方式运行, 需要对网络进行配置
bridge网络
docker安装时会创建一个命名为docker0的linux bridge. 如果不指定—network, 创建的容器默认都会挂到docker0上
user-defined网络
用户可以根据业务需要创建user-defined网络, docker提供3种user-defined网络驱动:
bridge, overlay, macvlan, overlay和macvlan用于创建跨主机的网络.
# 通过bridge驱动创建bridge网络
docker network create --driver bridge my_net
# 展示
brctl show
# 容器可在启动时指定网络
docker run -it --network=my_net <container>
# 连接不同的network
docker network connect my_net my_net2
容器间通信
IP通信
- 两个容器要能通信, 必须要有属于容一个网络的网卡, 满足这个条件后, 就可以通过IP交互了, 具体做法是在容器创建时通过—network指定响应的网络, 或者通过docker network connect 将现有容器加入到指定网络中
Docker DNS Server
- 从Docker1.10版本开始, docker daemon实现了一个内嵌的DNS server, 使容器可以直接通过容器名通信, 只需在启动时用—name为容器命名即可
- 但docker DNS只能在user-defined网络中使用, 默认的bridge网络是无法使用DNS的
joined容器
joined容器可以使两个或多个容器共享一个网络栈, 共享网卡和配置信息, joined容器之间可以通过127.0.0.1直接通信
将容器与外部世界连接
容器访问外部世界
容器默认就能访问外网, 外网指容器网络以外的网络环境, 其中原理是网桥docker0做了一个网络地址转换(NAT), 将包的源地址替换成host地址发送出去
外部世界访问容器
docker可将容器对外提供服务的端口映射到host的某个端口, 外网通过该端口访问容器, 容器启动时通过 -p 参数映射端口