zoukankan      html  css  js  c++  java
  • 阿里云部署Docker(7)----将容器连接起来

    路遥知马力。日久见人心。恩。

    该坚持的还是要坚持。

    今天看到一个迅雷的师弟去了阿里,祝福他,哎,尽管老是被人家捧着叫大牛。我说不定通过不了人家的面试呢。哎,心有惭愧。

    本文为本人原创,转载请表明来源:http://blog.csdn.net/minimicall

    我们在阿里云上部署Docker服务系列教程已经到了第7节,

    须要回想的同学能够翻看我的博客。

    今天,我们学习一下怎么将docker里面的容器连接起来。

    比如我是一个web服务。我须要用到mysql服务,假设它们属于不同的容器内,假设连接。

    这就是我们这节课要解决的问题。

    连接的第一步是为我们的容器命名

    容器命名

    容器命名是在run的选项里面--name 详细例如以下:

    root@iZ28ikebrg6Z:~# docker run -d -P --name web training/webapp python app.py
    ca9d0b6245e0451e911ac03ef3d2b7748120a55d29c2d8b3cc9d9cd6e4ad0148
    root@iZ28ikebrg6Z:~# ps -l
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    4 S     0 11224 11210  0  80   0 -  5601 wait   pts/1    00:00:00 bash
    0 R     0 11907 11224  0  80   0 -  2121 -      pts/1    00:00:00 ps
    root@iZ28ikebrg6Z:~# docker ps -l
    CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS              PORTS                     NAMES
    ca9d0b6245e0        training/webapp:latest   "python app.py"     15 seconds ago      Up 14 seconds       0.0.0.0:49153->5000/tcp   web                 
    root@iZ28ikebrg6Z:~# 
    我们能够具体的了解这个容器的底层信息:

    root@iZ28ikebrg6Z:~# docker inspect --help
    
    Usage: docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...]
    
    Return low-level information on a container or image
    
      -f, --format=""    Format the output using the given go template.
    root@iZ28ikebrg6Z:~# docker inspect -f "{{.Name}}" ca9
    /web
    root@iZ28ikebrg6Z:~# 
    须要注意的是,容器的名字须要是唯一的。不可以有冲突。假设你想容器停止后就放弃这个名字,那么你可以在执行的时候增加选项 --rm


    容器连接

    容器连接之后就能够相互交流数据,比如包括web的容器,它能够连接到一个包括数据库的容器,然后由数据容器给它提供数据存储。

    连接是--link name:alias  当中name是我们要连接的容器,比方一个数据库容器mysql,而alias是这个连接的名称。

    我们先运行命令。然后解释:

    root@iZ28ikebrg6Z:~# docker stop web
    web
    root@iZ28ikebrg6Z:~# docker images
    REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    sameersbn/redmine      latest              f0bec095f291        6 hours ago         614.6 MB
    sameersbn/gitlab       latest              bf5c375d9057        3 days ago          635.1 MB
    sameersbn/postgresql   latest              24a6064fa4cd        11 days ago         142.1 MB
    training/webapp        latest              31fa814ba25a        4 months ago        278.8 MB
    sameersbn/redmine      2.4.2               b95b8046d47c        8 months ago        1.327 GB
    root@iZ28ikebrg6Z:~# docker run -d --name db sameersbn/postgresql
    a9dbca9857fddbe366ce76909943e856eecc12df27886830e43fe5c91a53abc7
    root@iZ28ikebrg6Z:~# docker ps
    CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS              PORTS               NAMES
    a9dbca9857fd        sameersbn/postgresql:latest   "/start"            5 seconds ago       Up 3 seconds        5432/tcp            db                  
    root@iZ28ikebrg6Z:~# docker rm -f web
    web
    root@iZ28ikebrg6Z:~# docker run -d -P --name web --link db:db training/webapp python app.py
    ff990b53706d0a1277c1ba37b274c397ba906ba8ea28e9d9b57e78f84ef12d93
    root@iZ28ikebrg6Z:~# docker ps --no-trunc | awk '{print $NF}'
    NAMES
    web
    db,web/db
    root@iZ28ikebrg6Z:~# 

    我们连接的是sameersbn/postgresql 这也是个数据库,是我不小心下载下来的,没有mysql。拿着用吧。会出错再说。

    好,连是连接起来了。但是怎样交互数据呢?由于到如今位置我们仅仅是看到多了个--link 选项而已,假如我要使用数据库。我总得增删改查啊。

    docker提供两种方式,一种是环境变量,一种是改/etc/hosts

    环境变量

    当一个连接产生之后,docker首先会为每一个连接产生一个环境变量<alias>_NAME。比如刚才的连接 --link db:db,则有

    db_NAME=/web/db
    还有,一些源容器暴露的port。

    这部分我直接贴官网的说明,也许更可以讲清楚。大家自行理解。


    <name>_PORT_<port>_<protocol> will contain a URL reference to the port. Where <name> is the alias name specified in the --link parameter (e.g. webdb), <port> is the port number being exposed, and <protocol> is either TCP or UDP. The format of the URL will be: <protocol>://<container_ip_address>:<port> (e.g. tcp://172.17.0.82:8080). This URL will then be split into the following 3 environment variables for convinience:
    <name>_PORT_<port>_<protocol>_ADDR will contain just the IP address from the URL (e.g. WEBDB_PORT_8080_TCP_ADDR=172.17.0.82).
    <name>_PORT_<port>_<protocol>_PORT will contain just the port number from the URL (e.g. WEBDB_PORT_8080_TCP_PORT=8080).
    <name>_PORT_<port>_<protocol>_PROTO will contain just the protocol from the URL (e.g. WEBDB_PORT_8080_TCP_PROTO=tcp).

    环境变量设置的方法为:

     $ sudo docker run --rm --name web2 --link db:db training/webapp env
        . . .
        DB_NAME=/web2/db
        DB_PORT=tcp://172.17.0.5:5432
        DB_PORT_5432_TCP=tcp://172.17.0.5:5432
        DB_PORT_5432_TCP_PROTO=tcp
        DB_PORT_5432_TCP_PORT=5432
        DB_PORT_5432_TCP_ADDR=172.17.0.5

    还有还有一种方法是更改目标容器中的hosts文件,在这个文件里增加源容器

    /etc/hosts


    详细例如以下:

    $ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
    root@aed84ee21bde:/opt/webapp# cat /etc/hosts
    172.17.0.7  aed84ee21bde
    . . .
    172.17.0.5  db
    可以实验一下是否可以联通

    root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping
    root@aed84ee21bde:/opt/webapp# ping db
    PING db (172.17.0.5): 48 data bytes
    56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms
    56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms
    56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms
    就算源容器重新启动。它也会自己主动更新

    $ sudo docker restart db
    root@aed84ee21bde:/opt/webapp# cat /etc/hosts
    172.17.0.7  aed84ee21bde
    . . .
    172.17.0.9  db


    好。容器的连接就到这里。

    到实战的时候记得有这么回事就能够。




  • 相关阅读:
    【笔记】 寻址方式
    今日思考之 20200614:java 中 null 是否对 gc 有帮助?
    分布式唯一ID生成方案对比分析 笔记
    请不要再称数据库是CP或者AP——CAP的误导(短板)和它的使命
    延迟初始化中的 双重检查模式 和 延迟占位类模式 你都用对了吗?
    redis bitmap
    RabbitMQ 使用 Policies HTTP API 绑定和解绑 DLX
    spring boot 自动装配的实现原理和骚操作,不同版本实现细节,debug 到裂开......
    netty 学习笔记三:大跃进,使用 netty 实现 IM 即时通讯系统
    一道 Java 方法传值面试题——Java方法传值的值传递概念和效果 + Integer 缓存机制 + 反射修改 private final 域
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5347333.html
Copyright © 2011-2022 走看看