一、 任务描述
1、 了解Docker容器网络,了解如何配置基础网络,包括如何创建网络命名空间、绑定接口到网桥、端口映射等。
2、 了解Docker高级网络配置。
二、需要网络连接工具CRT
三、 任务实施
1、配置容器网络
(1) 启动一个/bin/bash容器,指定—net=none参数。
docker run -i -t --rm --net=none nginx /bin/bash
之后的操作都在克隆会话窗口进行的
(2) 在本地主机查找容器的进程ID,并为它创建网络命名空间。
docker inspect -f '{{.State.Pid}}' <370ddb764dc8,容器ID>
pid=1881 #数字是容器的进程ID
mkdir -p /var/run/netns #创建一个文件
ln -s /proc/$pid/ns/net /var/run/netns/$pid
(3) 检查网卡的IP和子网掩码信息。
ip addr show docker0
(4) 创建一对veth pair 接口A和B,绑定A到网桥docker0,并启用。
ip link add A type veth peer name B #创建一对veth pair接口A和B
yum install bridge-utils #安装网桥工具
brctl addif docker0 A #绑定A到网桥docker0
ip link set A up #启用网卡A
(5) 将B放到容器的网络命名空间,命名为eth0,启动它并配置一个可用IP(桥接网段)和默认网关。
ip link set B netns $pid
ip netns exec $pid ip link set dev B name eth0
ip netns exec $pid ip link set eth0 up
ip netns exec $pid ip addr add 172.17.0.1/16 dev eth0 #此处的IP地址是docker0的地址
ip netns exec $pid ip route add default via 172.17.0.1
2、通过端口映射访问容器
(1) 映射所有接口地址。
docker run -d -p 5000:5000 training/webapp python app.py
(2) 映射到指定地址的指定端口。
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
(3) 映射到指定地址的任意端口。
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
docker run -d -p 127.0.0.1:5002:5000/udp training/webapp python app.py #使用udp标记来标记udp端口
下面是udp标记的
(4) 查看映射端口配置。
docker port <27e9654fb881,容器ID> 5000
docker run -d -p 5003:5000 -p 3000:80 training/webapp python app.py #容器有自己的内部网络和IP地址,可以多次使用“-p” 标记来绑定多个端口
3、配置容器互联
(1) 自定义容器名称。
docker run -d -P --name Web training/webapp python app.py #切记容器不要冲突
docker ps -l #使用docker ps -l来验证设定的名称
docker inspect -f "{{.Name}}" <29fed0a98a33,容器ID> #查看容器修改过的名称
(2) 容器互联。
docker run -d --name db training/postgres #创建一个新的数据库容器
docker rm -f Web #删除之前创建的web容器
docker run -d -P --name Web --link db:db training/webapp python app.py #然后创建一个新的web容器,并将它连接到db容器
docker run --rm --name Web2 --link db:db training/webapp env #使用env命令来查看web容器的环境变量
docker run -t -i --rm --link db:db training/webapp /bin/bash
进入容器后 cat /etc/hosts
ping db
4、创建一个点到点的连接
(1)创建一个点到点连接。
- 启动两个容器,克隆2个会话框,共三个会话框
docker run -i -t --rm --net=none training/webapp /bin/bash
- 找到进程号,然后创建网络命名空间的跟踪文件
docker inspect -f '{{.State.Pid}}' <容器ID>
- 创建一对peer接口,然后配置路由
mkdir -p /var/run/netns
ln -s /proc/<容器进程号1>/ns/net /var/run/netns/<容器进程号1>
ln -s /proc/<容器进程号2>/ns/net /var/run/netns/<容器进程号2>
ip link add C type veth peer name D
ip link set C netns <容器进程号1>
ip netns exec <容器进程号1> ip addr add 10.1.1.1/32 dev C
ip netns exec <容器进程号1> ip link set C up
ip netns exec <容器进程号1> ip route add 10.1.1.2/32 dec C
ip link set C netns <容器进程号2>
ip netns exec <容器进程号2> ip addr add 10.1.1.1/32 dev D
ip netns exec <容器进程号2> ip link set D up
ip netns exec <容器进程号2> ip route add 10.1.1.2/32 dec D
- 容器1:ping 10.1.1.2
- 容器2:ping 10.1.1.1
- 两个容器已经可以互相ping通