2 docker网络
一、Linux网络原理
docker网络严重依赖于linux网络
容器之间相互隔离
为了支持网络协议栈的多实例,linux提供了一个网络名称空间(Network Namespace)。不同的网络名称完全隔离。
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 457ae20eb7e3 python:3.6 "bash" About an hour ago Up About an hour compassionate_galois ceb39dffd1a7 nginx "/docker-entrypoint.…" 9 hours ago Up 9 hours 80/tcp wizardly_swirles [root@localhost ~]# docker run -d nginx 4b892b23e8e9cde7b9959983533801f920226f2c837b0e44877db97d5f9f9fda [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS 4b892b23e8e9 nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 80/tcp 457ae20eb7e3 python:3.6 "bash" About an hour ago Up About an hour ceb39dffd1a7 nginx "/docker-entrypoint.…" 9 hours ago Up 9 hours 80/tcp
容器之间的网络互通问题?
实现两个不同的网络名称空间互联的方式
1、veth设备对:容器里面的设备对与宿主机的是对应的
veth设备必须是成对出现。 如何证明是成对的: [root@localhost ~]# docker run -d -it centos [root@localhost ~]# docker ps [root@localhost ~]# docker exec -it keen_galois bash [root@a0c61974dd9f /]# ip a 与宿主机[root@localhost ~]# ip a比对
1、创建名称空间 [root@localhost ~]# ip netns add test01 [root@localhost ~]# ip netns list test01 2、创建veth设备对 [root@localhost ~]# ip link add veth type veth peer name veth001 [root@localhost ~]# ip a 生成了两个veth设备, 互为对方的peer。 3、绑定名称空间 [root@localhost ~]# ip link set veth001 netns test01 [root@localhost ~]# ip link show | grep veth 或[root@localhost ~]# ip a[root@localhost ~]# ip a 已经查看不到veth001,当我们进入test01命名空间之后,就可以查看到 进入test01查看: [root@localhost ~]# ip netns exec test01 bash [root@localhost ~]# ip link show 4、分配IP [root@localhost ~]# exit exit #从test01名称空间退出到root名称空间 [root@localhost ~]# ip netns exec test01 ip addr add 10.0.0.111/20 dev veth001 [root@localhost ~]# ip netns exec test01 bash [root@localhost ~]# ip a [root@localhost ~]# exit exit #从test01名称空间退出到root名称空间 [root@localhost ~]# ip addr add 10.0.0.112/20 dev veth [root@localhost ~]# ip a 5、重启 [root@localhost ~]# ip netns exec test01 ip link set dev veth001 down [root@localhost ~]# ip netns exec test01 ip link set dev veth001 up 重启后进入查看: [root@localhost ~]# ip netns exec test01 bash [root@localhost ~]# ip a [root@localhost ~]# ip link set dev veth down [root@localhost ~]# ip link set dev veth up 6、测试 [root@localhost ~]# ping 10.0.0.111
2、网桥
3、iptables
4、ipvs:系统内核级的,性能比iptables强很多
二、docker网络[root@localhost ~]# docker network ls
就是为了实现容器互联的。
1、host模式
将容器网络绑定到宿主主机上。也就是说宿主主机上的网络直接绑定到容器内。 [root@localhost ~]# docker run -d --network host nginx [root@localhost ~]# docker run -it --network host centos [root@localhost /]# ip a 宿主机的ip都在容器内 无法同时启2个nginx,nginx是绑定到宿主机上的网络,同一个网络里没有2个80端口 [root@localhost ~]# docker run -d --network host nginx [root@localhost ~]# docker ps #查看无 [root@localhost ~]# docker logs angry_lamport #原因端口被占用
2、container模式
共享一个容器的网络。 [root@localhost ~]# docker run -d --network "container:epic_swirles" nginx
案例:
[root@localhost ~]# docker run -it -d centos [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 84524bb2629c centos "/bin/bash" 3 minutes ago Up 3 minutes silly_hoover [root@localhost ~]# docker run -d --network 'container:silly_hoover' nginx #共享 silly_hoover的网络 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d14b1c7b5659 nginx "/docker-entrypoint.…" 5 seconds ago Up 5 seconds keen_carson 84524bb2629c centos "/bin/bash" 3 minutes ago Up 3 minutes silly_hoover [root@localhost ~]# docker exec -it silly_hoover bash 此时[root@84524bb2629c /]# curl 127.0.0.1 <title>Welcome to nginx!</title> #进入centos访问127.0.0.1,却出现nginx,因为nginx里的网络与centos里的网络是完全一致的
3、网桥模式
1、创建网桥 Usage: docker network create [OPTIONS] NETWORK [root@localhost ~]# docker network create chenyang 2、使用网桥 [root@localhost ~]# docker run -it --network chenyang centos
例:
[root@localhost ~]# docker network create tiantian [root@localhost ~]# docker run -d --network tiantian nginx [root@localhost ~]# docker ps [root@localhost ~]# docker run -it --network tiantian centos [root@2fb835771b86 /]# curl 514a8e121930 #进入centos访问nginx的id看到的是nginx,原因是他们处于同一个网桥,只能用id不能用名字访问 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [root@2fb835771b86 /]# curl priceless_boyd #不能用名字访问 [root@localhost ~]# docker run -d --name nginx --network tiantian nginx #需要加--name --name:1.指定容器名称 2.将容器的名称加入docker DNS解析 701a76723faa53bd0da0f8a1615a3ad80de01e65c0a18d9eadb7ac125d59bef2 [root@localhost ~]# docker run -it --network tiantian centos [root@0fe4d2043187 /]# curl nginx #此时就可以访问了
4、none模式
这种模式只提供一个回环网络 [root@localhost ~]# docker run -it --network none centos [root@6d101210c121 /]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever
5、--link
链接一个容器,类似于container模式 [root@localhost ~]# docker run -it --link "nginxv1:nginxv1" centos
例:
[root@localhost ~]# docker run -d --name nginxv1 nginx [root@localhost ~]# docker ps [root@localhost ~]# docker run -it --link 'nginxv1:nginxv1' centos [root@79f3e8702339 /]# curl nginxv1 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title>
三、docker的network
docker network --help
1、创建网桥
--subnet :指定网络的CIDR
--gateway :网关
[root@localhost ~]# docker network create chenyang1 --subnet "10.0.0.0/24" --gateway "10.0.0.2"
2、查看网桥
[root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 网桥的ID 网桥的名称 网桥类型 网桥的来源
3、查看网桥的详细信息
docker network inspect [网桥的名称]
4、链接网桥
[root@localhost ~]# docker network connect chenyang1 nginxv2
5、断开链接
[root@localhost ~]# docker network disconnect chenyang1 nginxv2
6、删除网桥
docker network rm [网桥名称]
[root@localhost ~]# docker network rm chenyang3
7、清理网桥
[root@localhost ~]# docker network prune
例
[root@localhost ~]# docker network create tiantian3 --subnet '10.0.0.0/24' --gateway '10.0.0.2' f309e8459d7cc56e9782943b7441748d8f3476fced59ea2046ea7cf178133ef3 [root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE b72ebbf33cd8 bridge bridge local 197a5eab6b5c host host local 724fceb83836 none null local 6f072f4ef3fa tiantian bridge local 6c30c22da385 tiantian1 bridge local f309e8459d7c tiantian3 bridge local [root@localhost ~]# docker network inspect tiantian3 "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "10.0.0.0/24", "Gateway": "10.0.0.2" } ] }, [root@localhost ~]# docker run -d --network tiantian3 nginx 1f8b39b17fcd7b4eb36bea704605e42d86057c5471e1c20b70b3315fd2d78814 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1f8b39b17fcd nginx "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 80/tcp jovial_tharp [root@localhost ~]# docker inspect jovial_tharp "Gateway": "10.0.0.2", "IPAddress": "10.0.0.1", [root@localhost ~]# docker exec -it jovial_tharp bash root@1f8b39b17fcd:/# curl 127.0.0.1 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> root@1f8b39b17fcd:/# curl 10.0.0.1 #访问10.0.0.1也是nginx ,说明在同一个网段
案例
1、分析 Nginx ---> Django 1、创建网桥 docker network create chenyang3 2、部署Django [root@localhost ~]# docker run -d -it python:3.6 bash 2d2d77726f5fadd22472527116300a7ab5bb43c660c7663d7843b2fa0f0afffb [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2d2d77726f5f python:3.6 "bash" 3 seconds ago Up 2 seconds stoic_mcnulty [root@localhost ~]# docker exec -it stoic_mcnulty bash root@2d2d77726f5f:/# pip install django root@2d2d77726f5f:/# exit [root@localhost ~]# docker ps [root@localhost ~]# docker commit -a 'A' -m 'A' -p tender_margulis python:djangov1 可省:[root@localhost ~]# docker rm -f $(docker ps -a -q) [root@localhost ~]# docker run -d --name django -w /opt -v /root/linux/:/opt --network chenyang3 python:djangov1 python manage.py runserver 0.0.0.0:8000 3、nginx vim django.conf server { server_name _; listen 80; location / { proxy_pass http://django:8000; } } [root@localhost ~]# docker run -d --name nginx --network chenyang3 -p 8080:80 -v /root/django.conf:/etc/nginx/conf.d/default.conf nginx