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

该坚持的还是要坚持。

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

本文为本人原创,转载请表明来源: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

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

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

阿里云部署Docker(7)----将容器连接起来的更多相关文章

  1. 阿里云部署Docker(5)----管理和公布您的镜像

    出到这节,我在百度搜索了一下"阿里云部署Docker",突然发现怎么会有人跟我写的一样呢?哦,原来是其它博客系统的爬虫来抓取,然后也不会写转载自什么什么的.所以,我最终明确为什么那 ...

  2. 阿里云部署Docker(2)

    之前有一篇文章讲过在阿里云中安装Docker,相对来说那个是安装.可是安装完之后我们通常会碰到问题. 今天我给大家记录一下我的新的解决过程. 环境还是ubuntu12.04.如果我们已经把内核升级到了 ...

  3. 阿里云部署Docker(3)----指令学习

    通过上两节的学习http://blog.csdn.net/minimicall/article/details/40119177 和http://blog.csdn.net/minimicall/ar ...

  4. 阿里云部署Docker(4)----容器的使用

    通过上一节的学习,我们知道怎样执行docker容器,我们执行了一个普通的,一个后台的,我们还学习了几个指令: docker ps - Lists containers. docker logs - S ...

  5. 阿里云部署Docker(6)----解决删除&lt;none&gt;镜像问题

    转载请注明来源,本博客原创作者为:http://blog.csdn.net/minimicall?viewmode=contents 在Docker使用中,常常会碰到删除镜像不成功.反而让镜像变成了& ...

  6. 阿里云部署Docker(8)----安装和使用redmine

    安装redmine对过程进行管理. 须要说明的是:当你在docker images的时候,会说没连接到xxxx的时候,并且会提示用"docker -d".事实上这仅仅是把docke ...

  7. 阿里云部署Docker(9)----Dockerfile脚本定制镜像

    本文为原创文章.转载需注明转自:http://blog.csdn.net/minimicall? viewmode=contents 技术爱好者都是比較懒的.而docker又是开发人员支持起来的.所以 ...

  8. 阿里云服务器安装Docker并部署nginx、jdk、redis、mysql

    阿里云服务器安装Docker并部署nginx.jdk.redis.mysql 一.安装Docker 1.安装Docker的依赖库 yum install -y yum-utils device-map ...

  9. 阿里云-部署-服务-Docker

    目录 ♫ MusicPlayer Naiveboom - 比较安全 个人阿里云部署的小服务,欢迎使用,服务器资源有限,如果遇到卡顿还请谅解~ 索引: 在线音乐播放器 阅后即焚 ♫ MusicPlaye ...

随机推荐

  1. 普及下Oracle hints语法

    普及下Oracle hints的语法:{DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]... */ 1.hint只能出现在诸如sel ...

  2. UM分享 - 详解

    官网: http://dev.umeng.com 友盟现在发展的很壮大! 有熟为人知的社会化分享\统计分析\消息推送\即时通信\自动更新\多媒体服务等功能, 今天就其中第一项 分享功能, 做出分解. ...

  3. ie8下jquery读取当前点击的标签位置错误,原因是里面有内容写了text-indent:-9999px

    今天写一地图的效果,鼠标点击对应的区域,弹出所点击区域的名字. 因为设计的区域名字有特殊效果,所以,在点击区域里面套了个标签写上区域名字用来识别,但是这个文字呢不同显示在页面上,所以就给 em 加个了 ...

  4. 深入探究JavaScript中的比较问题

    先用最近遇到的几个问题做引子: 1 console.log(null==undefined); //true 2 console.log(null==false);//false 3 console. ...

  5. canvas仿黑客帝国的字符下落

    ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ...

  6. OneAlert 入门(三)——事件分析

    OneAlert 是国内首个 SaaS 模式的云告警平台,集成国内外主流监控/支撑系统,实现一个平台上集中处理所有 IT 事件,提升 IT 可靠性.有了 OneAlert,你可以更快更合理地为事件划分 ...

  7. Sectong日志分析

    http://tech.uc.cn/?p=2866#comments http://blog.sectong.com/blog/hw_bigdata.html

  8. 在 Visual Studio 2010 中创建 ASP.Net Web Service

    第一步:创建一个“ASP.Net Empty Web Application”项目 第二步:在项目中添加“Web Service”新项目 第一步之后,Visual Studio 2010会创建一个仅含 ...

  9. [转贴]JAVA:RESTLET开发实例(二)使用Component、Application的REST服务

    上一篇文章,我们介绍了基于JAX-RS的REST服务,本篇文章我们介绍不基于JAX-RS的模式.JAX-RS其实就是一个简单的 Application服务.和我们接下来介绍的Application基本 ...

  10. windows进程中的内存结构(好多API,而且VC最聪明)

    在阅读本文之前,如果你连堆栈是什么多不知道的话,请先阅读文章后面的基础知识.   接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据.那么这些变量在内存中是如何存放的呢?程序又是如何使用这 ...