Docker 容器通信

前言

在docker低版本中,容器间的通信通常有以下三种方式:

  1. 通过使用容器的IP地址来通信。
  2. 通过宿主机的IP加上容器暴露出的端口号来通信。
  3. 通过docker的link机制可以通过一个name来和另一个容器通信

本章主要来讲解一下这三种连接方式。实验容器为 python2.7 以及 mysql5.7,可以直接从dockerHub上pull。

使用容器IP通信

首先启动MySQL容器和python容器。关于MySQL容器的配置前一篇有详细的解释。

启动MySQL容器:

1
$ docker run --name mysql5.7.1 -p 3306:3306 -v /my/mysql/datadir:/var/lib/mysql -v /my/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

进入到该容器,查看容器的IP地址:

1
$ docker exec -it mysql5.7.1 /bin/bash

为容器安装ifconfig以及ping,不然会报command not find

1
2
3
$ apt-get update
$ apt-get install net-tools #ifconfig
$ apt-get iputils ping

使用ifconfig查看IP地址

1
$ ifconfig

你想输入的替代文字

可以看到MySQL容器的IP地址是172.17.0.2

启动python容器

启动python2.7容器:

1
$ docker run -it python:2.7 /bin/bash

安装好ifconfig以及ping,测试是否能ping到数据库容器:

1
$ ping 127.17.0.2

你想输入的替代文字

安装好MySQL-python模块:

1
2
apt-get install python-dev #安装python-dev,否则后面安装mysql模块报错
pip install MySQL-python #安装mysqldb模块

创建测试连接的test_connection.py文件:

1
vim test_connection.py  # (没有vim,使用apt-get install vim )

你想输入的替代文字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#coding=utf-8
import MySQLdb as mdb
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

def connectionDB():
con_code = mdb.connect(host='172.17.0.2', user='root', passwd='123456', db='test',
charset='utf8')
cur_code = con_code.cursor()
selectSQL = "select name from t_user"
cur_code.execute(selectSQL)
con_code.commit()
rows = cur_code.fetchall()
for row in rows:
print row[0]

if __name__ == '__main__':
#connectionDB()
print('start')

在该容器下运行 test_connection.py :

1
$ python test_connection.py

你想输入的替代文字

通过宿主机的IP通信

在宿主机上查看IP地址,可以看到:

宿主机IP:172.17.0.1
MySQL容器IP:172.17.0.2
python容器IP:172.17.0.3

修改test_connection.py,将地址改成宿主机的IP,发现也能运行成功!

你想输入的替代文字

Link机制

通过docker的link机制可以通过一个name来和另一个容器通信,link机制方便了容器去发现其它的容器并且可以安全的传递一些连接信息给其它的容器。就算不知道要通信间的容器IP,也可以使用--link name:alias来保证通信。

启动python容器:

1
$ docker run -it --link mysql5.7.1:dblink python2.7 /bin/bash

可以使用mysql5.7.1 或者dblink来代替 172.17.0.2ping mysql5.7.1/dblink 测试:

你想输入的替代文字

修改test_connection.py:

你想输入的替代文字

运行py文件测试:

你想输入的替代文字

通信成功!!

三种通信的比较

使用容器的IP:会导致IP地址的硬编码,不方便迁移,并且容器重启后IP地址会改变,除非使用固定的IP。

使用宿主机的IP:通信方式比较单一,只能依靠监听在暴露出的端口的进程来进行有限的通信。

link机制:link机制方便了容器去发现其它的容器并且可以安全的传递一些连接信息给其它的容器。