docker中两个容器间的互访

在前几篇文章中,我们讨论了如何在Ubuntu14.04(64位)中安装docker,以及如何在docker中部署一个apache服务器并在外部电脑中访问该服务器,和在docker中部署

一个mysql数据库并在外部电脑中访问这个数据库。

下面来讨论下docker的容器间的互访,主要以两个容器间的mysql数据库互访为例。


有时候,两个启动的容器之间是需要交流的,比如我们在一个容器中运行了一个apache服务器,上面有一个网站,然后网站的数据库我们就可以部署在另外一个容器中。或者两个容器都部署了数据库,然后这两个数据库之间需要交流。

下面我们以一个容器访问另一个容器的mysql数据库为例。

容器间的访问主要是通过—link参数来进行的。

首先按照前面的教程在一个镜像中安装好xampp。

然后启动这个镜像,并将启动的容器命名为server,作为mysql服务器:

sudo docker run –i –t –P –-name=server ubuntu2 /bin/bash

(注意P是大写)

进入到容器server的命令行后,启动mysql

/opt/lampp/lampp start

在本机电脑中打开另一个命令行终端,运行另外一个容器,作为mysql客户端,并访问容器server中的mysql数据库:

sudo  docker run –i –t –P  --link=server:db –name=client ubuntu2 /bin/bash

(注意P是大写)

--link=server:db表示把刚才的server容器重新命名成db,然后你就可以在上面的client容器中访问到server容器了。

在容器client命令行中,启动mysql:

/opt/lampp/lampp  start
接着访问server容器中的mysql数据库
mysql  -h db –u root

(注意-h后面的值要对应link=server:db中的值)

到这里就,client就连接上了server容器的mysql数据库了。

看有哪些数据库:

show databases;

然后新建一个数据库:

create  database hehe;

然后回到server容器中的命令行,进入msyql:

mysql –u root

查看有哪些数据库:

show databases;

此时应该可以看到hehe。表明client容器中连接上的确实是server中的mysql数据库。


到这里,对容器间的交流就结束了。


常见问题:

1. 出现 lost connection to mysql server的错误:

解决方法:

首先进入到目录(如果你的mysql是通过xampp安装的)/opt/lampp/etc:


cd /opt/lampp/etc

然后用vim 打开my.cnf,找到这一行:

bind-address = 127.0.0.1

将它注释掉,如果没有这行则忽略。

然后找到[mysqld]部分的参数,在配置后面建立一个新行,添加下面这个参数:

skip-name-resolve
保存并退出。

接着重启xampp:

/opt/lampp/lampp restart

到这里应该就解决了。

如果你的Mysql不是通过xampp安装的,则my.cnf一般在一般只会存放在/etc/my.cnf或者/etc/mysql/my.cnf下;

对my.cnf的修改跟上面的一样,然后重启mysql:

/etc/init.d/mysql restart

2. Host ip is not allowed to connet to this mysql server之类的错误

解决方法:

进入mysql:

mysql -u root

然后对其他用户授权:


GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

到这里应该就解决了。

如果还解决,请参考这里:http://joinyo.iteye.com/blog/1489380


Docker dind(Docker in Docker)是运行在Docker容器Docker引擎。在使用Docker dind时,可以创建多个容器,并且这些容器可以相互通信。 要使两个Docker dind容器相互通信,可以使用Docker网络。Docker网络允许容器进行通信和数据交换,即使这些容器运行在不同的Docker宿主机上也可以实现。 以下是使用Docker网络实现两个Docker dind容器相互通信的步骤: 1. 创建一个Docker网络 ``` docker network create my-network ``` 2. 启动第一个Docker dind容器,并将其连接到my-network网络 ``` docker run --privileged --name=dind1 --network=my-network -d docker:dind ``` 3. 启动第二个Docker dind容器,并将其连接到my-network网络 ``` docker run --privileged --name=dind2 --network=my-network -d docker:dind ``` 4. 在第一个Docker dind容器创建一个新的容器,并将其连接到my-network网络 ``` docker exec -it dind1 docker run --name=container1 --network=my-network -d nginx ``` 5. 在第二个Docker dind容器创建一个新的容器,并将其连接到my-network网络 ``` docker exec -it dind2 docker run --name=container2 --network=my-network -d nginx ``` 现在,container1和container2容器可以通过my-network网络相互通信。要在container1访问container2,可以使用容器名称作为主机名: ``` docker exec -it dind1 curl http://container2 ``` 要在container2访问container1,可以使用容器名称作为主机名: ``` docker exec -it dind2 curl http://container1 ``` 注意:如果使用的是Docker for Mac或Docker for Windows,则需要在Docker设置启用Docker网络。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值