docker 网络

Docker Network

1
docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3600; done"

linux netwoek namespace

linux namespace 实验(网络命名空间)

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
# linux netwoek namespace 
sudo ip netns list
sudo ip netns delete test1
sudo ip netns add test1
sudo ip netns add test2
# namespace 查看 ip 地址
sudo ip netns exec test1 ip a
# 查看本机 ip link
sudo ip link
# 查看 ip lick
sudo ip netns exec test1 ip link
# 启动
sudo ip netns exec test1 ip link set dev lo up

# ------------ simple example ------------
# link 是成对出现的
sudo ip link add veth-test1 type veth peer name veth-test2
# 把 veth-test1 添加到 test1 里面
# 这里时候宿主机的 veth-test1 会消失,但它会出现在 test1里面
sudo ip link set veth-test1 netns test1
sudo ip netns exec test1 ip link
# 继续添加 test2
sudo ip link set veth-test2 netns test2
# 为 veth-test1/2 分配 ip 地址,分配完成以后是不会立即出现 IP 的
sudo ip netns exec test1 ip addr add 192.168.1.1/24 dev veth-test1
sudo ip netns exec test2 ip addr add 192.168.1.2/24 dev veth-test2
# 启动端口
sudo ip netns exec test1 ip link set dev veth-test1 up
sudo ip netns exec test2 ip link set dev veth-test2 up
# 查看 IP 地址
sudo ip netns exec test1 ip a
sudo ip netns exec test2 ip a
# ping test2
sudo ip netns exec test1 ping 192.168.1.2

Docker Container Network

1
2
3
4
5
6
7
8
9
# 查看 container 的网络信息
docker network inspect <container id>
# 验证网络
sudo yum install -y bridge-utils # brctl
brctl show # 显示网络状况
ip a # 看本机网络 docker0 和上面的某条信息符合
# 查看 docker network 信息
docker network inspect bridge
# 在启动一个 container 重复执行上面的命令,发现会多一个 containers

host/none

1
2
3
4
5
6
7
8
# none
docker run -d --name test1 --network none busybox /bin/sh -c "while true; do sleep 3600; done"
dcoker exec -it test1 /bin/sh
ip a # 没有 ip and mac
# host
docker run -d --name test1 --network host busybox /bin/sh -c "while true; do sleep 3600; done"
dcoker exec -it test1 /bin/sh
ip a # 和主机共享一套 network namespace

多容器互通

  • app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from flask import Flask
from redis import Redis
import os
import socket

app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)


@app.route('/')
def hello():
redis.incr('hits')
return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())


if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
1
2
3
4
5
6
docker run -d --name redis redis
docker run -d --link redis --name flask-redis -e REDIS_HOST=redis cvno/flask-redis
docker exec -it flask-redis /bin/bash # 进入容器
env # 会发现 REDIS_HOST
# docker flask-redis example !!!
docker run -d -p 5000:5000 --link redis --name flask-redis -e REDIS_HOST=redis cvno/flask-redis

多机通信

4-10