Dockerfile
基本的配置:工作路径,文件复制,端口映射,容器主进程的启动命令,环境变量,设置一些参数,数据卷挂载,用户,健康检查,ONBUILD
CLI
网络配置
什么是网桥?
- 网桥工作于OSI参考模型的数据链路层。网桥一般有两个端口,每个端口均有自己的MAC地址,分别桥接两个网段。
- 功能:首先网桥具有数据过滤、存储和转发功能。其次,从网络大小上看,网桥可以将两个小的网段连接起来,以拓展网络距离和应用范围;从网络性能上看,网桥可以将一个大的LAN划分成两个小的网段,使原来位于一个冲突域的网络被分割为两个冲突域,提高了网站建设通信能力。
- 网桥的转发功能并不能阻隔广播,说明由网桥连接的两个网段依然同处一个广播域。
- 网桥的桥接表开始是空的,它的智能化休现在其具有的“自学习”功能。网桥端口每收到一个数据帧后,自动会将该数据帧的源发MAC地址与对应的网桥端口映射一一记录下来。对数据帧的目的MAC无法决策,即不知道目的MAC连接在哪个端口时,则采用泛洪(Flooding)法向接收此数据帧端口以外的其他端口广播。这样逐渐生成一个完整的桥接表。
什么是虚拟网桥?
- 比如一个虚拟Bridge 连接两个 VM 的虚拟网卡和物理网卡 eth0。
- Bridge 是偏低级的工具,更高级的工具是 Open vSwitch
- 在主机看来,容器就是一个个被隔离的 namespace
- 虚拟机网络经过Bridge的数据包不需要经过主机的的协议栈,直接可以到物理网卡就到物理网络中,所以效率是比较高的,容器的 Bridge 网络通常配置成内网形式,要出外网需要走 NAT,所以它的数据传输不像虚拟机的桥接形式可以直接跨过协议栈,而是必须经过协议栈,通过 NAT 和 ip_forward 功能从物理网卡转发出去,因此,从性能上看,Bridge 网络虚拟机要优于容器。
docker 网络配置
bridge 网络模式
-
bridge 网络模式 Docker 守护进程创建了一个虚拟以太网桥 docker0,新建的容器会自动桥接到这个接口,附加在其上的任何网卡之间都能自动转发数据包。
-
bridge 网络模式实现:Docker Daemon 利用 veth pair 技术,在宿主机上创建一对对等虚拟网络接口设备,假设为 veth0 和 veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。
Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0;
Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,宿主机的网络报文若发往 veth0,则立即会被 Container 的 eth0 接收,实现宿主机到 Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性。
host 网络模式
- 采用 host 网络模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换;
- host 网络模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
none 网络模式
- none 网络模式是指禁用网络功能,只有 lo 接口 local 的简写,代表 127.0.0.1,即 localhost 本地环回接口。
- none 网络模式即不为 Docker Container 创建任何的网络环境,容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。
container 网络模式
- Container 网络模式是 Docker 中一种较为特别的网络的模式。在创建容器时通过参数 –net container:已运行的容器名称|ID 或者 –network container:已运行的容器名称|ID 指定;
- 处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用 localhost 高效快速通信。
link
- 可以用来链接两个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信,并且接收容器可以获取源容器的一些数据,如源容器的环境变量。
- 未来版本可能会被移除,不推荐使用。
名称通信
- docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名称通信。方法很简单,只要在创建容器时使用 –name 为容器命名即可。
- 只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的,所以我们就需要自定义网络。
跨主机通信
- Pipework是一个简单易用的Docker容器网络配置工具。由200多行shell脚本实现。通过使用ip、brctl、ovs-vsctl等命令来为Docker容器配置自定义的网桥、网卡、路由等。
- 使用新建的bri0网桥代替缺省的docker0网桥,bri0网桥与缺省的docker0网桥的区别:bri0和主机eth0之间是veth pair
Compose file
docker-compose
搭建zk和redis的集群中碰见的问题
- 主要是redis费了点劲,redis配置文件中集群相关配置「根据分槽,定位到某个实例,保证实例之间可以互相访问的到」
- 使用redis5.0 创建集群的命令「应该是这样」
- 端口问题要看准,不能粗心
- 引发的问题就是对于docker的网络问题不清楚
- 数据卷挂载
好玩的
-- 配合各种Escape Sequence
string.rep('hahaha\t', 10)
参考
> 可在下面留言(需要有 GitHub 账号)