我们在使用Docker的时候,经常可能需要连接到其他的容器,比如:web服务需要连接数据库。按照往常的做法,需要先启动数据库的容器,映射出端口来,然后配置好客户端的容器,再去访问。其实针对这种场景,Docker提供了--link 参数来满足。

这里使用数据库服务器和客户端的例子来介绍下--link的用法。

一 创建容器

这里需要创建MySQL服务端和客户端的容器

MySQL 服务端的Dockerfile:
  1. FROM centos:centos6
  2. MAINTAINER David "xx@xx.com"
  3. RUN yum install -y mysql-server mysql
  4. RUN /etc/init.d/mysqld start
  5. RUN mysql -e "grant all privileges on *.* to 'root'@'%' identified by '1234';"
  6. RUN mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by '1234';"
  7. EXPOSE 3306
  8. CMD ["/usr/bin/mysqld"]

MySQL客户端的Dockerfile:

  1. FROM centos:centos6
  2. MAINTAINER David "xx@xx.com"
  3. RUN yum install -y mysql

根据Dockerfile来创建images

  1. David@MacBook-Pro-3 ~$ docker build -t hzc/mysql_server /path/mysql_server/Dockerfile
  2. David@MacBook-Pro-3 ~$ docker build -t hzc/mysql_client /path/mysql_client/Dockerfile

image构建执行结束之后,执行docker image|greo hzc,可以看到:

  1. David@MacBook-Pro-3 ~$ docker image|grep hzc
  2. hzc/mysql_client latest 62cfe52e02bf 2 days ago 289 MB
  3. hzc/mysql_server latest 83c64aba0805 2 days ago 377.9 MB

二 启动容器

启动MySQL服务端的容器

  1. David@MacBook-Pro-3 ~$ docker run -d -P --name=mysql_server hzc/mysql_server
  2. David@MacBook-Pro-3 ~$ b5e097fe510d8f258dd82c48a2f6aa4c279e227c4472e42d3e9956ac419ae73c

启动MySQL客户端容器

  1. David@MacBook-Pro-3 ~$ docker run --name=mysql_client1 --link=mysql_server:db -i -t hzc/mysql_client mysql -h db -uroot -p1234
  2. Welcome to the MySQL monitor. Commands end with ; or \g.
  3. Your MySQL connection id is 1
  4. Server version: 5.1.73 Source distribution
  5. Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
  6. Oracle is a registered trademark of Oracle Corporation and/or its
  7. affiliates. Other names may be trademarks of their respective
  8. owners.
  9. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  10. mysql>

查看进程

  1. David@MacBook-Pro-3 ~$ docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 213285ec2663 hzc/mysql_client "mysql -h db -uroot -" 2 minutes ago Up 2 minutes mysql_client1
  4. b5e097fe510d hzc/mysql_server "/usr/bin/mysqld_safe" 4 minutes ago Up 4 minutes 0.0.0.0:32768->3306/tcp mysql_server

可以看到多了一个参数配置--link=mysql_server:db , 是告诉当前容器需要使用mysql_server容器,并命名为db。这里db就是mysql_server容器的别名。在后面连接数据库的时候是可以直接使用mysql -h db -uroot -p1234来连接mysql数据库。

三 原理

在这里可以看到创建了两个容器,mysql_client1和mysql_server。容器mysql_client1连接到了mysql_server,建立了一种父子关系。

查看父容器mysql_client1的环境变量

  1. David@MacBook-Pro-3 ~$ docker exec -it 213285ec2663 bash
  2. [root@213285ec2663 /]# env
  3. HOSTNAME=213285ec2663
  4. DB_NAME=/mysql_client1/db
  5. TERM=xterm
  6. DB_PORT=tcp://172.17.0.2:3306
  7. DB_PORT_3306_TCP_PORT=3306
  8. ....
  9. DB_PORT_3306_TCP_PROTO=tcp
  10. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  11. PWD=/
  12. DB_PORT_3306_TCP_ADDR=172.17.0.2
  13. SHLVL=1
  14. HOME=/root
  15. DB_PORT_3306_TCP=tcp://172.17.0.2:3306
  16. no_proxy=*.local, 169.254/16
  17. DB_ENV_no_proxy=*.local, 169.254/16
  18. LESSOPEN=||/usr/bin/lesspipe.sh %s
  19. G_BROKEN_FILENAMES=1
  20. _=/usr/bin/env

可以看到已经得到了容器mysql_server的环境变量,给出的是3306的端口,而不是映射出来的端口。

查看hosts

  1. [root@213285ec2663 /]# cat /etc/hosts
  2. 127.0.0.1 localhost
  3. ....
  4. 172.17.0.2 db b5e097fe510d mysql_server
  5. 172.17.0.3 213285ec2663

可以看到两条hosts的配置,一个是数据库的ip对应的别名,容器ID,容器名称。另外一个是客户端对应的容器ID。所以这里可以使用别名连接到数据库服务端。

