docker 网络

来源:互联网 发布:java 判断是不是汉字 编辑:程序博客网 时间:2024/04/19 10:59
docker支持bridge, host, null 三个网络驱动。默认在bridge网络内启动容器。
docker使用网桥来实现容器与主机,容器与容器之间的网络链接。网桥可以理解为一个交换机,一个网桥对应一个网络。
bridge: 网桥
null: 容器内只有lo接口 
host: 容器内网络接口配置信息和主机相同

查看网络:
docker network ls

查看连接到网络上的容器
docker network inspect bridge

把容器从网络断开
docker network disconnect bridge nginx

创建网络
docker network create -d bridge my-new-network

把容器增加到网络中
docker run -d --net=my-new-network -name db training/postgres

查看容器所在的网络
docker inspect --format='{{json .NetworkSettings.Networks}}' web

容器链接: 
链接通过--link建立,具体格式如下:
--link <name|id>[:alias]
name:容器名
alias:链接别名,如果未指定别名则与容器名一致。

依赖于容器的名字。启动web容器并连接到db容器。
docker run -d --name db training/postgres
docker run -d -P --name web --link db:db training/webapp python app.py

查看连接情况
docker inspect -f "{{.HostConfig.Links}}" web

链接在源容器和目的容器之间建立一个安全的隧道,避免对外暴露源容器的端口,减少攻击风险。
使用链接实现容器连接时,docker会基于--link提供的信息自动创建几个环境变量:
1.<alias>_NAME, 其中alias是--link所带的参数中的别名
2.针对源容器暴露的每个端口,prefix=<name>_PORT_<port>_<protocol>:
  prefix_ADDR: 服务对应ip地址
  prefix_PORT: 服务端口
  prefix_PROTO: 服务协议, TCP/UDP
3.源容器的最小对外暴露端口
<alias>_PORT
4.docker也会把源容器的环境变量暴露给目的容器

这些环境变量的作用:
配置连接db容器中数据库所需信息,通过连接实现的容器链接是安全和私密的,只有连接到本容器的容器才能跟本容器交互。

检查目的容器的hosts文件,从中看到增加了db容器的ID和ip地址,从而可以在web容器内通过容器名直接访问db.
如果源容器重启,这些环境变量会有什么变化?
重启db容器,再查看web容器的hosts, 从中看到db的ip地址已经做了更新。也就是说源容器重启时,所有与其连接的目的容器的/etc/hosts文件会被自动更新。
从而保证链接关系不因容器的重启而受影响。所以应该使用hosts文件中的信息,而不是环境变量中的信息去解析IP地址.
原创粉丝点击