Docker Network

容器技术

相比于传统虚拟化技术对硬件资源的虚拟,容器技术是对进程的虚拟,提供更轻量级的虚拟化,实现进程和资源的隔离,更接近裸机性能。

Docker容器使用Docker Engine进行资源分配调度并调用Linux内核namespace API进行隔离,所有应用共用主机操作系统。

Docker 的四大网络模式

bridge模式:通过–network=bridge指定,使用Linux bridge和veth pair为Docker容器创建独立的网络栈,保证容器内的进程使用独立的网络环境,使容器和容器、容器和宿主机之间能实现网络隔离。

host模式:通过–network=host指定,容器和宿主机共享一个network namespace(网卡,IP和端口等)

container模式:通过–network=container:NAME_or_ID指定,新的容器将与一个已经存在容器共享network namespace,两个容器的进程可以通过lo网卡进行通信

none模式:通过–network=none指定,不对Docker容器的network namespace进行任何网络配置

Docker网络配置

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 查看容器IP
docker inspect -f "{{ .NetworkSettings.IPAddress }}" <containerNameOrId>
docker inspect <containerNameOrId> | grep '"IPAddress"' | grep -n 1

# 端口映射
docker run -p host_Port:container_Port -d <imageName>
# 实现原理为在iptable的nat表中添加规则
iptables -t nat -nL
# 查看端口映射
docker port <container> <port number>

# 访问外网
sysctl net.ipv4.ip_forward=1

# DNS和主机名
cat /etc/resolv.conf
cat /etc/hosts
cat /etc/hostname
# 修改dns
docker run --dns=address -d <imageName>
# 修改主机名
docker run -h hostname -d <imageName>
docker run --hostname=hostname -d <imageName>

# 创建自定义网络
docker network create -d bridge --subnet 172.25.0.0/16 netName
# 查看自定义网络信息
ip addr
docker inspect netID
# 查看主机的docker network
docker network ls
# 删除自定义网络
docker network rm netID
# 连接容器和网络
docker network connect netName_or_Id ContainerName_or_Id
# 断开容器和网络的连接(NetworkMode不会改变)
docker network disconnect netName_or_Id ContainerName_or_Id


# 发布服务
docker network create -d bridge netName
docker service publish svcName.netName
docker service attach containerId svcName.netName
# or
docker run -itd --publish-service svcName.netName.bridge imageName


# 容器互联
docker run -d imageName --link=containerName_or_Id:aliasName

参考

《Kubernetes网络权威指南》