作者:seezero
链接:http://www.jianshu.com/p/13752117ff97
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Docker使用link建立容器之间的连接的更多相关文章

  1. Docker学习笔记 - Docker容器之间的连接

    学习目标: 容器之间可以相互连接访问:: --link redis:redisAlias 准备工作 FROM ubuntu:14.04 RUN apt-get install -y ping RUN  ...

  2. centos7下安装docker(12.3容器之间的连通性)

    我们接着盗图,如下: 在这张图上,可以看到,如果两个容器使用同一个bridge,那么两个容器之间是互相能通的 可以看到两个容器在同一个bridge下是可以互相ping通的 当两个容器在不同的bridg ...

  3. ALSA声卡驱动中的DAPM详解之五:建立widget之间的连接关系

    前面我们主要着重于codec.platform.machine驱动程序中如何使用和建立dapm所需要的widget,route,这些是音频驱动开发人员必须要了解的内容,经过前几章的介绍,我们应该知道如 ...

  4. Docker 数据卷与容器互联

    Docker是基于Go语言实现的开源容器项目,Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制, ...

  5. 深入理解docker的link机制

    https://yq.aliyun.com/articles/55912 摘要: 什么是docker的link机制 同一个宿主机上的多个docker容器之间如果想进行通信,可以通过使用容器的ip地址来 ...

  6. Docker端口映射与容器互联

    Docker提供了两个功能来满足访问的基本需求:一是允许映射容器内应用的服务端口到本地宿主主机:另一个是互联机制实现多个容器间通过容器名来快速实现访问. 一.端口映射实现访问容器 当容器中运行一些网络 ...

  7. docker——端口映射与容器互联

    在生产环境中,单个服务往往是独立的,但是服务与服务之间往往是相互依赖的,这样对于容器来说,容器之间就需要相互访问.除了网络访问之外,docker还提供了另外两种方式来满足服务的访问. 一:允许映射容器 ...

  8. Docker使用Link与newwork在容器之间建立连接

    一,使用 --link容器互联 docker 默认使允许container 互通的(通过-icc=false 关闭互通)同一个宿主机上的多个docker容器之间如果想进行通信,可以通过使用容器的ip地 ...

  9. 在docker for windows建立mssql容器后,ssms连接mssql出现错误号码18456的问题

    在docker for windows建立mssql容器后,ssms连接mssql出现错误号码18456的问题 笔者提供一个可能会没考虑到的点. 请检查本机是否安装了mssql!!! 请检查本机的ms ...

随机推荐

  1. Jenkins上War文件部署实战

    War文件部署 1.jenkins需要安装Deploy Plugin插件:在[系统管理]-[插件管理]下,如果没有安装,则在可选插件下找到该插件,然后安装(如图是1.5版本安装好的截图) 2.在构建的 ...

  2. c++的关联容器入门(map and set)

    目录 std::map std::set C++的关联容器主要是两大类map和set 我们知道谈到C++容器时,我们会说到 顺序容器(Sequence containers),关联容器(Associa ...

  3. MySQl中隔离级别和悲观锁乐观锁

    1.MySql的事物支持 MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关: MyISAM:不支持事务,用于只读程序提高性能 InnoDB:支持ACID事务.行级锁.并发 Ber ...

  4. 20145237 Exp2 后门原理与实践

    20145237<网络对抗>Exp2 后门原理与实践 Windows获得Linux Shell 在Windows下,先使用ipconfig指令查看本机IP: 输入ncat.exe -l - ...

  5. 一个Android开发妹子的找工作心酸史

    阿里:实习二面被KO 1,人生接到的第一个电话面试来自大家都说好的阿里,心情激动,说话颤抖,本以为没有戏,然而第二天接到了二面的电话有点小激动.然后就是被ko了,死的原因很简单,那时候单纯的自己什么都 ...

  6. 服务器大量TIME_WAIT和CLOSE_WAIT的原因及解决办法

    Linux服务器下查看网络连接的状态 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 它会显示例如下面的信息: ...

  7. UVA之1121 - Subsequence

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/SunnyYoona/article/details/25840365 [题目] A sequence ...

  8. Centos 6 下安装 erlang 手记

    基于openfire的IM项目已经成功上线,接下来的计划准备開始调研 ejabberd.  ejabberd  是基于erlang开发的.那么就先从搭建 erlang环境開始吧. 选择的操作系统为Ce ...

  9. 纯php实现中秋博饼游戏(2):掷骰子并输出结果

    这篇是纯php实现中秋博饼游戏系列博文(2) 上文是:纯php实现中秋博饼游戏(1):绘制骰子图案 http://www.cnblogs.com/zqifa/p/php-dice-1.html要纯ph ...

  10. Linux共享对象之编译参数fPIC(转)

    最近在看Linux编程的基础知识,打算对一些比较有趣的知识做一些汇总备忘,本文围绕fPIC展开,学习参考见文末. 在Linux系统中,动态链接文件称为动态共享对象(DSO,Dynamic Shared ...