4.3 docker 网络
涉及命令
# 列出运行在本地 docker 主机上的全部网络
docker network ls
# 提供 Docker 网络的详细配置信息
docker network inspect <NETWORK_NAME>
# 创建新的单机桥接网络,名为 localnet,其中 -d 不指定的话,默认是 bridge 驱动。并且主机内核中也会创建一个新的网桥。
docker network create -d bridge localnet
# 删除 Docker 主机上指定的网络
docker network rm
# 删除主机上全部未使用的网络
docker network prune
# 运行一个新的容器,并且让这个容器加入 Docker 的 localnet 这个网络中
docker container run -d --name demo1 --network localnet alpine sleep 3600
# 运行一个新的容器,并且让这个容器暴露 22、20 两个端口
docker container run -d --name web --expose 22 --expose 20 nginx
# 运行一个新的容器,并且将这个容器的 80 端口映射到主机的 5000 端口
docker container run -d --name web --network localnet -p 5000:80 nginx
# 查看系统中的网桥(centos 命令不可用)
brctl show
容器的网络模式
docker 容器的四种网络模式:bridge 桥接模式、host 模式、container 模式和 none 模式
启动容器时可以使用 –net 参数指定,默认是桥接模式。
网络模式 | 简介 | 备注 |
---|---|---|
Bridge | 此模式会为每一个容器分配、设置 IP 等,并将容器连接到一个 docker0 虚拟网桥,通过 docker0 网桥以及 Iptables nat 表配置与宿主机通信。 | 缺省模式。--link 只能使用在此模式下。 |
Host | 容器将不会虚拟出自己的网卡、配置自己的 IP 等,而是使用宿主机的 IP 和端口。 | |
Container | 创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围。 | 两个容器的进程可以通过 lo 网卡设备通信。 |
None | 该模式关闭了容器的网络功能。 | |
overlay | docker swarm 支持模式。用于连接不同机器上的 docker 容器,允许不同机器上的容器相互通信,同时支持对消息进行加密。 |
docker swarm 网络
当我们初始化一个 swarm 或是加入到一个 swarm 中时,在 docker 主机上会出现两种网络:
名称为 ingress 的 overlay 网络,用于传递集群服务的控制或是数据消息,若在创建 swarm 服务时没有指定连接用户自定义的 overlay 网络,将会加入到默认的 ingress 网络。
名称为 docker_gwbridge 桥接网络会连接 swarm 中所有独立的 docker 系统进程。docker_gwbridge 默认就是使用
172.18.0.0/16
作为子网范围。$ docker network ls NETWORK ID NAME DRIVER SCOPE e64a4026851d docker_gwbridge bridge local bgckv5kskicv ingress overlay swarm
安装 Docker 时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、none 、host
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
381a1613c3d4 bridge bridge local
93afb5d191c9 host host local
f0909ee01a3d none null local
Docker 内置这三个网络,运行容器时,你可以使用该 –network 标志来指定容器应连接到哪些网络。
该 bridge 网络代表 docker0 所有 Docker 安装中存在的网络。除非你使用该 docker run --network=选项指定
,否则 Docker 守护程序默认将容器连接到此网络。
命令 ip a
可查看当前支持的所有网络,其中 docker0 支 docker 网络。
host 模式
采用 host 模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。当然,有这样的方便,肯定会损失部分其他的特性,最明显的是 Docker Container 网络环境隔离性的弱化,即容器不再拥有隔离、独立的网络栈。另外,使用 host 模式的 Docker Container 虽然可以让容器内部的服务和传统情况无差别、无改造的使用,但是由于网络隔离性的弱化,该容器会与宿主机共享竞争网络栈的使用;另外,容器内部将不再拥有 所有的端口资源。
容器间数据通讯
第一种搭建容器的桥接网络,第二种使用 Docker 容器之间的 Link 机制(只适用于单机容器是互联)。
同一个宿主机上的多个 docker 容器之间如果想进行通信,可以通过使用容器的 ip 地址来通信,也可以通过宿主机的 ip 加上容器暴露出的端口号来通信。
前者会导致 ip 地址的硬编码,不方便迁移,并且容器重启后 ip 地址会改变,除非使用固定的 ip;后者的通信方式比较单一,只能依靠监听在暴露出的端口的进程来进行有限的通信。
通过 docker 的 link 机制可以通过一个 name 来和另一个容器通信,link 机制方便了容器去发现其它的容器并且可以安全的传递一些连接信息给其它的容器。
1.桥接网络
直接使用 docker inspect 容器 ID
查看容器的元信息,可获取到宿主机分配给容器的 IP。
2.Link 机制
--link <contain_name>:<alias>
用于同宿主机的容器 A 访问另一个容器 B 服务。contain_name 为 B 容器启动的名称(--name),alias 是可以在 A 容器中使用的 B 容器的 HOST。
示例如下
# 容器 B 先启动,是 mysql 服务,--name mysql
docker run --name mysql -p 3306:3306 -v /mysql/database/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
# 容器 A 后启动,用--link 使用容器 B 服务 --link mysql:aliasmysql
docker run -d -v /Docker:/usr/java/tomcat/apache-tomcat-8.5.27/webapps -p 8080:8080
--name MyTomcat --link mysql:aliasmysql javaweb:1.0 /root/run.sh
# 容器 A 后访问 mysql 的 URI: 将原来的 ip-127.0.0.1 替换成 aliasmysql
SQLALCHEMY_DATABASE_URI = 'mysql://root:123456@aliasmysql:3306/superset_1.0'
本章参考
Docker 配置文件 daemon.json 解析 https://www.jianshu.com/p/c7c7dc24b9e3
Docker 网络详解——原理篇 https://blog.csdn.net/meltsnow/article/details/94490994
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论