zoukankan      html  css  js  c++  java
  • 容器互联

    除了端口映射之外,容器互联是另一种跟容器应用交互的方式。它会在源容器和接收容器之间建立一个隧道,接收容器可以看到源容器指定的信息。

    要实现容器互联,需要为容器指定一个好听的名字,通过--name来制定,若不指定,docker会随机生成一个容器的名称,但这不利于记忆。

    $ docker run -d myfirstapp python app.py
    95d21066a81ad3631c4ce0bcbbab867bf46ac7304034b608221bf623f8a1246a
    $ docker run -d --name myfirst myfirstapp python app.py ##为容器指定名字
    fe7b63a08819f92b8ddb6d66b26bbe77d20ae3a88ae01a03dc99d4e0a70d9f0c
    $ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    fe7b63a08819        myfirstapp          "python app.py"     3 seconds ago       Up 3 seconds        80/tcp              myfirst
    95d21066a81a        myfirstapp          "python app.py"     19 seconds ago      Up 18 seconds       80/tcp              trusting_edison

    docker inspect可以查看容器的详细信息。查看容器名称可以使用:

    $ docker inspect -f "{{.Name}}" myfirst
    /myfirst

    不指定-f "{{.Name}}"则会显示所有的信息:docker inspect myfirst
    若一个容器是临时的,运行完成之后要自动删除,需要加上--rm标记。

    容器互联:使用--link参数,可以让容器之间安全的进行交互

    a、下载postgres镜像

    $ docker pull postgres:9.4

    b、新建一个数据库容器

    $ docker run -d --name mydb postgres:9.4

    c、新建一个web容器和postgres容器互联

    $ docker run -d -P --name myweb --link mydb:db myfirstapp python app.py

    --link表示建立容器互联,参数为name:alias,name是要链接的容器名称,alias是我们取得别名

    d、查看新建的容器

    $ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
    e993cc312bb2        myfirstapp          "python app.py"          3 seconds ago       Up 2 seconds        0.0.0.0:32774->80/tcp   myweb
    ee203462405d        postgres:9.4        "docker-entrypoint..."   16 seconds ago      Up 15 seconds       5432/tcp                mydb

    通过--link的方式,是myweb和mydb建立了链接,我们可以查看下web容器的环境变量

    $ docker run --rm --name myweb2 --link mydb:db myfirstapp env
    PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    HOSTNAME=18fb6fd9da67
    DB_PORT=tcp://172.17.0.2:5432
    DB_PORT_5432_TCP=tcp://172.17.0.2:5432
    DB_PORT_5432_TCP_ADDR=172.17.0.2
    DB_PORT_5432_TCP_PORT=5432
    DB_PORT_5432_TCP_PROTO=tcp
    DB_NAME=/myweb2/db
    DB_ENV_GOSU_VERSION=1.10
    DB_ENV_LANG=en_US.utf8
    DB_ENV_PG_MAJOR=9.4
    DB_ENV_PG_VERSION=9.4.17-1.pgdg80+1
    DB_ENV_PGDATA=/var/lib/postgresql/data
    LANG=C.UTF-8
    GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D
    PYTHON_VERSION=3.6.4
    PYTHON_PIP_VERSION=9.0.3
    NAME=HELLO
    HOME=/root

    可以看到环境变量中以要链接的容器的名字的别名的大写作为前缀,和mydb建立连接之后,除了myweb容器环境变量发生了变化,在myweb容器的hosts文件也发生了变化,我们可以看下

    $ docker run -it --rm --link mydb:db myfirstapp /bin/bash
    $ cat /etc/hosts
    127.0.0.1    localhost
    ::1    localhost ip6-localhost ip6-loopback
    fe00::0    ip6-localnet
    ff00::0    ip6-mcastprefix
    ff02::1    ip6-allnodes
    ff02::2    ip6-allrouters
    172.17.0.2    db ee203462405d mydb ####mydb ip
    172.17.0.4    a378870c0316  ####myweb ip

    这里面有两个ip,一个是web的,一个是db的,我们可以用ping命令查看这个两个ip之间能否ping通

    $ ping db
    PING db (172.17.0.2): 56 data bytes
    64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.229 ms
    64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.089 ms
    2 packets transmitted, 2 packets received, 0% packet loss
    round-trip min/avg/max/stddev = 0.089/0.159/0.229/0.070 ms
    
    $ ping mydb
    PING db (172.17.0.2): 56 data bytes
    64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.138 ms
    64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.089 ms
    2 packets transmitted, 2 packets received, 0% packet loss
    round-trip min/avg/max/stddev = 0.089/0.114/0.138/0.025 ms
    
    $ ping 172.17.0.2
    PING 172.17.0.2 (172.17.0.2): 56 data bytes
    64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.146 ms
    64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.086 ms
    64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.087 ms
    3 packets transmitted, 3 packets received, 0% packet loss
    round-trip min/avg/max/stddev = 0.086/0.106/0.146/0.028 ms

    建立链接没问题!
    我们启动mydb容器的时候,没有通过-p指定端口,避免了数据库端口暴露在外部网络,这样很安全。

  • 相关阅读:
    混淆
    【虚拟DOM】√
    fn
    notebook
    sourceMappingURL
    十进制转换为十六进制
    关于this和super的区别
    类中访问级别
    Java中字符串解析
    IWorkspace操作
  • 原文地址:https://www.cnblogs.com/linjiqin/p/8678959.html
Copyright © 2011-2022 走看看