美文网首页java高级开发docker
Docker-compose之外部容器连接

Docker-compose之外部容器连接

作者: 老鼠AI大米_Java全栈 | 来源:发表于2018-11-16 17:19 被阅读183次

    docker-compose为我们带来了很多便利,可以批量安装大量的服务,针对大而复杂的系统可以一键部署,真的很方便,但大多数情况下都是一个单独的文件中配置所有的服务,有时需要分开配置,就需要网络配置了。

    Docker-Conpose为应用创建一个网络,Docker-Compose为每个Service创建一个容器,并加入到这个网络中,被网络中的其它容器访问和发现。此容器能够以容器名称作为hostname标识,被其它容器访问。

    在不使用Docker Compose的时候,将两个容器链接起来使用 --link 参数,相对来说比较简单,以 nginx 镜像为例子:

    docker run --rm --name test1 -d nginx  #开启实例test1
    docker run --rm --name test2 --link test1 -d nginx #开启实例test2并与test1建立链接 
    

    这样 test2 与 test1 便建立了链接,就可以在 test2 中使用访问 test1 中的服务了,在docker-compose更简单。

    示例docker-compose创建资源
    docker-compose.yml

    version: '2'
    
    services:
      web:
        build: .
        ports:
          - "8000:8000"
      db:
        image: postgres
    

    在myapp目录使用命令docker-compose up,将执行以下几步:

    • 创建一个名为myapp_default的网络
    • 以服务名(web、db)分别创建两个容器,添加到myapp_default网络中
    • 以服务名(web、db)作为其hostname相互访问,如web可以postgres://db:5432访问db容器

    更新容器
    使用docker-compose up将停止并移除旧容器,重建新容器。
    任何连接到旧容器的(其它容器的)连接将关闭,然后检测条件,根据容器名称查找并重建连接。

    Links
    默认情况下,Docker-Compose下的Servcie之间是可通过服务名称(容器名称,也即hostname)相互访问的。
    links只不过为Service提供了以别名访问其它Service的一种方式。

    容器连接external_links
    我们以Docker-compose一键部署zk集群+dubbo-admin为例,将其拆开部署,如下:
    zk.yml

    version: '3'
    
    services:
      zoo1:
        image: zookeeper:3.4  #zk镜像版本
        container_name: zoo1 
        restart: always
        hostname: zoo1 #容器名
        ports:
          - "2181:2181"  #将左端口绑定到右端口上
        environment:     #配置zk集群环境变量
          ZOO_MY_ID: 1
          ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
    
      zoo2:
        image: zookeeper:3.4
        container_name: zoo2
        restart: always
        hostname: zoo2
        ports:
          - "2182:2181"
        environment:
          ZOO_MY_ID: 2
          ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
    
      zoo3:
        image: zookeeper:3.4
        container_name: zoo3
        restart: always
        hostname: zoo3
        ports:
          - "2183:2181"
        environment:
          ZOO_MY_ID: 3
          ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
    

    启动zk容器docker-compose -f zk.yml up -d

    tomcat.yml

    version: '3'
    
    services:
      dubbo-admin:
        image: dubbo-admin:1.0
        container_name: dubbo-admin
        external_links:
          - zoo1:zk  #外部容器连接
        #links:
        #  - zoo1:zk  #配置容器link名,可理解为别名
        #depends_on:
        #  - zoo1
        #  - zoo2
        #  - zoo3
        ports:
          - 7001:7001 #主机端口:容器端口
        restart: always
    

    启动tomcat容器docker-compose -f tomcat.yml up -d
    注意,tomcat容器依赖于zk容器,所以要先启动zk容器。

    接着我们使用ping来测试下连通性:

    [root@localhost network]# docker exec -it dubbo-admin ping zoo1
    PING zoo1 (192.168.96.3): 56 data bytes
    64 bytes from 192.168.96.3: icmp_seq=0 ttl=64 time=0.128 ms
    64 bytes from 192.168.96.3: icmp_seq=1 ttl=64 time=0.113 ms
    64 bytes from 192.168.96.3: icmp_seq=5 ttl=64 time=0.112 ms
    ^C--- zoo1 ping statistics ---
    [root@localhost network]# docker exec -it zoo1 ping dubbo-admin
    PING dubbo-admin (192.168.96.5): 56 data bytes
    64 bytes from 192.168.96.5: seq=0 ttl=64 time=0.127 ms
    64 bytes from 192.168.96.5: seq=1 ttl=64 time=0.132 ms
    64 bytes from 192.168.96.5: seq=2 ttl=64 time=0.135 ms
    

    从上面得知,两个容器都能ping通。
    学习交流群:64691032

    相关文章

      网友评论

        本文标题:Docker-compose之外部容器连接

        本文链接:https://www.haomeiwen.com/subject/tpbpfqtx.html