2020年3月26日木曜日

Docker Network 運用

Docker支持3种网络形式:none,host, bridge(默认模式)。


docker network ls  #显示当前docker的默认网卡状况
ip address #宿主机的网卡状态
  • none模式
    容器和宿主机之间无法网络通信。
    使用场景:不明。如果无法和外部通信,容器就是个孤岛。
  • host模式
    容器共享宿主机的网卡,利于和外部网络通信。
    使用场景:作为本宿主机上的一个服务,供宿主机之外,或外部网络机器访问。
    注意事项:默认的端口可能被宿主机占用,需要分配其他端口。
    如:80端口已经被宿主机的IIS占用,Docker容器内的Tomcat就无法使用80。
  • bridge模式(Docker容器的默认启动模式)
    安装docker后,默认会产生一张docker0的网卡,默认ip:172.17.0.1/16。
    备注:/16代表16个1的子网掩码255.255.0.0。
    使用场景:虚拟内部网络,内部网络间可以相互通信,模拟分布式计算。

Docker容器的IP地址确认:

  1. docker run 启动一个容器(比如oracle)后,通过docker exec -it containerid bash进入容器后,通过ifconfig命令,查看容器的ip, 发现以下输出
    root@a837d8deb6fb:/# ifconfig
    eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02
              inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:16 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:1312 (1.3 KB)  TX bytes:0 (0.0 B)


  2. 再启动一个mysql容器,然后同样docker exec -it containerid bash进入容器,
    执行ifconfig
    root@d5cfaf9bc203:/bin# ifconfig
    bash: ifconfig: command not found
    这个容器内没ifconfig, 只好换一种方式:hostname -i
    root@d5cfaf9bc203:/# hostname -i
    172.17.0.3

    重新通过docker network ls 查看网络状况。发现网络状况没有变化
    root@linux-dxjo:~> docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    eced4efd22c4        bridge              bridge              local
    006540679f04        host                host                local
    bb6717ea195a        none                null                local
    root@linux-dxjo:~>

新建容器网络

  1. 新建bridge网络,名称为lq01.net:
    root@linux-dxjo:~> docker network create -d bridge lq01.net
    0317a8cd7bd67758d981470ed4d8d06dccf0e52df05ffd345a5c186a160a99a9

    #查看现在的网络状况.
    root@linux-dxjo:~> docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    eced4efd22c4        bridge              bridge              local
    006540679f04        host                host                local
    0317a8cd7bd6        lq01.net          bridge              local
    bb6717ea195a        none                null                local

    查看网络详细
    root@linux-dxjo:~> docker network inspect lq01.net
    [
        {
            "Name": "lq01.net",
            "Id": "0317a8cd7bd67758d981470ed4d8d06dccf0e52df05ffd345a5c186a160a99a9",
            "Created": "2020-03-26T03:18:35.758811904-04: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": {},
            "Options": {},
            "Labels": {}
        }
    ]
    root@linux-dxjo:~>
  2. 在新网络内执行开启镜像。即在创建容器时显式将该容器连接到该网络。
    先查看所有镜像
    root@linux-dxjo:~> docker image ls
    REPOSITORY                       TAG        IMAGE ID      CREATED     SIZE
    postgres                         latest     cf879a45faaa  7 weeks ago 394MB
    mysql                            latest     791b6e40940c  7 weeks ago 465MB
    martinsthiago/oraclexe-11g-fig   latest     8253c6cad9fe  4 years ago 1.93GB

    在新的网络内开启postgres的镜像,必须设定明确的IP,不然启动不起来。


    docker run --name postgres1802 -e POSTGRES_PASSWORD=mysecretpassword -d postgres --network lq01.net  --ip 172.18.0.2
    97aa95cebfca6eb84d1be09dbed66e7db6037de044540af3b41f1174745be121
    root@linux-dxjo:~> docker ps -a
    CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                                            NAMES
    97aa95cebfca        postgres                         "docker-entrypoint.s…"   8 seconds ago       Up 6 seconds        5432/tcp                                         postgres1802
    4e886ce92b11        postgres                         "docker-entrypoint.s…"   15 minutes ago      Up 15 minutes       5432/tcp                                         postgresdb2
    a837d8deb6fb        martinsthiago/oraclexe-11g-fig   "/startup.sh --name …"   3 weeks ago         Up About an hour    0.0.0.0:1521->1521/tcp, 0.0.0.0:8088->8080/tcp   distracted_payne
    d5cfaf9bc203        mysql                            "docker-entrypoint.s…"   6 weeks ago         Up About an hour    0.0.0.0:3306->3306/tcp, 33060/tcp                mysql-test
    root@linux-dxjo:~>
    root@linux-dxjo:~> docker run -itd --name nginx02 --network LBSnet --ip 172.20.1.11 nginx:latest 
    root@linux-dxjo:~> docker ps -a
    CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                                            NAMES
    a2558eac3579        nginx:latest                     "nginx -g 'daemon of…"   5 seconds ago       Up 3 seconds        80/tcp                                           nginx02
    8c01025fcaf3        nginx:latest                     "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes        80/tcp                                           nginx01
    4 


  • root@linux-dxjo:~> docker run -itd --name nginx01 --network LBSnet --ip 172.20.1.10 nginx:latest  
    root@linux-dxjo:~> docker ps -a
    CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                                            NAMES
    a2558eac3579        nginx:latest                     "nginx -g 'daemon of…"   5 seconds ago       Up 3 seconds        80/tcp                                           nginx02
    root@linux-dxjo:~> docker run -itd --name nginx02 --network LBSnet --ip 172.20.1.11 nginx:latest  
  • 可以将容器添加到多个网络。
    既存网络:lq01.net:172.18.0.1/8
    创建新的网络:
    docker network create -d bridge --subnet 172.20.1.0/24 --gateway 172.20.1.1 LBSnet
    然后将容器链接到指定的网络。
    docker network connect lq01.net nginx01

    容器仅能在网络内通信,不能跨网络进行通信。
    一个连接到两个网络的容器可与每个网络中的成员容器进行通信。
    当一个容器连接到多个网络时,外部连接通过第一个(按词典顺序)非内部网络提供。
  •  

    0 件のコメント:

    コメントを投稿

    ITIL4 Foundation Study Guide 2 : 4 Dimensions and 6 Factors

    4  Dimensions:  Dimension1: Organizations & People Dimension2: Information & Technology Dimension3: Partners & Suppliers D...