linux网络
为了支持在linux中网络协议栈能够支持多个实例,提出了一种网络命名空间的概念,不同的网络命名空间是相对隔离的
# 实现两个不同的网络名称空间互联的方式
1、veth设备对
# 查看设备的网络命名空间
[root@localhost ~]# ip netns ls
# 创建一个新的网络命名空间
[root@localhost ~]# ip netns add test
# 创建veth设备对:veth和veth01
[root@localhost ~]# ip link add veth type veth peer name veth01
[root@localhost ~]# ip a
26: veth01@veth: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 6a:25:0f:e4:d1:60 brd ff:ff:ff:ff:ff:ff
27: veth@veth01: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether d6:10:31:f8:1b:b7 brd ff:ff:ff:ff:ff:ff
# 给设备的网络命名空间绑定设备对
[root@localhost ~]# ip link set veth01 netns test
# 分别给设备对分配ip
[root@localhost ~]# ip netns exec test ip addr add 10.0.0.110/24 dev veth01
[root@localhost ~]# ip addr add 10.0.0.111/24 dev veth
# 分别重启设备对
[root@localhost ~]# ip netns exec test ip link set dev veth01 down
[root@localhost ~]# ip netns exec test ip link set dev veth01 up
[root@localhost ~]# ip link set dev veth down
[root@localhost ~]# ip link set dev veth up
# 测试设备对的连通性
[root@localhost ~]# ping 10.0.0.111
2、网桥
3、iptables
4、ipvs
docker网络
docker中的网络就是为了实现容器之间的互联
1、host模式
# 也就是将容器中的网络直接与宿主机网络进行绑定
[root@localhost ~]# docker run -d --rm --network host --name mynginx1 nginx
2、container模式
# 另外创建一个容器,共享其他指定容器的网络
[root@localhost ~]# docker run -d --network "container:mynginx" nginx # 共享mynginx容器的网络开始一个nginx
3、网桥模式
# 创建网桥
[root@localhost ~]# docker network create test1
# 使用创建好的网桥创建容器
[root@localhost ~]# docker run -d --network test1 --name mynginx1 nginx
4、None模式
[root@localhost ~]# docker run -it --network none centos
5、link模式类似于container模式
[root@localhost ~]# docker network connect lulu mynginx1
docker网桥的使用
--subnet :指定字网
--getway: 指定网关
[root@localhost ~]# docker network create hrhr --subnet 10.0.0.1/24 --gateway 10.0.0.2
# 创建网桥也可不指定网段和网关地址
[root@localhost ~]# docker network create hrhr --subnet 10.0.0.1/24 --gateway 10.0.0.2
[root@localhost ~]# docker network create lulu
# 查看网桥的详细信息
[root@localhost ~]# docker network inspect lulu
# 链接网桥
[root@localhost ~]# docker network connect lulu mynginx1
# 断开链接网桥
[root@localhost ~]# docker network disconnect lulu mynginx1
# 删除网桥
[root@localhost ~]# docker network rm test
# 清理网桥
[root@localhost ~]# docker network prune
# 处于同一网桥下的机器可以相互访问
[root@localhost ~]# docker run -d -it --name mycentos --network lulu centos
[root@localhost ~]# docker -d --network lulu --name nginx1 nginx
[root@localhost ~]# docker inspect nginx1 # 查看在网桥上分配给nginx1容器的ip地址
[root@localhost ~]# docker exec -it mycentos bash # 进入mycentos的控制终端
[root@ae1771b1befe /]# curl 172.21.0.4 # 访问本网桥下的nginx
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
..........
小案例:
# 1、创建网桥
[root@localhost ~]# docker network create lulu
# 创建一个python环境容器
[root@localhost linux]# docker run -d -it python:3.6 bash
# 进入容器安装django
[root@localhost linux]# docker exec -it objective_villani bash
root@1a00305f6ee4:/# pip3 install django
# 保存容器为本地镜像并打上tag
[root@localhost linux]# docker commit objective_villani python:django
[root@localhost linux]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python django d6b24ccb2fce 13 seconds ago 943MB
# 运行此容器
[root@localhost linux]# docker run -d -v /root/linux/:/opt/ -w /opt --network lulu python:django python manage.py runserver 0.0.0.0:8000
# 创建关联的nginx配置文件并创建运行nginx的容器
upstream django{
server 172.21.0.2:8000;
}
server {
server_name _;
listen 80;
location / {
proxy_pass http://django;
}
}
[root@localhost ~]# docker run -d -v /root/django.conf:/etc/nginx/conf.d/default.conf --network lulu --name nginxme -p 8000:80 nginx