ip命令能夠手動操做網絡名稱空間html
IP命令所屬iptoute程序包web
[root@localhost ~]# rpm -q iproute iproute-3.10.0-87.el7.x86_64
添加網絡名稱空間docker
在網絡名稱空間中執行命令json
建立虛擬網卡對服務器
ip netns add
url
[root@localhost ~]# ip netns add r1 [root@localhost ~]# ip netns add r2 [root@localhost ~]# ip netns list r2 r1
ip netns exec
[root@localhost ~]# ip netns exec r1 ifconfig -a lo: flags=8<LOOPBACK> mtu 65536 loop txqueuelen 1 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ip link add name veth1.1 type veth peer name veth1.2
add name veth1.1
一半網卡叫什麼
type veth
類型叫啥,veth虛擬以太網網卡
peer name
另外一半網卡名字叫啥
[root@localhost ~]# ip link add name veth1.1 type veth peer name veth1.2 [root@localhost ~]# ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000 link/ether 08:00:27:72:1c:ca brd ff:ff:ff:ff:ff:ff 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT link/ether 02:42:90:5b:af:47 brd ff:ff:ff:ff:ff:ff 4: veth1.2@veth1.1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether 96:8e:c2:e1:64:45 brd ff:ff:ff:ff:ff:ff 5: veth1.1@veth1.2: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether ae:f5:21:c7:db:37 brd ff:ff:ff:ff:ff:ff
[root@localhost ~]# ip link set dev veth1.2 netns r1 [root@localhost ~]# ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000 link/ether 08:00:27:72:1c:ca brd ff:ff:ff:ff:ff:ff 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT link/ether 02:42:90:5b:af:47 brd ff:ff:ff:ff:ff:ff 5: veth1.1@if4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether ae:f5:21:c7:db:37 brd ff:ff:ff:ff:ff:ff link-netnsid 0 [root@localhost ~]# ip netns exec r1 ifconfig -a lo: flags=8<LOOPBACK> mtu 65536 loop txqueuelen 1 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 veth1.2: flags=4098<BROADCAST,MULTICAST> mtu 1500 ether 96:8e:c2:e1:64:45 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost ~]# ip netns exec r1 ip link set dev veth1.2 name eth0 [root@localhost ~]# ip netns exec r1 ifconfig -a eth0: flags=4098<BROADCAST,MULTICAST> mtu 1500 ether 96:8e:c2:e1:64:45 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=8<LOOPBACK> mtu 65536 loop txqueuelen 1 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost ~]# ifconfig veth1.1 10.1.0.1/24 up [root@localhost ~]# ip netns exec r1 ifconfig eth0 10.1.0.2/24 up [root@localhost ~]# ping 10.1.0.2 PING 10.1.0.2 (10.1.0.2) 56(84) bytes of data. 64 bytes from 10.1.0.2: icmp_seq=1 ttl=64 time=0.102 ms 64 bytes from 10.1.0.2: icmp_seq=2 ttl=64 time=1.69 ms
[root@localhost ~]# ip link set dev veth1.1 netns r2 [root@localhost ~]# ip netns exec r2 ifconfig veth1.1 10.1.0.3/24 up [root@localhost ~]# ip netns exec r2 ping 10.1.0.2 PING 10.1.0.2 (10.1.0.2) 56(84) bytes of data. 64 bytes from 10.1.0.2: icmp_seq=1 ttl=64 time=0.049 ms 64 bytes from 10.1.0.2: icmp_seq=2 ttl=64 time=0.057 ms
docker容器不設置網絡設備使用none網絡,實現封閉式容器
[root@localhost ~]# docker run --name t1 -it --network none --rm busybox:latest / # ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
[root@localhost ~]# docker run --name t1 -it --network bridge -h web1.keji.com --rm busybox:latest / # hostname web1.keji.com
[root@localhost ~]# docker run --name t1 -it --network bridge -h web1.keji.com --dns 144.144.144.144 --rm busybox:latest / # cat /etc/resolv.conf nameserver 144.144.144.144
[root@localhost ~]# docker run --name t1 -it --network bridge -h web1.keji.com --dns 144.144.144.144 --add-host web1.keji.com:1.1.1.1 --rm busybox:latest / # cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet 1.1.1.1 web1.keji.com
動態端口範圍是30000到32767之間的隨機端口
壞處是別人訪問時不知道端口是多少,好處是當容器有多個web時,能夠映射到多個端口上
[root@localhost ~]# docker run --name myweb --rm -p 80 dockerhaoran/httpd:v0.2
容器已運行,在另一個終端上打開內部訪問
[root@localhost ~]# docker inspect myweb "IPAddress": "172.17.0.2", [root@localhost ~]# curl 172.17.0.2 <h1>Busybox httpd server.</h1>
iptables查看生成的規則,被映射到宿主機的32769端口
[root@localhost ~]# iptables -t nat -vnl Chain DOCKER (2 references) pkts bytes target prot opt in out source destination 0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0 0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:32769 to:172.17.0.2:80
頁面訪問http://10.192.45.116:32769/
[root@localhost ~]# docker port myweb 80/tcp -> 0.0.0.0:32769
容器的80端口映射到宿主機全部可用地址的32769端口上
[root@localhost ~]# docker kill myweb myweb [root@localhost ~]# docker run --name myweb --rm -p 10.192.45.116::80 dockerhaoran/httpd:v0.2
10.192.45.116::兩個冒號表宿主機端口,爲空表示隨機端口
[root@localhost ~]# docker port myweb 80/tcp -> 10.192.45.116:32768
[root@localhost ~]# docker run --name myweb --rm -p 10.192.45.116:8080:80 dockerhaoran/httpd:v0.2
80端口映射到宿主機10.192.45.116的8080端口
[root@localhost ~]# docker port myweb 80/tcp -> 10.192.45.116:8080
[root@localhost ~]# docker run --name myweb --rm -p 80:80 dockerhaoran/httpd:v0.2
80:80宿主地址不給表示地址隨機
[root@localhost ~]# docker port myweb 80/tcp -> 0.0.0.0:80
[root@localhost ~]# docker run --name b1 -it --rm busybox:latest / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1 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 24: eth0@if25: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever [root@localhost ~]# docker run --name b2 -it --network container:b1 --rm busybox:latest / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1 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 24: eth0@if25: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever
在b2上開啓httpd服務
/ # echo "hello world" > /tmp/index.html / # httpd -h /tmp/ / # netstat -tul Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 :::80 :::* LISTEN
在b1上使用lo訪問
/ # wget -O - -q 127.0.0.1 hello world
[root@localhost ~]# docker run --name b1 -it --network host --rm busybox:latest / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1 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 inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 08:00:27:72:1c:ca brd ff:ff:ff:ff:ff:ff inet 10.192.45.116/21 brd 10.192.47.255 scope global dynamic enp0s3 valid_lft 3413sec preferred_lft 3413sec inet6 fe80::a00:27ff:fe72:1cca/64 scope link valid_lft forever preferred_lft forever 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue link/ether 02:42:90:5b:af:47 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:90ff:fe5b:af47/64 scope link valid_lft forever preferred_lft forever
啓動一個httpd服務
/ # echo "hello worlk" > /tmp/index.html / # httpd -h /tmp/ / # netstat -tunl Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 :::80 :::* LISTEN
表示監聽在宿主機的80端口上
http://10.192.45.116/
hello world
須要修改配置文件/etc/docker/daemon.json文件
{
"bip": "10.0.0.1/16",
「default-gateway」:"10.20.1.1",
「dns」:["10.20.1.2","10.20.1.3"]
}
bip指docker0橋的IP地址,最主要的,只要指定好,別的值除了dns會自動計算得知
default-gateway指默認網關
dns指dns服務器地址,最多3個
[root@localhost ~]# systemctl stop docker [root@localhost ~]# vi /etc/docker/daemon.json { "registry-mirrors": ["https://qijo5n63.mirror.aliyuncs.com"], "bip": "10.0.0.1/16" } [root@localhost ~]# systemctl start docker [root@localhost ~]# ip a 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN link/ether 02:42:90:5b:af:47 brd ff:ff:ff:ff:ff:ff inet 10.0.0.1/16 brd 10.0.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:90ff:fe5b:af47/64 scope link valid_lft forever preferred_lft forever
docker守護進程的c/s,其默認僅監聽Unix Socket格式的地址,/var/run/docker.sock;若是使用TCP套接字,
/etc/docker/daemon.json:
"hosts": ["tcp://10.0.0.0:2375","unix:///var/run/docker.sock"]
也可向docker直接傳遞「-H|--host」選項;
[root@localhost ~]# systemctl stop docker [root@localhost ~]# vi /etc/docker/daemon.json { "registry-mirrors": ["https://qijo5n63.mirror.aliyuncs.com"], "bip": "10.0.0.1/16", "host": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"] } [root@localhost ~]# systemctl start docker
[root@localhost ~]# docker network create -d bridge --subnet "172.26.0.0/16" --gateway "172.26.0.1" mybr0 c7cc44b020fd5fe2fe7435b7e19826f8d43576b7a9f86607034e44781ba1ca4a
docker network create建立橋
-d bridge指定橋的類型,bridge類型
--subnet "172.26.0.0/16"指定ipv4子網
--gateway "172.26.0.1"指定網關
[root@localhost ~]# ip a 26: br-c7cc44b020fd: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN link/ether 02:42:60:51:fa:c0 brd ff:ff:ff:ff:ff:ff inet 172.26.0.1/16 brd 172.26.255.255 scope global br-c7cc44b020fd valid_lft forever preferred_lft forever
網絡名叫mybr0,可是接口名不是mybr0,
[root@localhost ~]# ifconfig br-c7cc44b020fd down [root@localhost ~]# ip link set dev br-c7cc44b020fd name docker1
先關閉這個接口,在該設備名