• docker网络


    docker网络

    Docker本身的技术依赖于Linux内核虚拟化技术的发展。所以Docker对Linux内核的特性有很强的依赖。
    其中Docker使用到的与Linux网络有关的技术分别有:网络名称空间、Veth、Iptables、网桥、路由。

    网络名称空间

    为了支持网络协议栈的多个实例,Linux在网络协议栈中引入了网络名称空间(Network Namespace),这些独立的协议栈被隔离到不同的命名空间中。处于不同的命名空间的网络协议栈是完全隔离的,彼此之间无法进行网络通信,就好像两个“平行宇宙”。通过这种对网络资源的隔离,就能在一个宿主机上虚拟多个不同的网络环境,而Docker正是利用这种网络名称空间的特性,实现了不同容器之间的网络隔离。在Linux的网络命名空间内可以有自己独立的Iptables来转发、NAT及IP包过滤等功能。

    Linux的网络协议栈是十分复杂的,为了支持独立的协议栈,相关的这些全局变量都必须修改为协议栈私有。最好的办法就是让这些全局变量成为一个Net Namespace变量的成员,然后为了协议栈的函数调用加入一个Namespace参数。这就是Linux网络名称空间的核心。所以的网络设备都只能属于一个网络名称空间。当然,通常的物理网络设备只能关联到root这个命名空间中。虚拟网络设备则可以被创建并关联到一个给定的命名空间中,而且可以在这些名称空间之间移动。

    用法 含义
    ip netns list 列出网络命名空间。此命令显示的是 "/var/run/netns" 中的所有网络命名空间。
    ip netns add NAME 添加网络命名空间
    ip [-all] netns delete [NAME] 删除网络命名空间
    ip [-all] netns exec [NAME] cmd … 在指定的网络命名空间中执行命令
    ip netns set NAME NETNSID 给网络命名空间分配id
    ip netns identify [PID] 查看进程的网络命名空间
    ip netns monitor 监控对网络命名空间的操作
    ip netns pids NAME 查找使用此网络命名空间并将其作为主要网络命名空间的进程。此命令会从 /proc 目录中遍历。
    #添加并列出network命名空间
    [root@docker ~]# ip netns add test01
    [root@docker ~]# ip netns add test02
    [root@docker ~]# ip netns list
    test02
    test01
    
    #删除所有network命名空间
    [root@docker ~]# ip -all netns delete
    [root@docker ~]# ip netns list
    
    

    访问容器中的服务

    
    1.端口映射
    
    2.使用IP
    
    

    Veth设备

    引入Veth设备对是为了在不同的网络名称空间之间进行通信,利用它可以直接将两个网络名称空间链接起来。由于要连接的两个网络命名空间,所以Veth设备是成对出现的,很像一对以太网卡,并且中间有一根直连的网线。既然是一对网卡,那么我们将其中一端称为另一端的peer。在Veth设备的一端发送数据时,它会将数据直接发送到另一端,并触发另一端的接收操作。

    1.创建Veth设备对

    [root@docker ~]# ip link add veth type veth peer name veth001
    
    [root@docker ~]# ip link show
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
        link/ether 00:0c:29:14:00:a2 brd ff:ff:ff:ff:ff:ff
    3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
        link/ether 00:0c:29:14:00:ac brd ff:ff:ff:ff:ff:ff
    4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
        link/ether 02:42:64:ce:78:66 brd ff:ff:ff:ff:ff:ff
    5: veth001@veth: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
        link/ether 6a:f4:72:dd:d8:b4 brd ff:ff:ff:ff:ff:ff
    6: veth@veth001: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
        link/ether ca:99:56:c1:15:e8 brd ff:ff:ff:ff:ff:ff
    
    #生成了两个veth设备, 互为对方的peer。
    
    

    2.绑定命名空间

    [root@docker ~]# ip link set veth001 netns test01
    
    [root@docker ~]# ip link show 
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
        link/ether 00:0c:29:14:00:a2 brd ff:ff:ff:ff:ff:ff
    3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
        link/ether 00:0c:29:14:00:ac brd ff:ff:ff:ff:ff:ff
    4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
        link/ether 02:42:64:ce:78:66 brd ff:ff:ff:ff:ff:ff
    6: veth@if5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
        link/ether ca:99:56:c1:15:e8 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    
    #已经看不到veth001,需要进入test01命名空间查看
    [root@docker ~]# ip netns exec test01 bash
    [root@docker ~]# ip a
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    5: veth001@if6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
        link/ether 6a:f4:72:dd:d8:b4 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    
    #退出test01命名空间
    [root@docker ~]# exit
    exit
        
    

    3.将Veth分配IP

    [root@docker ~]# ip netns exec test01 ip addr add 172.16.0.111/20 dev veth001
    
    [root@docker ~]# ip netns exec test01 bash
    [root@docker ~]# ip a
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    5: veth001@if6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
        link/ether 6a:f4:72:dd:d8:b4 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.16.0.111/20 scope global veth001
           valid_lft forever preferred_lft forever
    
    #启动veth001
    [root@docker ~]# ip netns exec test01 ip link set dev veth001 up
    [root@docker ~]# ip netns exec test01 ip a
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    7: veth001@if8: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
        link/ether 46:62:d8:a4:b9:76 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.16.0.111/20 scope global veth001
           valid_lft forever preferred_lft forever
           
    

    4.查看对端Veth设备

    [root@docker ~]# ip netns exec test01 ethtool -S veth001
    NIC statistics:
         peer_ifindex: 8
    
    [root@docker ~]# ip a | grep 8
        inet 127.0.0.1/8 scope host lo
        inet6 ::1/128 scope host 
        inet6 fe80::20c:29ff:fe14:a2/64 scope link 
        inet6 fe80::20c:29ff:fe14:ac/64 scope link 
        link/ether 02:42:64:ce:78:66 brd ff:ff:ff:ff:ff:ff
    8: veth@if7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
        link/ether f2:11:0c:f1:98:77 brd ff:ff:ff:ff:ff:ff link-netnsid 0
            
    

    5.为对端Veth设备配置IP

    [root@docker ~]# ip addr add 172.16.0.112/20 dev veth
    [root@docker ~]# ip link set dev veth down
    [root@docker ~]# ip link set dev veth up
    [root@docker ~]# ping 172.16.0.111
    PING 172.16.0.111 (172.16.0.111) 56(84) bytes of data.
    64 bytes from 172.16.0.111: icmp_seq=1 ttl=64 time=0.214 ms
    64 bytes from 172.16.0.111: icmp_seq=2 ttl=64 time=0.082 ms
    
    [root@docker ~]# ping 172.16.0.112
    PING 172.16.0.112 (172.16.0.112) 56(84) bytes of data.
    64 bytes from 172.16.0.112: icmp_seq=1 ttl=64 time=0.307 ms
    64 bytes from 172.16.0.112: icmp_seq=2 ttl=64 time=0.088 ms
    
    

    6.删除veth设备(同时在另一个nemespace的设备也被删除了)

    #先停止veth001再删除
    [root@docker ~]# ip netns exec test01 ip link set dev veth001 down
    [root@docker ~]# ip netns exec test01 ip link delete veth001
    
    

    网桥

    Linux 可以支持多个不同的网络,它们之间能够相互通信,就需要一个网桥。 网桥是二层的虚拟网络设备,它是把若干个网络接口“连接”起来,从而报文能够互相转发。网桥能够解析收发的报文,读取目标 MAC 地址的信息,和自己记录的 MAC 表结合,来决定报文的转发目标网口。

    网桥设备 brO 绑定了 eth0、 eth1 。对于网络协议械的上层来说,只看得到 brO 。因为桥接是在数据链路层实现的 ,上层不需要关心桥接的细节,于是协议枝上层需要发送的报文被送到 brO ,网桥设备的处理代码判断报文该被转发到 ethO 还是 ethl ,或者两者皆转发。反过来,从 ethO 或从 ethl 接收到的报文被提交给网桥的处理代码,在这里会判断报文应该被转发、丢弃还是提交到协议枝上层。 而有时 ethl 也可能会作为报文的源地址或目的地址 直接参与报文的发送与接收,从而绕过网桥。

    1.创建网桥

    docker network create [网桥名称]
    			
    [root@docker ~]# docker network create old
    			
    #参数:
    -d : 指定网桥类型。
       	  bridge   
       	  host     
       	  none 
    
    

    2.查看网桥

    docker network ls 
    			
    #参数:
    -f : 过滤网桥
    
    

    3.删除网桥

    docker network rm [网桥的名称]
    
    [root@docker ~]# docker network rm old			
    
    #注意:网桥必须是没有任何应用在使用。
    
    

    4.查看网桥的详细信息

    docker inspect [网桥的名称]
    
    [root@docker ~]# docker inspect zzc
    [
        {
            "Name": "zzc",
            "Id": "8b3745ae2989a2d3402eb0dbe19d53f951ec1d297e0310ac9eaa97ffed96dd4f",
            "Created": "2021-10-26T12:10:38.120689969+08:00",
            "Scope": "local",
            "Driver": "bridge",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": {},
                "Config": [
                    {
                        "Subnet": "172.18.0.0/16",
                        "Gateway": "172.18.0.1"
                    }
                ]
            },
            "Internal": false,
            "Attachable": false,
            "Ingress": false,
            "ConfigFrom": {
                "Network": ""
            },
            "ConfigOnly": false,
            "Containers": {
                "3ab45509c6a2706536aefa20deec5269e9ed12e83d200d7eb835d7554b3e5eb1": {
                    "Name": "clever_carson",
                    "EndpointID": "c376a19ff86d207d4445c96297cb86bf251642555a378f33e5d5f5a3f79b0cf8",
                    "MacAddress": "02:42:ac:12:00:02",
                    "IPv4Address": "172.18.0.2/16",
                    "IPv6Address": ""
                }
            },
            "Options": {},
            "Labels": {}
        }
    ]
    
    

    5.链接上一个容器

    docker network connect [OPTIONS] [网桥名称] [容器名称]
    
    #参数:
    --alias   为容器添加网络范围的别名
    --ip      指定IP地址
    --ip6     指定IPv6地址
    --link    添加链接到另一个容器
    --link-local-ip    添加容器的链接本地地址
    
    1、创建一个subnet的网桥
    [root@docker ~]# docker network create --subnet 172.22.0.0/16 test
    
    # --subnet   表示网段的CIDR格式的子网				
    
    2、指定IP关联上对应的网桥
    [root@docker ~]# docker network connect --ip 172.22.0.10 test nginx
    
    3、将正在运行的容器连接到网络
    [root@docker ~]# docker network connect test nginx
    
    4、启动容器时连接到网络
    docker run --network=<网桥名称> 
    
    [root@docker ~]# docker run -d -it --network=test --name web nginx
    f3436ced4d9b81f0fd4b210d84fa7b7927b216f18841812a418dd700e5debc38
    
    [root@docker ~]# docker ps
    CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
    f3436ced4d9b   nginx          "/docker-entrypoint.…"   4 seconds ago   Up 3 seconds   80/tcp    web
    
    

    6.断开链接

    docker network disconnect [网桥名称] [容器名称]
    
    [root@docker ~]# docker network disconnect test nginx
    
    

    7.清除所有未被使用到的网桥

    [root@docker ~]# docker network prune 
    			
    #参数:
    -f : 免交互删除
    
    

    8.删除网桥报错

    [root@docker ~]# docker network rm test
    Error response from daemon: error while removing network: network test id ffdae81a8798efe3063d435eb2dcc944d31e7ca205ef96679c4e8e9ae58a84ed has active endpoints
    
    #查看网桥信息
    [root@docker ~]# docker network inspect test
    [
        {
            "Name": "test",    #参数一
            "Id": "ffdae81a8798efe3063d435eb2dcc944d31e7ca205ef96679c4e8e9ae58a84ed",
            "Created": "2021-10-26T15:01:39.89380796+08:00",
            "Scope": "local",
            "Driver": "bridge",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": {},
                "Config": [
                    {
                        "Subnet": "172.22.0.0/16"
                    }
                ]
            },
            "Internal": false,
            "Attachable": false,
            "Ingress": false,
            "ConfigFrom": {
                "Network": ""
            },
            "ConfigOnly": false,
            "Containers": {
                "455891260b892202dcc12fbe4bfec2f62f0f47266d0d60fac18ca6b4fb5cd3fb": {
                    "Name": "nginx",    #参数二
                    "EndpointID": "dbc792bf48714feae45dce93584a5933ae29dc7214dd18d54dcf11c53267a532",
                    "MacAddress": "02:42:ac:16:00:02",
                    "IPv4Address": "172.22.0.2/16",
                    "IPv6Address": ""
                }
            },
            "Options": {},
            "Labels": {}
        }
    ]
    
    #记住参数一和参数二,执行以下命令
    [root@docker ~]# docker network disconnect test nginx 
    
    #删除网桥
    [root@docker ~]# docker network rm test
    test
    
    [root@docker ~]# docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    a0e17b29c2ce   bridge    bridge    local
    94089d94caa7   host      host      local
    35b1beff62c9   none      null      local
    
    

    iptables

    在Linux网络协议棋中有一组回调函数挂接点,通过这些挂接点挂接的钩子函数可以在Linux 网络棋处理数据包的过程中对数据包进行 些操作,例如过滤、修改、丢弃等 整个挂接点技术叫作 Netfilter lptables

    Netfilter 负责在内核中执行各种挂接的规则,运行在内核模式中:而 lptables 是在用户模式下运行的进程,负责协助维护内核中 Netfilter 的各种规则表 通过 者的配合来实现整个 Linux网络协议战中灵活的数据包处理机制。

    设备 作用总结
    network namespace 主要提供了关于网络资源的隔离,包括网络设备、IPv4和IPv6协议栈、IP路由表、防火墙、/proc/net目录、/sys/class/net目录、端口(socket)等。
    linux Bridge 功能相当于物理交换机,为连在其上的设备(容器)转发数据帧。如docker0网桥。
    iptables 主要为容器提供NAT以及容器网络安全。
    veth pair 两个虚拟网卡组成的数据通道。在Docker中,用于连接Docker容器和Linux Bridge。一端在容器中作为eth0网卡,另一端在Linux Bridge中作为网桥的一个端口。

    Docker网络模式

    Docker使用Linux桥接的方式,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

    Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。

    Docker网络模型 配置 说明
    host模式 –-network=host 容器和宿主机共享Network namespace。
    containe模式 --network=container:ID 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。
    none模式 --network=none 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。
    bridge模式 --network=bridge 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。(默认为该模式)

    1.Host模式

    如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

    使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。

    [root@docker ~]# docker run -d --name web --network host nginx 
    9b35413bc6b04ee7c4c6d68415e9f53f710346587d558eef05c91f30e7947be4
    
    [root@docker ~]# docker ps
    CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS     NAMES
    9b35413bc6b0   nginx          "/docker-entrypoint.…"   About a minute ago   Up About a minute             web
    455891260b89   nginx:latest   "/docker-entrypoint.…"   15 hours ago         Up 7 minutes        80/tcp    nginx
    
    [root@docker ~]# netstat -lntp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1316/sshd           
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1400/master         
    tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1024/rpcbind        
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2573/nginx: master  
    tcp6       0      0 :::22                   :::*                    LISTEN      1316/sshd           
    tcp6       0      0 ::1:25                  :::*                    LISTEN      1400/master         
    tcp6       0      0 :::111                  :::*                    LISTEN      1024/rpcbind        
    tcp6       0      0 :::80                   :::*                    LISTEN      2573/nginx: master  
    
    [root@docker ~]# curl 127.0.0.1:80
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body {  35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    
    

    2.Containe模式

    这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

    [root@docker ~]# docker run -it --name centos centos bash
    [root@8ffae2be2d11 /]#
    
    [root@docker ~]# docker run -d --network "container:centos" --name test nginx 
    68acbfde3362c2e90caf4b72dad0350829c74db4060e37cd829f67103c0a7f60
    
    [root@docker ~]# docker ps
    CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
    68acbfde3362   nginx          "/docker-entrypoint.…"   4 seconds ago    Up 3 seconds              test
    4dc2bf1d4454   centos         "bash"                   7 minutes ago    Up 7 minutes              centos
    9b35413bc6b0   nginx          "/docker-entrypoint.…"   15 minutes ago   Up 15 minutes             web
    455891260b89   nginx:latest   "/docker-entrypoint.…"   16 hours ago     Up 21 minutes   80/tcp    nginx
    
    [root@8ffae2be2d11 /]# 
    [root@8ffae2be2d11 /]# curl 127.0.0.1
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body {  35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    
    

    3.none模式

    使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

    这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

    [root@docker ~]# docker run -it --network none centos bash
    
    [root@57822b977aa4 /]# 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
    
    

    4.bridge模式

    当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

    从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

    bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。

    [root@docker ~]# docker network create zzc
    8b3745ae2989a2d3402eb0dbe19d53f951ec1d297e0310ac9eaa97ffed96dd4f
    
    [root@docker ~]# docker run -d --network zzc nginx 
    3ab45509c6a2706536aefa20deec5269e9ed12e83d200d7eb835d7554b3e5eb1
    
    [root@docker ~]# docker ps
    CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
    3ab45509c6a2   nginx          "/docker-entrypoint.…"   10 seconds ago   Up 10 seconds   80/tcp    clever_carson
    455891260b89   nginx:latest   "/docker-entrypoint.…"   16 hours ago     Up 40 minutes   80/tcp    nginx
    
    [root@docker ~]# docker run -it --network zzc centos bash
     
    [root@ca1cda1d8f63 /]# curl 127.0.0.1
    curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused
     
    
    [root@ca1cda1d8f63 /]# curl 3ab45509c6a2
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body {  35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    
    

    用docker实现部署discuz

    #创建网桥
    [root@docker ~]# docker network create discuz
    
    #创建mysql容器
    [root@docker ~]# docker run -d --network discuz --name mysql -e MYSQL_ROOT_PASSWORD=123 -e MYSQL_DATABASE=discuz mysql:5.7
    
    [root@docker ~]# docker exec -it mysql bash
    
    root@5b56c4f2d36a:/# mysql -uroot -p123
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | discuz             |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.01 sec)
    
    #下载php和nginx镜像
    [root@docker ~]# docker pull alvinos/php:wordpress-v2
    [root@docker ~]# docker pull alvinos/nginx:wordpress-v2
    
    #上传discuz
    [root@docker ~]# rz Discuz_X3.4_SC_UTF8_20210926.zip
    [root@docker ~]# mkdir /discuz
    [root@docker ~]# unzip Discuz_X3.4_SC_UTF8_20210926.zip -d  /discuz
    [root@docker ~]# chmod -R 777 /discuz/upload/
    
    #配置nginx文件
    [root@docker ~]# cat default.conf 
    server {
        listen       80;
        listen  [::]:80;
        server_name  localhost;
        root           /usr/share/nginx/html;
    
        location / {
            root   /usr/share/nginx/html;
            index  index.php index.html index.htm;
        }
        location ~ .php$ {
            fastcgi_pass   php:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
            include        fastcgi_params;
        }
    
    }
    
    #启动php容器
    [root@docker ~]# docker run -d --name php --network discuz -v /discuz/upload:/usr/share/nginx/html  alvinos/php:wordpress-v2
    
    #启动nginx容器
    [root@docker ~]# docker run -d --name nginx --network discuz -v /discuz/upload:/usr/share/nginx/html -v /root/default.conf:/etc/nginx/conf.d/default.conf -p 8090:80 alvinos/nginx:wordpress-v2
    
    [root@docker ~]# docker ps
    CONTAINER ID   IMAGE                        COMMAND                  CREATED          STATUS          PORTS                           NAMES
    a482aefdc37a   alvinos/nginx:wordpress-v2   "/bin/sh -c 'nginx -…"   2 minutes ago    Up 2 minutes    443/tcp, 0.0.0.0:8090->80/tcp   nginx
    32cb74db6133   alvinos/php:wordpress-v2     "php-fpm -F"             5 minutes ago    Up 5 minutes    9000/tcp                        php
    5b56c4f2d36a   mysql:5.7                    "docker-entrypoint.s…"   36 minutes ago   Up 36 minutes   3306/tcp, 33060/tcp             mysql
    
    #浏览器访问10.0.0.71:8090
    
    

  • 相关阅读:
    开博语
    ch8 固定宽度、流式、弹性布局
    ch8 让div居中--使用外边距
    ch8 基于浮动的布局(两列浮动布局、三列浮动布局)
    ch3 盒模型、定位
    事件类型--鼠标与滚轮事件
    事件类型-UI事件、焦点事件
    事件对象
    事件处理程序
    内存和性能--事件委托、移除事件处理程序
  • 原文地址:https://www.cnblogs.com/backz/p/15472665.html
Copyright © 2020-2023  润新知