0%

Docker网络

《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驱动实现机制

  • 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规则进行通信

在新的网络模型中,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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: "3.5"
services:

proxy:
build: ./proxy
networks:
- custom_frontend
app:
build: ./app
networks:
- custom_frontend
- backend
db:
image: postgres
networks:
- backend

networks:
frontend:
# Use a custom driver
name: custom_frontend # 重新指定网络名 3.5以上支持
driver: custom-driver-1
backend:
# Use a custom driver which takes special options
driver: custom-driver-2
driver_opts:
foo: "1"
bar: "2"

2.3 设置默认的网络

加入一个已经存在的网络

1
2
3
4
networks:
default:
external:
name: my-pre-existing-network

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
2
3
4
5
6
7
8
9
10
version: "3.7"
services:
web:
networks:
hostnet: {}

networks:
hostnet:
external: true
name: host
1
2
3
4
5
6
7
8
9
10
services:
web:
...
networks:
nonet: {}

networks:
nonet:
external: true
name: none
1
2
3
4
5
6
7
8
services:
web:
...
build:
...
network: host
context: .
...

driver_opts:

指定选项列表作为键值对,以传递给该网络的驱动程序。

enable_ipv6

ipam

1
2
3
4
5
6
7
8
9
10
11
12
13
ipam:
driver: default # 自己配置驱动
config:
- subnet: 172.28.0.0/16
ip_range: 172.28.5.0/24
gateway: 172.28.5.254
aux_addresses:
host1: 172.28.1.5
host2: 172.28.1.6
host3: 172.28.1.7
options:
foo: bar
baz: "0"

internal:true

创建一个隔离网络

labels:

元数据

external

true 一个已经存在的网络

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: "3.7"

services:
proxy:
build: ./proxy
networks:
- outside
- default
app:
build: ./app
networks:
- default

networks:
outside:
external: true

具体指定已经存在的网络的名称

1
2
3
4
networks:
outside: # service中仍然使用这个
external:
name: actual-name-of-network # 是指的已经存在的网络名称

name (Added in version 3.5 file format)

命名这个网络

1
2
3
4
version: "3.7"
networks:
network1: # service使用的名称
name: my-app-net # 网络名称

2.5 services下 network的选项

1
2
3
4
5
services:
some-service:
networks:
- some-network # 要加入的网络
- other-network

alias 别名

1
2
3
4
5
6
7
8
9
10
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2

IPV4_ADDRESS, IPV6_ADDRESS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: "3.7"

services:
app:
image: nginx:alpine
networks:
app_net:
ipv4_address: 172.16.238.10
ipv6_address: 2001:3984:3989::10

networks:
app_net:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
- subnet: "2001:3984:3989::/64"

PRIORITY 网络连接顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: "2.4"
services:
app:
image: busybox
command: top
networks:
app_net_1:
priority: 1000
app_net_2:

app_net_3:
priority: 100
networks:
app_net_1:
app_net_2:
app_net_3: