• docker容器互访三种方式


    我们都知道docker容器之间是互相隔离的,不能互相访问,但如果有些依赖关系的服务要怎么办呢。下面介绍三种方法解决容器互访问题。

    方式一、虚拟ip访问

     安装docker时,docker会默认创建一个内部的桥接网络docker0,每创建一个容器分配一个虚拟网卡,容器之间可以根据ip互相访问。

    复制代码
    [root@33fcf82ab4dd /]# [root@CentOS ~]# ifconfig
    ......
    docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
            inet6 fe80::42:35ff:feac:66d8  prefixlen 64  scopeid 0x20<link>
            ether 02:42:35:ac:66:d8  txqueuelen 0  (Ethernet)
            RX packets 4018  bytes 266467 (260.2 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 4226  bytes 33935667 (32.3 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    ......
    复制代码

     运行一个centos镜像, 查看ip地址得到:172.17.0.7

    复制代码
    [root@CentOS ~]# docker run -it --name centos-1 docker.io/centos:latest
    [root@6d214ff8d70a /]# ifconfig
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.17.0.7  netmask 255.255.0.0  broadcast 0.0.0.0
            inet6 fe80::42:acff:fe11:7  prefixlen 64  scopeid 0x20<link>
            ether 02:42:ac:11:00:07  txqueuelen 0  (Ethernet)
            RX packets 16  bytes 1296 (1.2 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 8  bytes 648 (648.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    复制代码

    以同样的命令再起一个容器,查看ip地址得到:172.17.0.8

    复制代码
    [root@CentOS ~]# docker run -it --name centos-2 docker.io/centos:latest
    [root@33fcf82ab4dd /]# ifconfig
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.17.0.8  netmask 255.255.0.0  broadcast 0.0.0.0
            inet6 fe80::42:acff:fe11:8  prefixlen 64  scopeid 0x20<link>
            ether 02:42:ac:11:00:08  txqueuelen 0  (Ethernet)
            RX packets 8  bytes 648 (648.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 8  bytes 648 (648.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    复制代码

    容器内部ping测试结果如下:

    复制代码
    [root@33fcf82ab4dd /]# ping 172.17.0.7
    PING 172.17.0.7 (172.17.0.7) 56(84) bytes of data.
    64 bytes from 172.17.0.7: icmp_seq=1 ttl=64 time=0.205 ms
    64 bytes from 172.17.0.7: icmp_seq=2 ttl=64 time=0.119 ms
    64 bytes from 172.17.0.7: icmp_seq=3 ttl=64 time=0.118 ms
    64 bytes from 172.17.0.7: icmp_seq=4 ttl=64 time=0.101 ms
    复制代码

    这种方式必须知道每个容器的ip,在实际使用中并不实用。

    方式二、link

    运行容器的时候加上参数link

    运行第一个容器

    docker run -it --name centos-1 docker.io/centos:latest

    运行第二个容器

    [root@CentOS ~]# docker run -it --name centos-2 --link centos-1:centos-1 docker.io/centos:latest

    --link:参数中第一个centos-1是容器名,第二个centos-1是定义的容器别名(使用别名访问容器),为了方便使用,一般别名默认容器名。

    测试结果如下:

    复制代码
    [root@e0841aa13c5b /]# ping centos-1
    PING centos-1 (172.17.0.7) 56(84) bytes of data.
    64 bytes from centos-1 (172.17.0.7): icmp_seq=1 ttl=64 time=0.210 ms
    64 bytes from centos-1 (172.17.0.7): icmp_seq=2 ttl=64 time=0.116 ms
    64 bytes from centos-1 (172.17.0.7): icmp_seq=3 ttl=64 time=0.112 ms
    64 bytes from centos-1 (172.17.0.7): icmp_seq=4 ttl=64 time=0.114 ms
    复制代码

     此方法对容器创建的顺序有要求,如果集群内部多个容器要互访,使用就不太方便。

    方式三、创建bridge网络

    1.安装好docker后,运行如下命令创建bridge网络:docker network create testnet

    查询到新创建的bridge testnet。

    2.运行容器连接到testnet网络。

    使用方法:docker run -it --name <容器名> ---network <bridge> --network-alias <网络别名> <镜像名>

    [root@CentOS ~]# docker run -it --name centos-1 --network testnet --network-alias centos-1 docker.io/centos:latest
    [root@CentOS ~]# docker run -it --name centos-2 --network testnet --network-alias centos-2 docker.io/centos:latest

    3.从一个容器ping另外一个容器,测试结果如下:

    复制代码
    [root@fafe2622f2af /]# ping centos-1
    PING centos-1 (172.20.0.2) 56(84) bytes of data.
    64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=1 ttl=64 time=0.158 ms
    64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=2 ttl=64 time=0.108 ms
    64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=3 ttl=64 time=0.112 ms
    64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=4 ttl=64 time=0.113 ms 
    复制代码

    4.若访问容器中服务,可以使用这用方式访问 <网络别名>:<服务端口号> 

    推荐使用这种方法,自定义网络,因为使用的是网络别名,可以不用顾虑ip是否变动,只要连接到docker内部bright网络即可互访。bridge也可以建立多个,隔离在不同的网段。

    容器内脚本访问容器内服务

    1、以mysql:5.6镜像创建一个mysql容器服务 容器端口3306映射宿主机端口3307

    启动后配置阿里云服务器安全组开放映射的端口

    docker run -id -p 3307:3306 
    --name=my1 
    --network testnet 
    --network-alias my1 
    -v $PWD/conf/myconf.d:/etc/mysql/conf.d 
    -v $PWD/logs:/logs 
    -v $PWD/data:/var/lib/mysql 
    -e MYSQL_ROOT_PASSWORD=root 
    mysql:5.6

    2、以centos:7基础镜像创建一个python脚本 查询mysql数据库中的内容

    docker run -it 
    --name=my2 
    --network testnet 
    --network-alias my2 
    centos:7 
    bash

    脚本

    import pymysql
    
    db = pymysql.connect("120.78.72.136","root","root","docker",port=3307)
    cursor = db.cursor()
    cursor.execute("SELECT * FROM test")
    data = cursor.fetchone()
    print (data)
    db.close()
    # ip为宿主机ip  端口为容器映射到宿主机的端口
    

    2、容器访问容器服务(离线)

    s1容器放mysql服务,s2容器放一个python脚本能够查询s1容器内mysql数据库的内容

    由上面方法创建bridge网络,s1和s2容器能够后互相ping通

    创建s1容器(mysql)

    docker run -id -p 3307:3306 
    --name=s1 
    --network testnet 
    --network-alias s1 
    -v $PWD/conf/myconf.d:/etc/mysql/conf.d 
    -v $PWD/logs:/logs 
    -v $PWD/data:/var/lib/mysql 
    -e MYSQL_ROOT_PASSWORD=root 
    mysql:5.6

    容器端口3306映射宿主机端口3307,对外开放3307端口,若想让外部访问需配置安全组开放3307端口

    docker exec -it s1 bash    # 进入容器内
    mysql -uroot -proot        # 进入mysql数据库 创建库和表

    创建s2容器(python脚本)

    容器创建

    docker run -it 
    --name=my2 
    --network testnet 
    --network-alias my2 
    centos:7 
    bash

    脚本创建

    import pymysql
    
    db = pymysql.connect("s1","root","root","docker",port=3306)
    cursor = db.cursor()
    cursor.execute("SELECT * FROM test")
    data = cursor.fetchone()
    print (data)
    db.close()
    
    # s1      为网络别名 在我们创建容器时创建
    # 3306    容器内的服务端口号
  • 相关阅读:
    转义字符:html、mysql、postgresql、json、php
    php_mysql、php_mysqli 与 pdo_mysql 的区别与选择
    一件小事测试各个搜索引擎:谷歌、bing、有道、百度、搜狗、360
    一键安装lnmp:自动检测最新稳定版、无需root权限
    apache graceful 与 cpu占用率
    互联网创业的准备——版本控制与上线
    201212互联网创意、创业项目整理
    【图】游东天目山
    那些在11gR2中可能惹祸的新特性,一张列表帮助你摆脱升级11gR2带来的烦恼
    【转】卡巴斯基安全公告称甲骨文数据库存在加密漏洞
  • 原文地址:https://www.cnblogs.com/songzhixue/p/12540152.html
Copyright © 2020-2023  润新知