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 

 

 


 

posted @ 2021-12-28 23:03  甜甜de微笑  阅读(61)  评论(0编辑  收藏  举报