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

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

一 创建容器

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

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

MySQL客户端的Dockerfile:

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

根据Dockerfile来创建images

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

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

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

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

二 启动容器

启动MySQL服务端的容器

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

启动MySQL客户端容器

David@MacBook-Pro-3 ~$ docker run --name=mysql_client1 --link=mysql_server:db -i -t hzc/mysql_client mysql -h db -uroot -p1234

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.73 Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>

查看进程

David@MacBook-Pro-3 ~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
213285ec2663 hzc/mysql_client "mysql -h db -uroot -" 2 minutes ago Up 2 minutes mysql_client1
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的环境变量

David@MacBook-Pro-3 ~$ docker exec -it 213285ec2663 bash
[root@213285ec2663 /]# env
HOSTNAME=213285ec2663
DB_NAME=/mysql_client1/db
TERM=xterm
DB_PORT=tcp://172.17.0.2:3306
DB_PORT_3306_TCP_PORT=3306
....
DB_PORT_3306_TCP_PROTO=tcp
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
DB_PORT_3306_TCP_ADDR=172.17.0.2
SHLVL=1
HOME=/root
DB_PORT_3306_TCP=tcp://172.17.0.2:3306
no_proxy=*.local, 169.254/16
DB_ENV_no_proxy=*.local, 169.254/16
LESSOPEN=||/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/usr/bin/env

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

查看hosts

[root@213285ec2663 /]# cat /etc/hosts
127.0.0.1 localhost
....
172.17.0.2 db b5e097fe510d mysql_server
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. PyalgoTrade 计算权重平滑平均价(三)

    本节介绍如何使用收盘价的SMA价格的策略 from pyalgotrade import strategy from pyalgotrade.barfeed import yahoofeed from ...

  2. BZOJ4025: 二分图【线段树分治】【带撤销的并查集】

    Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于是他想考考你. Input ...

  3. C#方法(函数)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. 【算法】通过TreeMap理解红黑树

    本文以Java TreeMap为例,从源代码层面,结合详细的图解,剥茧抽丝地讲解红黑树(Red-Black tree)的插入,删除以及由此产生的调整过程. 总体介绍 Java TreeMap实现了So ...

  5. 【c#】设置Socket连接、接收超时(转)

    用到Socket,发现如果连接错误,比如Connect的端口不对,会造成很长时间的延时,程序就僵在那里,效果很不好: 在网上找到很方便的设置办法,分享如下: Socket.SetSocketOptio ...

  6. WinCE全屏手写输入法

    来源地址:http://www.dwhand.com/?page_id=570 WinCE全屏手写输入法 功能特点: 1.支持手写识别,智能拼音.仓颉.注音.笔画.五笔.ABC等输入模式. 2.支持各 ...

  7. eaccelerator详解

    之前在看书的时候看到一个eaccelerator,以前也没用过 不知道是啥东东,不知道以后会用到不,先mark一下吧 eAccelerator是一个自由开放源码php加速器,优化和动态内容缓存,提高了 ...

  8. 黄聪:将自己开发的插件发布到WordPress官方插件站(转)

    原文作者:我爱水煮鱼 把你的插件发布到 WordPress 官方插件目录是让更多人用到插件的好方法,这样可以让你的插件不仅仅给我们中国人民使用,而且还可以让你的插件给全世界人民使用,想想全世界人民都在 ...

  9. [maven] 实战笔记 - maven 安装配置

    1.下载地址http://maven.apache.org/download.html 2.windows下安装maven(1)下载 apache-maven-3.0-bin.zip 解压到任意目录下 ...

  10. Linux安装imagick扩展出现错误:configure: error: not found. Please provide a path to MagickWand-config or Wand-config program.

    在Linux(CentOS)上安装imagick扩展时,遇到如下错误: checking ImageMagick MagickWand API configuration program... che ...