《docker 容器与容器云第二版》& 官方文档读书笔记
Docker网络
Created: Nov 30, 2019 9:52 PM
一、Docker网络基础
1.1 构架
Docker daemon通过调用 libnetwork
对外提供的API完成网络的创建和管理功能。libnetwork中使用CNM来完成网络功能的提供。CNM包括 沙盒、端点和网络三种组件。
- 沙盒:一个沙盒包含了一个容器网络栈的信息。沙盒可以对容器的接口、路由和DNS设置等进行管理。一个沙盒可以有多个端点和多个网络。
- 端点:一个端点可以加入一个沙盒和一个网络。
- 网络:一个网络是一组可以直接互相连通的端点。
libnetwork
中存在5种驱动:
- bridge驱动
- host驱动
- overlay驱动
- remote驱动
- nulll驱动
实例:
首先创建两个网络
docker network create backend
docker network create frontend
然后创建容器
docker run --it --name c1 --net backend busybox
docker run --it --name c2 --net backend busybox
docker run --it --name c3 --net frontend busybox
1和2通,2和3不通
将2加入到frontend网络中
docker network connect frontend c2
1.2 bridge驱动实现机制
1.3 传统的link
docker run -d --name db mongo
docker run -d -P --name web --link db:webdb webapp python app.py
web容器叫做:接收容器或父容器
db容器叫:源容器或子容器
link究竟做了什么:
- 设置接受容器的环境变量
- 设置一个
_NAME 环境变量( WEBDB_NAME = /web/webdb) - 在源容器中设置的环境变量(
-e --env = []
,ENV
),也会在接收容器中设置。如:在源容器中 -e doc=docker 则在web容器中: WEBDB_ENV_doc = docker - 为源容器暴露的端口这只环境变量
- 设置一个
- 更新接受容器的/etc/hosts
- 在 /etc/hosts中添加源容器的ip和别名
- 建立iptables规则进行通信
1.4 新的link
在新的网络模型中,link只是给源容器起一个别名,这个别名只对接收容器有效。
此时在/etc/hosts中没有别名信息了,因为是通过DNS解析方式提供名字和别名解析。
二、docker-compose 中的网络
docker-compose version 2 后才开始支持网络相关选项
2.1 不设置
默认情况下,Compose为您的应用设置单个网络。服务的每个容器都加入默认网络,并且都可以被该网络上的其他容器访问,并且可以在与容器名称相同的主机名下被发现。
Your app’s network is given a name based on the “project name”, which is based on the name of the directory it lives in. You can override the project name with either the –project-name flag or the COMPOSE_PROJECT_NAME environment variable.
2.2 设置自己的网络
top-level的 networks可以用来自定义一个网络,也可以使用一个已经存在的网络
1 | version: "3.5" |
2.3 设置默认的网络
加入一个已经存在的网络
1 | networks: |
2.4 top-level的网络选项
driver:网络使用的驱动
The default driver depends on how the Docker Engine you’re using is configured, but in most instances it is bridge on a single host and overlay on a Swarm.
bridge:https://github.com/docker/labs/blob/master/networking/A2-bridge-networking.md
overlay: https://github.com/docker/labs/blob/master/networking/A3-overlay-networking.md
HOST OR NONE:使用network_mode https://docs.docker.com/compose/compose-file/#network_mode
或使用以下的方法:
1 | version: "3.7" |
1 | services: |
1 | services: |
driver_opts:
指定选项列表作为键值对,以传递给该网络的驱动程序。
enable_ipv6
ipam
1 | ipam: |
internal:true
创建一个隔离网络
labels:
元数据
external
true
一个已经存在的网络
1 | version: "3.7" |
具体指定已经存在的网络的名称
1 | networks: |
name (Added in version 3.5 file format)
命名这个网络
1 | version: "3.7" |
2.5 services下 network的选项
1 | services: |
alias 别名
1 | services: |
IPV4_ADDRESS, IPV6_ADDRESS
1 | version: "3.7" |
PRIORITY 网络连接顺序
1 | version: "2.4" |